HyperLPR 开源车牌识别系统的入门使用
概要
HyperLRP是一个开源的、基于深度学习高性能中文车牌识别库,由北京智云视图科技有限公司开发,支持PHP、C/C++、Python语言,Windows/Mac/Linux/Android/IOS 平台。
github地址: https://github.com/zeusees/HyperLPR
TODO
- 支持多种车牌以及双层
- 支持大角度车牌
- 轻量级识别模型
特性
- 速度快 720p,单核 Intel 2.2G CPU (MaBook Pro 2015)平均识别时间低于100ms
- 基于端到端的车牌识别无需进行字符分割
- 识别率高,卡口场景准确率在95%-97%左右
- 轻量,总代码量不超1k行
模型资源说明
- cascade.xml:检测模型 - 目前效果最好的cascade检测模型
- cascade_lbp.xml:召回率效果较好,但其错检太多
- char_chi_sim.h5:Keras模型-可识别34类数字和大写英文字 使用14W样本训练
- char_rec.h5:Keras模型-可识别34类数字和大写英文字 使用7W样本训练
- ocr_plate_all_w_rnn_2.h5:基于CNN的序列模型
- ocr_plate_all_gru.h5:基于GRU的序列模型从OCR模型修改,效果目前最好但速度较慢,需要20ms。
- plate_type.h5:用于车牌颜色判断的模型
- model12.h5:左右边界回归模型
可识别和待支持的车牌的类型
HyperLPR的检测流程
- 使用opencv的HAAR Cascade检测车牌大致位置
- Extend检测到的大致位置的矩形区域
- 使用类似于MSER的方式的多级二值化和RANSAC拟合车牌的上下边界
- 使用CNN Regression回归车牌左右边界
- 使用基于纹理场的算法进行车牌校正倾斜
- 使用CNN滑动窗切割字符
- 使用CNN识别字符
环境配置
首先将项目下载到本地,这里我使用了本机上配置的虚拟环境HyperLPR。
创建虚拟环境: conda create -n HyperLPR python=3.7
- 操作系统:windows10
- IDE:Pycharm
- python版本:Anaconda Pyhon3.7
- tensorflow版本:tensorflow-gpu==2.1.0
- cuda版本:10.1
- 显卡:RTX 2060
- OpenCV: opencv-python==3.4.3.18
- Keras:Keras==2.3.1
大坑之一: HyperLPR python中版本兼容太差,新版本无法兼容老版本,所以所有第三方库,我们全部指定版本
安装相关的python库
pip install Keras==2.3.1
pip install Theano
pip install Numpy
pip install Scipy
pip install opencv-python==3.4.3.18
pip install scikit-image
pip install pillow
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu==2.1.0
下载车牌识别库
打开Git CMD,输入下面的指令,将仓库克隆到本地,–depth=1不克隆历史,只取最新的一个版本,对我们使用者来说可以节少大量的时间,因为历史版本对我们没有什么意义。
git clone --depth=1 https://github.com/zeusees/HyperLPR.git
等待克隆完成
aaa@qq.com MINGW64 /d/Projects
$ git clone --depth=1 https://github.com/zeusees/HyperLPR.git
Cloning into 'HyperLPR'...
remote: Counting objects: 793, done.
remote: Compressing objects: 100% (605/605), done.
remote: Total 793 (delta 170), reused 709 (delta 149), pack-reused 0
Receiving objects: 100% (793/793), 92.86 MiB | 86.00 KiB/s, done.
Resolving deltas: 100% (170/170), done.
Checking out files: 100% (714/714), done.
所有文件如下
我们需要把hyperlpr_py3文件夹复制到虚拟环境…\anaconda3\envs\HyperLPR\Lib下,并改名为hyperlpr,完整路径为…\anaconda3\envs\HyperLPR\Lib\hyperlpr。
然后,我们创建一个LPR的目录,将开源库中的Font和model拷到此目录,创建一个 data的目录,放置待识别车牌的车辆照片。
在lpr.py文件中写入如下代码
from hyperlpr import pipline as pp
import cv2
# 自行修改文件名
image = cv2.imread("data/001.jpg")
image, res = pp.SimpleRecognizePlate(image)
print('-------------')
print(res)
执行后, 大约几秒后即可出现结果
(241, 289, 3)
校正角度 h 0 v 90
keras_predict [0.15456393 0.88673264]
0f96bd6b
e2e: ('浙B5HC51', 0.896134112562452)
校正 1.6333682537078857 s
分割 0.13702082633972168
254
寻找最佳点 0.021014928817749023
字符识别 0.2136836051940918
分割和识别 0.3737204074859619 s
车牌: 浙B5HC51 置信度: 0.8446585088968277
2.1401290893554688 s
-------------
['浙B5HC51']
至此,我们成功地使用开源python库进行车牌识别,本次提供的样本显示出识别需要质量较高的图像,对于低质量图像或有逆光干扰的时候,会有多个结果供选择,我们可以根据置信度,或提高图像分辨率进行处理与选择。
错误调试
第一次执行的时候,有可能会报如下错误。
numpy.AxisError: axis 3 is out of bounds for array of dimension 3
需要对程序进行部分修改。
将data= np.expand_dims(data,3)中的3改为2。
这里主要关系到np.expand_dims函数的作用。这个函数是用来调整数组维度的。比如有一个二维数组data(1,2),但是你需要输入3维数组,然后你就需要把数据再加一维。但是需要选择加在哪一维。二维数组就有三个位置(0, 1,2)。注意axis的值是从0开始的。