码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 水表数字识别5:Android实现水表数字识别(含源码 可实时检测)


    水表数字识别5:Android实现水表数字识别(含源码 可实时检测)

    目录

    水表数字识别5:Android实现水表数字识别(含源码 可实时检测)

    1. 前言

    2. 水表数字分割模型

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

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

    3. 水表数字识别模型(PlateNet)

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

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

    4. 水表数字识别Android部署

    (1) Android部署NCNN模型

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

    5.水表识别数字识别效果(Android版本)

    6. 项目Android源码下载


    1. 前言

    本项目将实现水表数字识别,整套方案采用二阶段方法实现,即首先使用文本(数字)检测模型DBNet定位水表数字的区域,然后进行校正并裁剪水表数字区域,再使用CRNN模型对水表数字的区域进行文本(数字)识别。

    整套项目分为:数据集说明,DBNet文本(数字)检测模型训练、CRNN文本(数字)识别模型训练,以及水表数字识别边缘侧部署C++/Android等多个章节,本篇是项目《​​​​水表数字识别》系列文章之《Android实现水表数字识别》;为了方便后续模型工程化和Android平台部署,项目对文字检测模型和文字识别模型进行轻量化,并提供Python/C++/Android多个版本;

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

    模型input-sizeparams(M)GFLOPsAccuracy
    LPRNet94×240.48M0.147GFlops0.9000
    CRNN160×328.35M1.06GFlops0.9150
    PlateNet168×481.92M1.25GFlops0.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-sizeparams(M)GFLOPsMSEmIOU

    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-sizeparams(M)GFLOPsAccuracy
    LPRNet94×240.48M0.147GFlops0.9000
    CRNN160×328.35M1.06GFlops0.9150
    PlateNet168×481.92M1.25GFlops0.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模型即可。

    1. package com.cv.tnn.model;
    2. import android.graphics.Bitmap;
    3. public class Detector {
    4. static {
    5. System.loadLibrary("tnn_wrapper");
    6. }
    7. /***
    8. * 初始化检测模型
    9. * @param det_model: 检测模型(不含后缀名)
    10. * @param cls_model: 识别模型(不含后缀名)
    11. * @param root:模型文件的根目录,放在assets文件夹下
    12. * @param model_type:模型类型
    13. * @param num_thread:开启线程数
    14. * @param useGPU:关键点的置信度,小于值的坐标会置-1
    15. */
    16. public static native void init(String det_model, String cls_model, String root, int model_type, int num_thread, boolean useGPU);
    17. /***
    18. * 返回检测和识别结果
    19. * @param bitmap 图像(bitmap),ARGB_8888格式
    20. * @param score_thresh:置信度阈值
    21. * @param iou_thresh: IOU阈值
    22. * @return
    23. */
    24. public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh);
    25. }

    (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 Demo源码下载】 ​​​​​​​C/C++实现水表数字识别(含源码 可实时检测)

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

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

    1. 提供Fast-SCNN水表数字分割模型
    2. 提供PlateNet水表数字识别模型,识别准确率可以达到0.9275左右
    3. 提供整套项目水表数字分割和识别Android Demo项目源码
    4. Android Demo源码可用于二次开发
    5. Android Demo在普通手机CPU/GPU上可以实时检测,CPU约40ms,GPU约30ms左右
    6. Android Demo支持图片、视频和摄像头测试
    7. 所有依赖库都已经配置好,可直接build运行,若运行出现闪退,请参考dlopen failed: library “libomp.so“ not found 解决。

  • 相关阅读:
    这个编辑器即将开源!
    【东软实训Day3】Servlet
    C++进阶--C++11(2)
    2024年高考考务人员网上培训参考答案
    工信部—高级软件开发工程师认证
    element plus Infinite Scroll 无限滚动
    使用终端MobaXterm连接Centos
    等级保护测评需要多长时间 ?
    C语言通过宏定义实现便捷打印参数值和参数名
    C语言环境变量和错误处理
  • 原文地址:https://blog.csdn.net/guyuealian/article/details/139998836
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号