Skip to content

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.

License

piginzoo/HyperLPR

 
 

Repository files navigation

项目说明

fork自HyperPR,用于理解项目,做注释、修改、实验。感谢原作者的无私分享!

对HyperPR的理解

他提供了2种方法做检测,一种是传统的Haar+Casscade,一种是MobileSSD(https://github.com/zeusees/Mobilenet-SSD-License-Plate-Detection

识别貌似是一个CNN固定长度的识别网络???(待确认)

检测的代码,他说他没有提供,但是有网友给提供了,但是需要去细看一下??https://github.com/armaab/hyperlpr-train

官方的那个train是训练车牌识别的,而不是检测的:https://github.com/zeusees/HyperLPR-Training,这个是ctc字符训练的

参考贴

思路

原作者给出的pipeline思路:

step1. 使用opencv  HAAR Cascade 检测车牌大致位置

step2. Extend 检测到的大致位置的矩形区域

step3. 使用类似于MSER的方式的 多级二值化 + RANSAC 拟合车牌的上下边界

step4. 使用CNN Regression回归车牌左右边界

step5. 使用基于纹理场的算法进行车牌校正倾斜

step6. 使用CNN滑动窗切割字符

step7. 使用CNN识别字符

Issue中的内容总结

https://github.com/zeusees/HyperLPR/issues

  • “我们暂时没有提供开源代码中对应的训练代码,readme中的两个训练代码是群里爱好者提供的,效果也很不错,你可以尝试一下。”2019.8
  • 模型用的是ssd,开源了,说明在csdn,不过好像是一个另外版本
  • 请问一下本项目训练集的样本数量量级?30万,真实样本,我猜是车牌,不是车辆图片
  • “端到端的SegmenationFree-Inception模型的训练代码已经提供”,这个是啥???
  • cascade模型大概用了多少的训练样本?cascade大概用了正样本8000张,负样本15000张.
  • 正样本要充分,负样本也要多样,才能降低错误识别。
  • 训练用的样本正的,倾斜的都要有,提高新能源准确率需要增加这部分样本。
  • 我想问下作者的样本量多大才能有比较好的效果(对全国车牌来说),我们大概使用了5k张在不同环境下的车牌样本训练的gan来生成20w张生成样本。
  • MobileNet-300-0.25-ssd 在E5-2650服务器上cpu运行,看一下你的图片分辨率,另外,应该你的opencv 没有开启AVX 加速编译,不然不会这么慢。输入图像分辨率512*512以下能达到7ms。
  • 在HyperLPR中使用cascade 而没有使用 SSD,原因是,SSD定位速度慢 适合有GPU的用户,SSD出来的结果在我自己的数据集上 要比 cascade 得到的矩形框 更精准一些;SSD出来的结果 已经带有bounding box区域的feature map,可以 在后续的CNN+RNN recognition部分直接省略CNN compute feature的部分吗?这样一来 是不是可以节约计算量?可以的 端到端的 text spotting 的做法就是这样的。 但是出于 cpu 边缘计算设备考虑 还是选择使用cascade based detector 要 速度快一点。
  • 车牌粗定位的具体过程是怎样的,可以采用ssd.mtcnn,yolo,或者传统方式的adaboost cascade等。
  • hyperlpr-train is segmentation based code. if you want to train cnn e2e model, you can try https://github.com/armaab/hyperlpr-train
  • 采用HyperLPR和easypr 相同的测试集(easypr)提供的general_test 文件夹里面的图片测试,发现HyperLPR字符分割和识别率较低,而easyppr 较高似乎与readme说明的不一致,不知道是不是有什么细节参数之类的需要调整呢?答:python 的效果是最新的模型 应该是最好的,配置python采用端到端模型再跑一下,
  • “识别率高,仅仅针对车牌ROI在EasyPR数据集上,0-error达到 95.2%, 1-error识别率达到 97.4% (指在定位成功后的车牌识别率)”
  • 车牌检测使用的是浅层模型还是基于cascade的cnn模型?是传统的adaboost cascade模型

ssd效果更好一些,但是适合有gpu的场景。

原有内容(保留)

logo_t

HyperLPR 高性能开源中文车牌识别框架

11

一键安装

python -m pip install hyperlpr

支持python3,支持Windows Mac Linux 树莓派等。
720p cpu real-time (st on MBP r15 2.2GHz haswell).

快速上手

#导入包
from hyperlpr import *
#导入OpenCV库
import cv2
#读入图片
image = cv2.imread("demo.jpg")
#识别结果
print(HyperLPR_plate_recognition(image))

Q&A

Q:Android识别率没有所传demo apk的识别率高?

A:请使用Prj-Linux下的模型,android默认包里的配置是相对较早的模型

Q:车牌的训练数据来源?

A:由于用于训练车牌数据涉及到法律隐私等问题,本项目无法提供。开放较为大的数据集有CCPD车牌数据集。

Q:训练代码的提供?

A:相关资源中有提供训练代码

Q:关于项目的来源?

A:此项目来源于作者早期的研究和调试代码,代码缺少一定的规范,同时也欢迎PR。

相关资源

更新

  • 更新了Android实现,增加实时扫描接口 (2019.07.24)
  • 更新Windows版本的Visual Studio 2015 工程至端到端模型(2019.07.03)
  • 更新基于端到端的IOS车牌识别工程。(2018.11.13)
  • 可通过pip一键安装、更新的新的识别模型、倾斜车牌校正算法、定位算法。(2018.08.11)
  • 提交新的端到端识别模型,进一步提高识别准确率(2018.08.03)
  • 增加PHP车牌识别工程@coleflowers (2018.06.20)
  • 添加了HyperLPR Lite 仅仅需160 行代码即可实现车牌识别(2018.3.12)
  • 感谢 sundyCoder Android 字符分割版本
  • 增加字符分割训练代码和字符分割介绍(2018.1.)

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 左右边界回归模型

注意事项:

  • Win工程中若需要使用静态库,需单独编译
  • 本项目的C++实现和Python实现无任何关联,都为单独实现
  • 在编译C++工程的时候必须要使用OpenCV 3.3以上版本 (DNN 库),否则无法编译
  • 安卓工程编译ndk尽量采用14b版本

Python 依赖

  • Keras (>2.0.0)
  • Theano(>0.9) or Tensorflow(>1.1.x)
  • Numpy (>1.10)
  • Scipy (0.19.1)
  • OpenCV(>3.0)
  • Scikit-image (0.13.0)
  • PIL

CPP 依赖

  • Opencv 3.4 以上版本

Linux/Mac 编译

  • 仅需要的依赖OpenCV 3.4 (需要DNN框架)
cd Prj-Linux
mkdir build 
cd build
cmake ../
sudo make -j 

CPP demo

#include "../include/Pipeline.h"
int main(){
    pr::PipelinePR prc("model/cascade.xml",
                      "model/HorizonalFinemapping.prototxt","model/HorizonalFinemapping.caffemodel",
                      "model/Segmentation.prototxt","model/Segmentation.caffemodel",
                      "model/CharacterRecognization.prototxt","model/CharacterRecognization.caffemodel",
                       "model/SegmentationFree.prototxt","model/SegmentationFree.caffemodel"
                    );
  //定义模型文件

    cv::Mat image = cv::imread("test.png");
    std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(image,pr::SEGMENTATION_FREE_METHOD);
  //使用端到端模型模型进行识别 识别结果将会保存在res里面
 
    for(auto st:res) {
        if(st.confidence>0.75) {
            std::cout << st.getPlateName() << " " << st.confidence << std::endl;
          //输出识别结果 、识别置信度
            cv::Rect region = st.getPlateRect();
          //获取车牌位置
 cv::rectangle(image,cv::Point(region.x,region.y),cv::Point(region.x+region.width,region.y+region.height),cv::Scalar(255,255,0),2);
          //画出车牌位置
          
        }
    }

    cv::imshow("image",image);
    cv::waitKey(0);
    return 0 ;
}

可识别和待支持的车牌的类型

  • 单行蓝牌
  • 单行黄牌
  • 新能源车牌
  • 白色警用车牌
  • 使馆/港澳车牌
  • 教练车牌
  • 武警车牌
  • 民航车牌
  • 双层黄牌
  • 双层武警
  • 双层军牌
  • 双层农用车牌
  • 双层个性化车牌
Note:由于训练的时候样本存在一些不均衡的问题,一些特殊车牌存在一定识别率低下的问题,如(使馆/港澳车牌),会在后续的版本进行改进。

测试样例

image

image

Android示例

android

识别测试APP

获取帮助

  • HyperLPR讨论QQ群1: 673071218(已满,邀请可进), 群2: 746123554 ,加前请备注HyperLPR交流。

作者和贡献者信息:

作者昵称不分前后

About

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 69.3%
  • Java 19.7%
  • C 4.3%
  • Python 2.4%
  • CMake 2.3%
  • Objective-C++ 1.4%
  • Other 0.6%