智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

时间:2023-01-31 22:51:00

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

目录

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

1. 前言

2. 车牌检测模型(YOLOv5)

(1) 将Pytorch模型转换ONNX模型

(2) 将ONNX模型转换为TNN模型

3. 车牌识别模型(PlateNet)

(1) 将Pytorch模型转换ONNX模型

(2) 将ONNX模型转换为TNN模型

4. 车牌检测和识别Android部署

(1) Android部署TNN模型

(2) 一些异常错误解决方法

5. 车牌检测和识别Android效果

6. 项目Android源码下载


1. 前言

这是项目《智能驾驶 车牌检测和识别》系列之《Android实现车牌检测和识别(可实时车牌识别)》;本项目将开发一个Android版本的车牌检测和识别APP,其中车牌检测算法采用YOLOv5模型,车牌识别算法采用PlateNet模型;车牌检测和识别APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

 车牌识别Android Demo效果展示:

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

【 整套项目下载地址】智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

【Android Demo体验】https://download.csdn.net/download/guyuealian/87400593

【尊重原创,转载请注明出处】《Android实现车牌检测和识别(可实时识别车牌)》:https://blog.csdn.net/guyuealian/article/details/128704242


 更多项目《智能驾驶 车牌检测和识别》系列文章请参考:

  1. 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》:https://blog.csdn.net/guyuealian/article/details/128704181
  2. 智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704068
  3. 智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704209
  4. 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》:https://blog.csdn.net/guyuealian/article/details/128704242
  5. 智能驾驶 车牌检测和识别(五)《C++实现车牌检测和识别(可实时车牌识别)》:https://blog.csdn.net/guyuealian/article/details/128704276
  6. 智能驾驶 红绿灯检测(一)《红绿灯(交通信号灯)数据集》:https://blog.csdn.net/guyuealian/article/details/128222850
  7. 智能驾驶 红绿灯检测(二)《YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)》:https://blog.csdn.net/guyuealian/article/details/128240198
  8. 智能驾驶 红绿灯检测(三)《Android实现红绿灯检测(含Android源码 可实时运行)》:https://blog.csdn.net/guyuealian/article/details/128240334
  9. 智能驾驶 车辆检测(一)《UA-DETRAC BITVehicle车辆检测数据集》:https://blog.csdn.net/guyuealian/article/details/127907325

  10. 智能驾驶 车辆检测(二)《YOLOv5实现车辆检测(含车辆检测数据集+训练代码)》:https://blog.csdn.net/guyuealian/article/details/128099672

  11. 智能驾驶 车辆检测(三)《Android实现车辆检测(含Android源码 可实时运行)》:https://blog.csdn.net/guyuealian/article/details/128190532


2. 车牌检测模型(YOLOv5)

车牌检测模型训练过程,请参考智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704068

为了能部署在手机Android平台上,本人对YOLOv5s进行了简单的模型轻量化,并开发了一个轻量级的版本yolov5s05_416和yolov5s05_320模型;轻量化模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。下表格给出轻量化模型的计算量和参数量以及其检测精度

模型 input-size params(M) GFLOPs mAP_0.5:0.95
yolov5s 640×640 7.2 16.5 0.75261
yolov5s05 416×416 1.7 1.8 0.74593
yolov5s05 320×320 1.7 1.1 0.74341

车牌检测效果:

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

 YOLOv5车牌检测模型在Android端上部署过程,请参考如下

(1) 将Pytorch模型转换ONNX模型

训练好yolov5s05或者yolov5s模型后,你需要将模型转换为ONNX模型,并使用onnx-simplifier简化网络结构

# 转换yolov5s05模型
python export.py --weights "runs/yolov5s05_320/weights/best.pt" --img-size 320 320

# 转换yolov5s模型
python export.py --weights "runs/yolov5s_640/weights/best.pt" --img-size 640 640

GitHub: https://github.com/daquexian/onnx-simplifier
Install:  pip3 install onnx-simplifier 

(2) 将ONNX模型转换为TNN模型

目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行Android端上部署:

TNN转换工具:

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》


3. 车牌识别模型(PlateNet)

车牌识别模型训练过程,请参考 智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704209

项目基于CRNN或LPRNet模型构建车牌识别算法,支持绿牌和蓝牌识别;为方便后续工程化,项目对CRNN模型进行魔改,提出一个PlateNet模型,用于支持部署到Android平台或者开发板上

整套智能车牌检测和识别系统,在普通Android手机上可以达到实时的检测效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。下表格给出CRNN,LPRNet和PlateNet模型的计算量和参数量以及其车牌识别的准确率:

模型 input-size params(M) GFLOPs Accuracy
LPRNet 94×24 0.48M 0.147GFlops 0.9393
CRNN 160×32 8.35M 1.06GFlops 0.9343
PlateNet 168×48 1.92M 1.25GFlops 0.9583

车牌识别Demo效果展示:

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

 PlateNet车牌识别模型在Android端上部署过程,请参考如下

(1) 将Pytorch模型转换ONNX模型

车牌识别项目源码demo.py文件中参数--export设置为True,可将Pytorch的模型转换为ONNX模型文件,且ONNX文件会默认保存在Pytorch的模型文件同一目录下。

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

(2) 将ONNX模型转换为TNN模型

TNN转换工具,请参考:


4. 车牌检测和识别Android部署

项目实现了Android版本的车牌检测和车牌识别,部署框架采用TNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。

(1) Android部署TNN模型

车牌检测模型YOLOv5和车牌识别模型PlateNet的Android源码核心算法部分均采用C++实现,上层通过JNI接口调用。

如果你想在这个Android Demo部署你自己训练的车牌检测模型YOLOv5和车牌识别模型PlateNet,你可将训练好的Pytorch模型转换ONNX ,再转换成TNN模型,然后把原始的模型替换成你自己的TNN模型即可。

package com.cv.tnn.model;

import android.graphics.Bitmap;

public class Detector {

    static {
        System.loadLibrary("tnn_wrapper");
    }


    /***
     * 初始化检测模型
     * @param det_model: 检测模型(不含后缀名)
     * @param cls_model: 识别模型(不含后缀名)
     * @param root:模型文件的根目录,放在assets文件夹下
     * @param model_type:模型类型
     * @param num_thread:开启线程数
     * @param useGPU:关键点的置信度,小于值的坐标会置-1
     */
    public static native void init(String det_model, String cls_model, String root, int model_type, int num_thread, boolean useGPU);

    /***
     * 返回检测和识别结果
     * @param bitmap 图像(bitmap),ARGB_8888格式
     * @param score_thresh:置信度阈值
     * @param iou_thresh:  IOU阈值
     * @return
     */
    public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh);
}

(2) 一些异常错误解决方法

运行APP闪退:dlopen failed: library "libomp.so" not found

参考解决方法:解决dlopen failed: library “libomp.so“ not found_PKing666666的博客-CSDN博客_dlopen failed


5. 车牌检测和识别Android效果

 车牌识别Android Demo效果展示:

 Android APP Demo体验:https://download.csdn.net/download/guyuealian/87400593

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》


6. 项目Android源码下载

【Android APP Demo体验】https://download.csdn.net/download/guyuealian/87400593

【车牌检测和识别Android源码下载】 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

整套Android项目源码内容包含:

  1. 提供YOLOv5车牌检测模型:包含快速版yolov5s05车牌检测模型,在普通手机可实时检测识别,CPU(4线程)约30ms左右,GPU约25ms左右;包含高精度版本yolov5s车牌检测模型,CPU(4线程)约250ms左右,GPU约100ms左右
  2. 提供PlateNet车牌识别模型:支持蓝牌和绿牌车牌识别
  3. Android Demo支持图片,视频,摄像头测试

如果你需要C++版本或Python的车牌检测和车牌识别,请查看更多项目《智能驾驶 车牌检测和识别》系列文章请参考: 

  1. 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》:https://blog.csdn.net/guyuealian/article/details/128704181
  2. 智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704068
  3. 智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704209
  4. 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》:https://blog.csdn.net/guyuealian/article/details/128704242
  5. 智能驾驶 车牌检测和识别(五)《C++实现车牌检测和识别(可实时车牌识别)》:https://blog.csdn.net/guyuealian/article/details/128704276