引言
HyperLRP是一个开源的、基于深度学习高性能中文车牌识别库,由北京智云视图科技有限公司开发,支持PHP、C/C++、Python语言,Windows/Mac/Linux/Android/IOS平台。与较为流行的开源的EasyPR相比,它的检测速度和鲁棒性和多场景的适应性都要好于目前开源的EasyPR,HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等。
- TODO
支持多种车牌以及双层
支持大角度车牌
轻量级识别模型- 特性
速度快 720p,单核 Intel 2.2G CPU (MaBook Pro 2015)平均识别时间低于100ms
基于端到端的车牌识别无需进行字符分割
识别率高,卡口场景准确率在95%-97%左右
轻量,总代码量不超1k行
一、开发环境配置
⭕️Win
1、在Anaconda所建环境的命令行中输入
pip3 install hyperlpr -i https://mirrors.aliyun.com/pypi/simple/
2、下载整个开源库文件
https://gitee.com/zeusees/HyperLPR/tree/master/
把hyperlpr_py3并改名为hyperlpr复制到Anaconda3安装路径\envs\环境名\lib\python3.6\site-packages,与原目录下的hyperlpr合并
3、新建开发文件
将开源库中的Font、model、HyperLprGUI.py、HyperLprLite.py、demo.py拷到此目录中,创建一个Images的目录,放置待识别车牌的车辆照片,命名为plate1.jpg、plate2.jpg、plate3.jpg。
4、测试代码demo.py(单张图片检测部分)
from hyperlpr.pipline import drawRectBox
import HyperLPRLite as pr
import cv2
import numpy as np
grr = cv2.imread("./Images/plate3.png")
model = pr.LPR("model/cascade.xml","model/model12.h5","model/ocr_plate_all_gru.h5")
for pstr,confidence,rect in model.SimpleRecognizePlateByE2E(grr):
if confidence>0.7:
image = drawRectBox(grr, rect, pstr+" "+str(round(confidence,3)))
print("plate_str:")
print(pstr)
print("plate_confidence")
print(confidence)
cv2.imshow("image",image)
cv2.waitKey(0)
⭕️树莓派
1、在命令行里输入sudo pip3 install hyperlpr
2、将上面的hyperlpr_py3并改名为hyperlpr拷贝到树莓派/home/pi/.local/lib/python3.7/site-packages
二、代码解析
demo.py(单张图片检测部分)
demo中总的流程分为:
1)利用cascade进行车牌定位
2)对粗定位的车牌进行左右边界回归,去除车牌两边多余的部分
3)将精定位的车牌送入CRNN网络进行字符识别
1、输入模块
from hyperlpr.pipline import drawRectBox
import HyperLPRLite as pr
import cv2
Github : https://github.com/icepoint666/HyperLPR
Forked from zeusees/HyperLPR 略加改动
只需要三个代码文件:
- multi_demo.py
- demo.py
- HyperLPRLite.py
2、输入图片识别处理
grr = cv2.imread("./Images/plate3.png")
opencv2的imread函数导入图片, 返回的是Mat类型。
model = pr.LPR("model/cascade.xml","model/model12.h5","model/ocr_plate_all_gru.h5")
HyperLPRLiite.py中的LPR类构造函数导入model, 参数就是训练好的三个模型文件,名字分别是:
- model/cascade.xml cascade模型
- model/model12.h5 左右边界回归模型
- model/ocr_plate_all_gru.h5 字符识别模型
def __init__(self,model_detection,model_finemapping,model_seq_rec):
self.watch_cascade = cv2.CascadeClassifier(model_detection)
self.modelFineMapping = self.model_finemapping()
self.modelFineMapping.load_weights(model_finemapping)
self.modelSeqRec = self.model_seq_rec(model_seq_rec)
参数 model_detection 就是文件 model/cascade.xml 用到了opencv2的CascadeClassifier()函数
- cv2.CascadeClassifier()函数
参数输入.xml或者.yaml文件,表示加载模型,是一种基于Haar特征的级联分类器用于物体检测的模型
- model_finemapping()函数:车牌精定位
def model_finemapping(self):
input = Input(shape=[16, 66, 3]) # change this shape to [None,None,3] to enable arbitraty shape input
x = Conv2D(10, (3, 3), strides=1, padding='valid', name='conv1')(input)
x = Activation("relu", name='relu1')(x)
x = MaxPool2D(pool_size=2)(x)
x = Conv2D(16, (3, 3), strides=1, padding='valid', name='conv2')(x)
x = Activation("relu", name='relu2'