Giter VIP home page Giter VIP logo

mobile-lpr's Introduction

mobile-lpr

mobile-lpr

Mobile-LPR 是一个面向移动端的准商业级车牌识别库,以NCNN作为推理后端,使用DNN作为算法核心,支持多种车牌检测算法,支持车牌识别和车牌颜色识别。

Android Demo 见 example/android-example

特点

  • 超轻量,核心库只依赖NCNN,并且对模型量化进行支持
  • 多检测,支持SSD,MTCNN,LFFD等目标检测算法
  • 精度高,LFFD目标检测在CCPD检测AP达到98.9,车牌识别达到99.95%, 综合识别率超过99%
  • 易使用,只需要10行代码即可完成车牌识别
  • 易扩展,可快速扩展各类检测算法

算法流程

算法流程

构建及安装

  1. 下载源码
git clone https://github.com/xiangweizeng/mobile-lpr.git
  1. 准备环境
  • 安装opencv4.0及以上, freetype库
  • 安装cmake3.0以上版本,支持c++11的c++编译器,如gcc-6.3
  1. 编译安装
mkdir build
cd build
cmake ..
make install

使用及样例

1.使用MTCNN检测

  • 代码样例
void test_mtcnn_plate(){
    pr::fix_mtcnn_detector("../../models/float", pr::mtcnn_float_detector);
    pr::PlateDetector detector = pr::IPlateDetector::create_plate_detector(pr::mtcnn_float_detector);

    pr::fix_lpr_recognizer("../../models/float", pr::float_lpr_recognizer);
    pr::LPRRecognizer lpr =  pr::float_lpr_recognizer.create_recognizer();
    Mat img = imread("../../image/plate.png");

    ncnn::Mat sample = ncnn::Mat::from_pixels(img.data, ncnn::Mat::PIXEL_BGR, img.cols, img.rows);
    std::vector<pr::PlateInfo> objects;
    detector->plate_detect(sample, objects);
    lpr->decode_plate_infos(objects);

    for (auto pi : objects)
    {
        cout << "plate_no: " << pi.plate_color << pi.plate_no << " box:" << pi.bbox.xmin << ","
        << pi.bbox.ymin << "," << pi.bbox.xmax << "," << pi.bbox.ymax << "," << pi.bbox.score << endl;
    }
}
  • 效果示例:

MTCNN车牌识别

2.使用LFFD检测

  • 代码样例
void test_lffd_plate()
{
    pr::fix_lffd_detector("../../models/float", pr::lffd_float_detector);
    pr::PlateDetector detector = pr::IPlateDetector::create_plate_detector(pr::lffd_float_detector);

    pr::fix_lpr_recognizer("../../models/float", pr::float_lpr_recognizer);
    pr::LPRRecognizer lpr =  pr::float_lpr_recognizer.create_recognizer();
    Mat img = imread("../../image/plate.png");

    ncnn::Mat sample = ncnn::Mat::from_pixels(img.data, ncnn::Mat::PIXEL_BGR, img.cols, img.rows);
    std::vector<pr::PlateInfo> objects;
    detector->plate_detect(sample, objects);
    lpr->decode_plate_infos(objects);

    for (auto pi : objects)
    {
        cout << "plate_no: " << pi.plate_color << pi.plate_no << " box:" << pi.bbox.xmin << ","
             << pi.bbox.ymin << "," << pi.bbox.xmax << "," << pi.bbox.ymax << "," << pi.bbox.score << endl;
    }
}
  • 效果示例:

LFFD车牌识别

3.使用SSD检测

  • 代码样例
void test_ssd_plate()
{
    pr::fix_ssd_detector("../../models/float", pr::ssd_float_detector);
    pr::PlateDetector detector = pr::IPlateDetector::create_plate_detector(pr::ssd_float_detector);

    pr::fix_lpr_recognizer("../../models/float", pr::float_lpr_recognizer);
    pr::LPRRecognizer lpr =  pr::float_lpr_recognizer.create_recognizer();
    Mat img = imread("../../image/manys.jpeg");

    ncnn::Mat sample = ncnn::Mat::from_pixels(img.data, ncnn::Mat::PIXEL_BGR, img.cols, img.rows);
    std::vector<pr::PlateInfo> objects;
    detector->plate_detect(sample, objects);
    lpr->decode_plate_infos(objects);

    for (auto pi : objects)
    {
        cout << "plate_no: " << pi.plate_color << pi.plate_no << " box:" << pi.bbox.xmin << ","
             << pi.bbox.ymin << "," << pi.bbox.xmax << "," << pi.bbox.ymax << "," << pi.bbox.score << endl;
    }
}
  • 效果示例:

SSD车牌识别

4.使用量化模型

  • 代码样例
void test_quantize_mtcnn_plate(){
    pr::fix_mtcnn_detector("../../models/quantize", pr::mtcnn_int8_detector);
    pr::PlateDetector detector = pr::IPlateDetector::create_plate_detector(pr::mtcnn_int8_detector);

    pr::fix_lpr_recognizer("../../models/quantize", pr::int8_lpr_recognizer);
    pr::LPRRecognizer lpr =  pr::int8_lpr_recognizer.create_recognizer();
    Mat img = imread("../../image/plate.png");

    ncnn::Mat sample = ncnn::Mat::from_pixels(img.data, ncnn::Mat::PIXEL_BGR, img.cols, img.rows);
    std::vector<pr::PlateInfo> objects;
    detector->plate_detect(sample, objects);
    lpr->decode_plate_infos(objects);

    for (auto pi : objects)
    {
        cout << "plate_no: " << pi.plate_color << pi.plate_no << " box:" << pi.bbox.xmin << ","
             << pi.bbox.ymin << "," << pi.bbox.xmax << "," << pi.bbox.ymax << "," << pi.bbox.score << endl;
    }
}
  • 效果示例:

量化后模型车牌识别

后续工作

  • 添加更优的算法支持
  • 优化模型,支持更多的车牌类型,目前支持普通车牌识别,欢迎各位大神提供更好的模型
  • 优化模型,更高的精度
  • 性能评估

参考

  1. light-LPR 本项目的模型大部分来自与此
  2. NCNN 使用NCNN作为后端推理
  3. LFFD LFFD的模型及实现
  4. CCPD **车牌数据集,达到200万样本
  5. HyperLPR 一个开源的车牌识别框架

mobile-lpr's People

Contributors

qaz734913414 avatar xiangweizeng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mobile-lpr's Issues

能否提供原模型

谢谢UP主的工作,lffd、lpc、lprmssd512_voc,这些原模型是否能提供我们测试呢?

ncnn 版本

请问 ncnn 版本的基准是哪个?
要跨edge设备移植的话,需要ncnn对应上版本

"DEFINED" "ANDROID_NDK_MAJOR" "AND" "GREATER" "20"

请问android如下错误,怎么处理啊?
mobile-lpr/example/android-example/app/src/main/cpp/CMakeLists.txt : C/C++ debug|arm64-v8a : CMake Error at mobile-lpr/example/android-example/app/src/main/cpp/CMakeLists.txt:9 (if):
if given arguments:

"DEFINED" "ANDROID_NDK_MAJOR" "AND" "GREATER" "20"

Unknown arguments specified

cmake problem

The following configuration files were considered but not accepted:

/usr/share/OpenCV/OpenCVConfig.cmake, version: 2.4.9.1

在GPU上运行

您好,我看这个项目主要是用ncnn模型,请问,在GPU上运行有尝试吗

可提供数据支持

我可提供蓝色绿色黄色车牌数据以及相关代码,准确率可达95%+。q:1041357701

是否需要提供更加快速的车牌检测LFFD模型?

@xiangweizeng 作者您好,我是LFFD的作者,了解到您的开源项目,我感觉非常好。其中用到了我这边提供的LFFD在车牌检测的模型,这个是当时随手训练的。如果您还需要更快的模型,可以联系我。预计可以将模型再提速一倍,精度保持差不多。

工程化问题

我在win10 vs2017搭建工程出现,无法打开cvunitext.lib错误,本工程是不是默认在Linux上x64上运行呢? 不过因为后面想兼容库版本,我这边用的是opencv3.4.0不知道会不会有影响

基本只能识别安徽蓝牌的问题

您好,感谢你的开源。我这边测试之后发现模型好像基本只能识别安徽蓝牌的车牌,绿牌,黄牌都无法检测到,就更不能进行后续地定位以及识别,并且识别车牌时,会在末尾自动附加 1 这个数字,初步认为是将车牌的的右边框识别进去了。请问如何提高精确度呢?

OCR识别置信度

你好!
请问OCR识别在ctc解码时其置信度prob的值能有效反应字符识别的可靠性么?例如我输入一张误检测的车牌也会有强制输出,如何过滤这种误检测造成的误识别情况?谢谢!

可提供数据支持

我可提供蓝色绿色黄色车牌数据以及相关代码,准确率可达95%+。q:1041357701

/usr/bin/ld: bnll.cpp:(.text+0xed): undefined reference to `__logf_finite'

hello, when i use your command to complie,have some issues
when " cmake .. " no errors
when "mkae " have error as follow:
make install
Scanning dependencies of target mlpr
[ 6%] Building CXX object src/CMakeFiles/mlpr.dir/base.cpp.o
[ 13%] Building CXX object src/CMakeFiles/mlpr.dir/lpc_recognizer.cpp.o
[ 20%] Building CXX object src/CMakeFiles/mlpr.dir/lpr_recognizer.cpp.o
[ 26%] Building CXX object src/CMakeFiles/mlpr.dir/detector/mtcnn_align.cpp.o
[ 33%] Building CXX object src/CMakeFiles/mlpr.dir/detector/mtcnn_proposal.cpp.o
[ 40%] Building CXX object src/CMakeFiles/mlpr.dir/detector/mtcnn_base.cpp.o
[ 46%] Building CXX object src/CMakeFiles/mlpr.dir/detector/mtcnn_plate_detector.cpp.o
[ 53%] Building CXX object src/CMakeFiles/mlpr.dir/detector/ssd_plate_detector.cpp.o
[ 60%] Building CXX object src/CMakeFiles/mlpr.dir/detector/lffd.cpp.o
[ 66%] Building CXX object src/CMakeFiles/mlpr.dir/detector/lffd_plate_detector.cpp.o
[ 73%] Building CXX object src/CMakeFiles/mlpr.dir/detector/align_plate_detector.cpp.o
[ 80%] Building CXX object src/CMakeFiles/mlpr.dir/plate_petector.cpp.o
[ 86%] Linking CXX static library libmlpr.a
[ 86%] Built target mlpr
Scanning dependencies of target run_plate
[ 93%] Building CXX object example/CMakeFiles/run_plate.dir/main.cpp.o
[100%] Linking CXX executable run_plate
/usr/bin/ld: /home/ljj/Downloads/mobile-lpr-master/deps/ncnn/lib/libncnn.a(bnll.cpp.o): in function ncnn::BNLL::forward_inplace(ncnn::Mat&, ncnn::Option const&) const [clone ._omp_fn.0]': bnll.cpp:(.text+0xe0): undefined reference to __expf_finite'
/usr/bin/ld: bnll.cpp:(.text+0xed): undefined reference to __logf_finite' /usr/bin/ld: bnll.cpp:(.text+0x101): undefined reference to __expf_finite'
/usr/bin/ld: bnll.cpp:(.text+0x10e): undefined reference to __logf_finite' /usr/bin/ld: /home/ljj/Downloads/mobile-lpr-master/deps/ncnn/lib/libncnn.a(convolution.cpp.o): in function ncnn::Convolution::forward(ncnn::Mat const&, ncnn::Mat&, ncnn::Option const&) const [clone ._omp_fn.2]':
convolution.cpp:(.text+0x434): undefined reference to __expf_finite' /usr/bin/ld: /home/ljj/Downloads/mobile-lpr-master/deps/ncnn/lib/libncnn.a(deconvolution.cpp.o): in function ncnn::Deconvolution::forward(ncnn::Mat const&, ncnn::Mat&, ncnn::Option const&) const [clone ._omp_fn.0]':
deconvolution.cpp:(.text+0x492): undefined reference to `__expf_finite'
how to solve it ??????
i search internet,some says use libm.so ,but not solve.
my platform is : ubuntu 20.04, gcc9.3 .
hope to solve it.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.