目录
智能驾驶 车牌检测和识别(四)《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源码下载
这是项目《智能驾驶 车牌检测和识别》系列之《Android实现车牌检测和识别(可实时车牌识别)》;本项目将开发一个Android版本的车牌检测和识别APP,其中车牌检测算法采用YOLOv5模型,车牌识别算法采用PlateNet模型;车牌检测和识别APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。
车牌识别Android Demo效果展示:
【 整套项目下载地址】智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》
【Android Demo体验】https://download.csdn.net/download/guyuealian/87400593
【尊重原创,转载请注明出处】《Android实现车牌检测和识别(可实时识别车牌)》:https://blog.csdn.net/guyuealian/article/details/128704242
更多项目《智能驾驶 车牌检测和识别》系列文章请参考:
智能驾驶 车辆检测(一)《UA-DETRAC BITVehicle车辆检测数据集》:https://blog.csdn.net/guyuealian/article/details/127907325
智能驾驶 车辆检测(二)《YOLOv5实现车辆检测(含车辆检测数据集+训练代码)》:https://blog.csdn.net/guyuealian/article/details/128099672
智能驾驶 车辆检测(三)《Android实现车辆检测(含Android源码 可实时运行)》:https://blog.csdn.net/guyuealian/article/details/128190532
车牌检测模型训练过程,请参考智能驾驶 车牌检测和识别(二)《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 |
车牌检测效果:
YOLOv5车牌检测模型在Android端上部署过程,请参考如下
训练好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
目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行Android端上部署:
TNN转换工具:
- (1)将ONNX模型转换为TNN模型,请参考TNN官方说明:TNN/onnx2tnn.md at master · Tencent/TNN · GitHub
- (2)一键转换,懒人必备:一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine (可能存在版本问题,这个工具转换的TNN模型可能不兼容,建议还是自己build源码进行转换,2022年9约25日测试可用)
车牌识别模型训练过程,请参考 智能驾驶 车牌检测和识别(三)《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效果展示:
PlateNet车牌识别模型在Android端上部署过程,请参考如下
车牌识别项目源码demo.py文件中参数--export设置为True,可将Pytorch的模型转换为ONNX模型文件,且ONNX文件会默认保存在Pytorch的模型文件同一目录下。
TNN转换工具,请参考:
- (1)将ONNX模型转换为TNN模型,请参考TNN官方说明:TNN/onnx2tnn.md at master · Tencent/TNN · GitHub
- (2)一键转换,懒人必备:一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine (可能存在版本问题,这个工具转换的TNN模型可能不兼容,建议还是自己build源码进行转换,2022年9约25日测试可用)
项目实现了Android版本的车牌检测和车牌识别,部署框架采用TNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。
车牌检测模型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);
}
运行APP闪退:dlopen failed: library "libomp.so" not found
参考解决方法:解决dlopen failed: library “libomp.so“ not found_PKing666666的博客-CSDN博客_dlopen failed
车牌识别Android Demo效果展示:
Android APP Demo体验:https://download.csdn.net/download/guyuealian/87400593
【Android APP Demo体验】https://download.csdn.net/download/guyuealian/87400593
【车牌检测和识别Android源码下载】 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》
整套Android项目源码内容包含:
- 提供YOLOv5车牌检测模型:包含快速版yolov5s05车牌检测模型,在普通手机可实时检测识别,CPU(4线程)约30ms左右,GPU约25ms左右;包含高精度版本yolov5s车牌检测模型,CPU(4线程)约250ms左右,GPU约100ms左右
- 提供PlateNet车牌识别模型:支持蓝牌和绿牌车牌识别
- Android Demo支持图片,视频,摄像头测试
如果你需要C++版本或Python的车牌检测和车牌识别,请查看更多项目《智能驾驶 车牌检测和识别》系列文章请参考: