水表数字识别5:Android实现水表数字识别(含源码 可实时检测)
目录
水表数字识别5:Android实现水表数字识别(含源码 可实时检测)
1. 前言
本项目将实现水表数字识别,整套方案采用二阶段方法实现,即首先使用文本(数字)检测模型DBNet定位水表数字的区域,然后进行校正并裁剪水表数字区域,再使用CRNN模型对水表数字的区域进行文本(数字)识别。
整套项目分为:数据集说明,DBNet文本(数字)检测模型训练、CRNN文本(数字)识别模型训练,以及水表数字识别边缘侧部署C++/Android等多个章节,本篇是项目《水表数字识别》系列文章之《Android实现水表数字识别》;为了方便后续模型工程化和Android平台部署,项目对文字检测模型和文字识别模型进行轻量化,并提供Python/C++/Android多个版本;
整套水表数字检测和识别系统,在普通Android手机上可以达到实时的检测效果,CPU(4线程)约40ms左右,GPU约30ms左右 ,基本满足业务的性能需求。下表格给出CRNN,LPRNet和PlateNet模型的计算量和参数量以及其数字识别的准确率:
模型 | input-size | params(M) | GFLOPs | Accuracy |
LPRNet | 94×24 | 0.48M | 0.147GFlops | 0.9000 |
CRNN | 160×32 | 8.35M | 1.06GFlops | 0.9150 |
PlateNet | 168×48 | 1.92M | 1.25GFlops | 0.9275 |
【尊重原创,转载请注明出处】https://download.csdn.net/download/guyuealian/89537381
更多项目《水表数字识别》系列文章请参考:
- 水表数字识别1:水表数字数据集说明(含下载链接)
- 水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)
- 水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)
- 水表数字识别4:C++实现水表数字识别(含源码 可实时检测)
- 水表数字识别5:Android实现水表数字识别(含源码 可实时检测)
2. 水表数字分割模型
关于水表数字分割模型训练,请参考《水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)》
项目提供两个版本的水表数字分割模型DBNet和Fast-SCNN模型;DBNet属于高精度版本,参数量和计算量较大,检测精度较高,但比较耗时;Fast-SCNN模型属于轻量化版本,参数量和计算量较小,检测精度一般,速度较快,适合手机移动端部署。
下表格给出文本(数字)检测模型DBNet和Fast-SCNN的计算量和参数量,以及其预测结果的均方误差MSE:
模型 | input-size | params(M) | GFLOPs | MSE | mIOU |
DBNet | 320×320 | 9722.27M | 12.22M | 0.1508 | 0.9333 |
Fast-SCNN | 320×320 | 1.24M | 939.01M | 0.1997 | 0.9531 |
考虑到手机端比较弱鸡的性能,项目最终使用Fast-SCNN模型进行端上部署。水表数字分割模型在C++端上部署过程,请参考如下
(1) 将Pytorch模型转换ONNX模型
训练好Pytorch模型后,我们需要先将模型转换为ONNX模型,以便后续模型部署。
- 原始项目提供转换脚本,你只需要修改model_file和config_file
为你模型和配置文件路径即可 - convert_torch_to_onnx.py实现将Pytorch模型转换ONNX模型的脚本
python libs/converter/convert_torch_to_onnx.py
(2) 将ONNX模型转换为NCNN模型
目前CNN模型有多种部署方式,可以采用NCNN、TNN、MNN以及TensorRT等部署工具,鄙人采用NCNN进行C++和Android端上部署:
NCNN转换工具:
- (1)将ONNX模型转换为NCNN模型,请参考NCNN官方说明:GitHub - Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform
- (2)一键转换,懒人必备:一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine (可能存在版本问题,这个工具转换的NCNN模型可能不兼容,建议还是自己build源码进行转换,2022年9约25日测试可用)
3. 水表数字识别模型(PlateNet)
关于水表数字识别模型训练,请参考《水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)》
项目基于CRNN或LPRNet模型构建水表数字识别算法;为方便后续工程化,项目对CRNN模型进行魔改,提出一个PlateNet模型,用于支持部署到Android平台或者开发板上
整套水表数字识别系统,在OpenCL加速下,可以达到实时的检测效果,基本满足业务的性能需求。下表格给出CRNN,LPRNet和PlateNet模型的计算量和参数量以及其识别的准确率:
模型 | input-size | params(M) | GFLOPs | Accuracy |
LPRNet | 94×24 | 0.48M | 0.147GFlops | 0.9000 |
CRNN | 160×32 | 8.35M | 1.06GFlops | 0.9150 |
PlateNet | 168×48 | 1.92M | 1.25GFlops | 0.9275 |
考虑到LPRNet和CRNN模型,存在某些OP算子,NCNN不支持,项目最终使用PlateNet模型进行端上部署。水表数字识别模型在C++端上部署过程,请参考如下
PlateNet识别模型在C++端上部署过程,请参考如下
(1) 将Pytorch模型转换ONNX模型
水表数字识别项目源码demo.py文件中参数--export设置为True,可将Pytorch的模型转换为ONNX模型文件,且ONNX文件会默认保存在Pytorch的模型文件同一目录下。
(2) 将ONNX模型转换为NCNN模型
NCNN转换工具,请参考:
- (1)将ONNX模型转换为NCNN模型,请参考NCNN官方说明:GitHub - Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform
- (2)一键转换,懒人必备:一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine (可能存在版本问题,这个工具转换的NCNN模型可能不兼容,建议还是自己build源码进行转换,2022年9约25日测试可用)
4. 水表数字识别Android部署
项目实现了Android版本的水表数字检测和识别,模型部署框架采用NCNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。
(1) Android部署NCNN模型
水表数字分割模型采用Fast-SCNN,识别模型采用PlateNet,模型推理实现Android源码核心算法部分均采用C++实现,上层Java通过JNI接口调用C++算法。
如果你想在这个Android Demo部署你自己训练的模型,你可将训练好的Pytorch模型转换ONNX ,再转换成NCNN模型,然后把原始的模型替换成你自己的TNCNN模型即可。
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版本水表数字检测分割和识别算法开发,APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约40ms左右,GPU约30ms左右 ,基本满足业务的性能需求。
Android Demo体验:https://download.csdn.net/download/guyuealian/89537381
6. 项目Android源码下载
【Android APP Demo体验】https://download.csdn.net/download/guyuealian/89537381
如需下载项目源码,请WX关注【AI吃大瓜】,回复【水表数字识别】即可下载
项目资源内容包含:
- 提供Fast-SCNN水表数字分割模型
- 提供PlateNet水表数字识别模型,识别准确率可以达到0.9275左右
- 提供整套项目水表数字分割和识别Android Demo项目源码
- Android Demo源码可用于二次开发
- Android Demo在普通手机CPU/GPU上可以实时检测,CPU约40ms,GPU约30ms左右
- Android Demo支持图片、视频和摄像头测试
所有依赖库都已经配置好,可直接build运行,若运行出现闪退,请参考dlopen failed: library “libomp.so“ not found 解决。