YOLO+PaddleOCR实现车牌检测识别

本篇文章将会使用Keras-YOLOV3来训练自己的车牌检测的模型,结合PaddleOCR来识别车牌,最终使用OpenCV将其整体进行串联。

技术简介

Keras

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。
Keras中文网

YOLOV3

YOLO是“You Only Look Once”的简称,它虽然不是最精确的算法,但在精确度和速度之间选择的折中,效果也是相当不错。YOLOv3借鉴了YOLOv1和YOLOv2,虽然没有太多的创新点,但在保持YOLO家族速度的优势的同时,提升了检测精度,尤其对于小物体的检测能力。YOLOv3算法使用一个单独神经网络作用在图像上,将图像划分多个区域并且预测边界框和每个区域的概率。
Keras-YOLOV3 GitHub地址

PaddleOCR

PaddleOCR是百度飞桨下的一款OCR工具库,使用简单,识别率高。
飞桨PaddleOCR官网地址

实现过程

整体的实现过程大致为,克隆Keras-YOLOV3源代码–>下载YOLOV3预训练权重–>将YOLOV3预训练权重转为Keras所需要的.h5类型的模型文件–>标注数据集–>训练模型–>测试模型。以下将为大家详细介绍实现过程。

环境搭建

Python环境

我这里使用的是Anaconda3,Python3.6的版本,可以在Anaconda官网上根据不同的系统环境,下载相应的软件版本。基本上都是一键安装,所以安装过程就不在这里赘述了。
安装完成后,可以使用

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

添加清华源,方便后面下载依赖使用。

克隆Keras-YOLOV3

Keras-YOLOV3 GitHub地址如果无法使用Github克隆的话,这里我已经将完整的Keras-YOLOV3的代码拷贝到了Gitee上,方便大家克隆:Keras-YOLOV3 Gitee地址

git clone https://github.com/qqwweee/keras-yolo3.git

安装所需依赖

首先我们需要进入到上一步克隆下来的keras-yolo3目录中:

cd keras-yolo3

使用conda创建虚拟环境

conda create -n keras-yolov3 python==3.7
# 激活虚拟环境
conda activate keras-yolov3

安装所需依赖
如果有GPU的同学请下载tensorflow-gpu的版本

pip install tensorflow==1.13.1 keras==2.2 pillow opencv-python==3.4.2.17 matplotlib==2.2.2 numpy==1.16.4 pyparsing==2.4.7 'h5py<3.0.0' -i https://pypi.douban.com/simple

下载yolov3权重,转换成.h5文件

wget https://pjreddie.com/media/files/yolov3.weights
# 下载完后执行,将yolov3文件转换成.h5文件
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

转换完成后,会在model_data/下生成一个yolo.h5的文件

使用PyCharm打开

配置项目的Interpreter

选择刚刚创建的虚拟环境,一般情况下会在anaconda3/envs目录下,根据实际情况进行配置。

目前的目录结构,且没有任何报错,如果依赖报错,请查验以上步骤

环境测试

在keras-yolo3跟目录下创建一个img目录,并放上一张自己的图片,yolov3,目前已有检测的对象包括:
飞机,自行车,汽车,马,牛等等。
在这里,我放了一张马的图片,进行环境的测试。

在根目录下编写一个测试文件:yolo_test.py

from yolo import YOLO
from PIL import Imageyolo = YOLO()image = Image.open('img/horse.jpeg')
rel_image = yolo.detect_image(image)
rel_image.show()yolo.close_session()

测试结果:
可以看到以下测试结果,检测出了两匹马,并且置信度都为1,很准确。

训练数据集

创建目录结构

mkdir -p VOCdevkit/VOC2007/Annotations VOCdevkit/VOC2007/ImageSets/Main VOCdevkit/VOC2007/JPEGImages

准备数据集

可以在百度图片中下载汽车并且带有车牌的图片,并将图片放到VOCdevkit/VOC2007/JPEGImages目录下。
编写脚本对图片数据预处理,把所有图片的后缀改成.jpg格式,并将图片统一转为(416, 416)的大小格式,因为yolov3模型默认输入的图片尺寸为(416, 416)。
convert_img.py

import os
import glob
import cv2img_paths = glob.glob('VOCdevkit/VOC2007/JPEGImages/*')for (index, img_path) in enumerate(img_paths):img = cv2.imread(img_path)resize = cv2.resize(img, (416, 416), cv2.INTER_AREA)img_dir = img_path[:img_path.rindex('/') + 1]resize_img_path = '{}car_{}.jpg'.format(img_dir, index)cv2.imwrite(resize_img_path, resize)os.remove(img_path)

数据标注

使用labelImg对数据进行标注,安装过程就不再赘述了,请自行查找。
使用快捷键w,快速创建选区,并填写label的名称

使用快捷键d,对标注存储并且下一张,将标注文件保存到VOCdevkit/VOC2007/Annotations目录下

以下数据以此类推,我这里准备了84张汽车的图片,进行标注。

划分数据文件

编写脚本划分train.txt,test.txt,val.txt数据label,只包含图片文件名部分,8:1:1;生成完之后放到VOCdevkit\VOC2007\ImageSets\Main目录下

import globdef gen_data_txt(data_list, file_name):with open('VOCdevkit/VOC2007/ImageSets/Main/{}'.format(file_name), 'w') as f:for data in data_list:f.write('{}\n'.format(data[data.rindex('/') + 1:data.rindex('.')]))img_paths = glob.glob('/Users/junweiwang/workerspace/keras-yolo3/VOCdevkit/VOC2007/JPEGImages/*')train_data_paths = img_paths[:int(len(img_paths) * 0.8)]
test_data_paths = img_paths[len(train_data_paths):len(train_data_paths) + int((len(img_paths) - len(train_data_paths)) / 2)]
val_data_paths = img_paths[len(train_data_paths) + len(test_data_paths):]gen_data_txt(train_data_paths, 'train.txt')
gen_data_txt(test_data_paths, 'test.txt')
gen_data_txt(val_data_paths, 'val.txt')

文件生成后,将文件末尾的空行删掉。
运行voc_annotation.py文件注意在训练自己的数据集时,需要将里面的classes换成自己的,例如,“classes = [“car_license”]”,其他的不需要改变。

执行完成后会在根目录下,生成2007_train.txt,2007_test.txt,2007_val.txt三个文件,需要将文件名中的2007_部分删除,如:

修改model_data

1.修改“根目录下\model_data”的目录中“coco_classes.txt、
voc_classes.txt”这两个文件,将 car_license 类别填入进去,并且删除其它的label。

开始训练

由于我的机器没有GPU,所以是租用了GPU的服务器,来训练车牌检测的模型。
也是我意外发现,找到了这个GPU租用服务的平台。矩池云官网,有需要的可以看看,在此声明,没有任何利益关系。
在根目录下创建logs\000目录,用来存放训练完成的权重文件
将model_data下的yolo.h5文件重命名为yolo_weights.h5
调整训练参数batch_size,epochs,由于我这里的数据集只有八十多张,比较少,所以把batch_size=1,这里的epochs暂时就不做调整了。
最后执行根目录下的train.py进行训练,这个过程比较长,请耐心等待。


最终达到loss:13.1307–val_loss:13.5433不再下降,提前结束训练,在logs/000目录下有每个阶段和最终的权重文件,将trained_weights_final.h5放到跟目录的model_data中

模型测试

找一张带有车牌的汽车图片进行测试,需要将yolo.py文件中的model_path改为刚刚训练好的模型。

_defaults = {"model_path": 'model_data/trained_weights_final.h5',"anchors_path": 'model_data/yolo_anchors.txt',"classes_path": 'model_data/coco_classes.txt',"score" : 0.3,"iou" : 0.45,"model_image_size" : (416, 416),"gpu_num" : 1,}

创建一个测试脚本

from yolo import YOLO
from PIL import Imageyolo = YOLO()image = Image.open('img/car02.jpeg')
rel_image = yolo.detect_image(image)
rel_image.show()yolo.close_session()

可以看到车牌位置已经被检测出来了,由于训练的数据集数量有限,其检测的置信度不是特别高。

车牌识别

车牌识别使用的是飞桨PaddleOCR。首先我们先安装PaddleOCR的依赖。

pip install --upgrade pip -i https://pypi.douban.com/simple
pip install paddlepaddle -i https://pypi.douban.com/simple
pip install PaddleOCR -i https://pypi.douban.com/simple

修改一下yolo.py文件中的detect_image方法,将外接矩形框的四个点返回,以便截取车牌位置

编写识别脚本:

from yolo import YOLO
from PIL import Image
from paddleocr import PaddleOCR
import cv2
import numpy as npyolo = YOLO()
ocr = PaddleOCR(use_angle_cls=True, lang="ch")def show(image):cv2.namedWindow('test', 0)cv2.imshow('test', image)# 0任意键终止窗口cv2.waitKey(0)cv2.destroyAllWindows()image = cv2.imread('img/car01.jpeg')
img_copy = image.copy()
detect_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_RGB2BGR))
rel_image, (label, (left, top), (right, bottom)) = yolo.detect_image(detect_image)target_img = img_copy[top:bottom, left:right]
result = ocr.ocr(target_img)
print(result)
show(cv2.cvtColor(np.asarray(rel_image), cv2.COLOR_RGB2BGR))yolo.close_session()

可以看到,识别的效果还是很不错的,如果训练的数据集更多一些,效果当然会更好,车牌的检测也会更准确。

结语

当然也可以用PaddleOCR中的文字检测模型来训练车牌检测,不过其PaddleOCR底层也有一些模型用到了YOLO,所以,在此,使用的YOLO进行车牌检测训练的。可以根据此流程举一反三,通过YOLO做更多内容的检测。
最后放上完整项目的网盘链接:
链接: https://pan.baidu.com/s/1pC3aEjBCL-74o9EbJDZtjw 提取码: q68n

YOLO+PaddleOCR实现车牌检测识别相关推荐

  1. yolo v2 之车牌检测

    一.前言 本文主要使用yolo v2 训练自己的车牌图片数据,并能够框出测试图片中存在的车牌区域,也即车牌检测.本文参考了博文http://m.blog.csdn.net/qq_34484472/ar ...

  2. 【项目三、车牌检测+识别项目】四、使用LPRNet进行车牌识别

    目录 前言 一.数据集 二.训练 三.验证 四.测试结果 五.推理代码 Reference 前言 马上要找工作了,想总结下自己做过的几个小项目. 之前已经总结过了我做的第一个项目:xxx病虫害检测项目 ...

  3. Python OpenCv 车牌检测识别(边缘检测、HSV色彩空间判断)

    Python OpenCv 车牌检测识别 背景 车牌识别在交通.停车等方面有着广泛应用,在网上也有很多种基于OpenCV方案进行识别,本文是综合了两种比较流行的方案,首先是提取出疑似车牌区域的轮廓,然 ...

  4. 六种车牌检测识别算法GitHub项目调研对比

    文章目录 前言 一.EasyOCR 1.1 仓库介绍 1.2 使用记录 二.HyperLPR 2.1 HyperLPR 概述 2.2使用记录 2.3 使用建议 三.simple-car-plate-r ...

  5. 【项目三、车牌检测+识别项目】一、CCPD车牌数据集转为YOLOv5格式和LPRNet格式

    目录 前言 一.CCPD数据集介绍 二.CCPD数据集下载 三.划分训练集.验证集和测试集 四.车牌检测数据集制作 五.车牌识别数据集制作 六.我的车牌检测+识别数据集 Reference 前言 马上 ...

  6. 【项目三、车牌检测+识别项目】二、使用YOLOV5进行车牌检测

    目录 前言 一.数据集 二.ccpd.yaml 三.训练 四.验证 五.测试结果 Reference 前言 马上要找工作了,想总结下自己做过的几个小项目. 之前已经总结过了我做的第一个项目:xxx病虫 ...

  7. 基于深度学习的车牌检测识别(Pytorch)(ResNet +Transformer)

    车牌识别 概述 基于深度学习的车牌识别,其中,车辆检测网络直接使用YOLO侦测.而后,才是使用网络侦测车牌与识别车牌号. 车牌的侦测网络,采用的是resnet18,网络输出检测边框的仿射变换矩阵,可检 ...

  8. 车牌检测识别--Towards End-to-End Car License Plates Detection and Recognition with Deep Neural Networks

    Towards End-to-End Car License Plates Detection and Recognition with Deep Neural Networks https://ar ...

  9. 移动端开源车牌检测识别项目

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 今天给大家推荐一个由智云视图车牌识别的开源项目HyperLPR,HyperLPR是一个基 ...

  10. PaddleOCR车牌检测识别训练、部署

    需要的文件 1) CCPD2019 数据集.2) 安装paddleOCR 和paddle 等环境. 3)本机显卡3080,cuda 11.0 cudnn 8.0.5 paddle 2.0.2 padd ...

最新文章

  1. 蓝桥杯:基础练习 闰年判断
  2. 怎样知道邮箱的端口_网络端口介绍
  3. 这个云代驾,你打几分
  4. 记一次线上偶现的循环依赖问题
  5. HyperLedger Fabric 错误记录
  6. java的object有show_Java中 Object的方法
  7. 云耀服务器切换系统,【计算】云耀服务器-常见操作汇总指南
  8. IntelliJ IDEA 导入项目后出现非法字符解决方法
  9. opengl 关于glewGetContext没有定义
  10. linux中cat监控,Linux基本命令——cat、rev、head、tail
  11. 多个数字数组_九章算法 | 谷歌面试题:多个数组的交集
  12. Asp.net MVC中如何获取控制器的名称
  13. [BZOJ5329] [SDOI2018] 战略游戏
  14. 【无线通信】基于matlab无线传感网络WSN仿真【含Matlab源码 1237期】
  15. 今天你对我爱搭不理, 明天我让你高攀不起
  16. Ps 快速更改头发颜色
  17. 【日常训练赛】C - Prove Him Wrong
  18. 欧几里得、扩展欧几里得和中国剩余定理
  19. React Native Firebase
  20. 找不到php软件包无法卸载,为什么有些软件卸载不了怎么办

热门文章

  1. 笔记本相机测试软件,联想笔记本人脸识别软件(Lenovo VeriFace)
  2. 数据结构视频教程 -《小甲鱼全套教程之C C++数据结构系列教程》
  3. 神逸之作:国产快速启动软件神品ALTRun
  4. java炒股软件_股票软件java,中国软件股票怎么样
  5. 傻瓜式Git提交代码流程【写给初学者】
  6. 【F2FS LFS SSR】华为如何打造智能终端的有趣灵魂?(上)
  7. Hadoop运行环境搭建
  8. 介绍几款iPhone手机原型设计的工具
  9. 南京邮电大学电工电子基础B实验二(电气参数测量和伏安特性)
  10. Linux c/c++开发常用头文件