指针压力表读数4:Android实现指针压力表读数(可实时检测)

指针压力表读数4:Android实现指针压力表读数(可实时检测)

目录

指针压力表读数4:Android实现指针压力表读数(可实时检测)

[1. 前言](#1. 前言)

[2. 部署框架MNN](#2. 部署框架MNN)

[3. 导出MNN模型](#3. 导出MNN模型)

[4. Android端上部署模型](#4. Android端上部署模型)

[(1) 版本说明](#(1) 版本说明)

[(2) JNI接口实现](#(2) JNI接口实现)

[(3) 一些异常错误解决方法](#(3) 一些异常错误解决方法)

[5. Android测试效果](#5. Android测试效果)

6.项目源码下载


1. 前言

本篇文章是项目《指针压力表读数》系列文章之《Android实现指针压力表读数》。项目基于PyTorch 深度学习框架,构建了一套完整的指针压力表自动读数识别方案。整体流程采用"压力表检测 + 关键点检测 + 读数计算 "的三阶段设计:首先利用 YOLO11 模型从复杂工业背景中快速定位压力表表盘区域,裁剪得到表盘 ROI;随后在 ROI 内对表盘量程范围起点(零刻度线)、量程范围终点(最大刻度线)、指针起点和指针终点四个关键位置进行关键点检测;最后基于关键点之间的几何关系计算指针偏转角度,并结合量程信息换算得到最终压力读数。

其中,压力表表盘检测采用 YOLO11 模型。YOLO11 在检测速度、小目标识别能力和模型导出兼容性方面具有较好优势,能够适应工业现场中表盘尺度变化大、拍摄角度倾斜、光照不均等复杂场景。 表盘指针关键点检测则基于开源 HRNet 进行改进,构建了完整的指针压力表读数训练与测试流程。HRNet 通过保持高分辨率特征表示,能够更稳定地回归指针尖端、表盘中心等细长或弱纹理关键点;在此基础上,项目进一步引入轻量化分支,支持高精度 HRNet、LiteHRNet 以及 MobileNet 等多种骨干网络的训练和测试,从而在检测精度、推理速度和模型体积之间进行灵活权衡。

为了方便后续模型工程化和 Android 平台部署,项目同时提供了 Python、C++ 和 Android 多个版本的实现。Python 版本主要用于算法验证、模型训练、离线测试和效果可视化;C++ 版本基于 MNN等推理后端实现,便于在边缘设备、工控机或嵌入式平台上集成;Android 版本则面向移动端巡检场景,支持相机采集、实时推理和读数结果显示。

轻量化Mobilenet-v2模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约40ms左右,GPU约30ms左右 ,基本满足业务的性能需求。下表格给出HRNet,以及轻量化模型LiteHRNet和Mobilenet的计算量和参数量,以及其检测精度

|--------------|----------------|---------------|------------|--------|
| 模型 | input-size | params(M) | GFLOPs | AP |
| HRNet-w32 | 192×192 | 28.48M | 5734.05M | 0.9801 |
| LiteHRNet18 | 192×192 | 1.10M | 182.15M | 0.9708 |
| Mobilenet-v2 | 192×192 | 2.63M | 529.25M | 0.9589 |

先展示一下Android Demo检测的效果

指针压力表读数Android APK安装包体验效果: https://download.csdn.net/download/guyuealian/93758160

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/168873316


更多项目《指针压力表读数》系列文章请参考:


2. 部署框架MNN

GitHub:https://github.com/alibaba/MNN

MNN 是阿里巴巴集团开源的轻量级深度学习推理框架,旨在为移动端、嵌入式设备提供高效的模型部署能力。它已在**宝、**猫、钉钉等 30 多个阿里系应用中大规模使用,每天运行数百万次推理。MNN 支持 TensorFlow、Caffe、ONNX 等主流模型格式转换,兼容 CNN、RNN、GAN、Transformer 等常见网络结构,并针对 CPU、GPU、NPU 等硬件后端进行了深度优化。 在 CPU 端,MNN 不依赖第三方计算库,通过手写汇编、Winograd 卷积、多线程调度和内存复用等方式充分发挥 ARM CPU 算力;在 GPU 端,它支持 OpenCL、Vulkan、Metal、CUDA 等多种加速后端,其中 Android 平台可使用 OpenCL/Vulkan,iOS/macOS 平台可使用 Metal,PC/服务器端还可使用 CUDA。 对于需要更高性能的场景,开启 GPU 加速后推理速度通常可提升数倍,部分机型甚至可获得更明显的加速效果。

此外,MNN 还支持 INT4/INT8/FP16 等低精度量化、算子融合、图优化和异构计算,能够在保持模型精度的同时显著降低推理延迟和内存占用。 结合其轻量的库体积、完善的 Python/C++ API 以及跨平台部署能力,MNN 非常适合作为本项目 Android 端推理后端。


3. 导出MNN模型

在开始 C++ 部署之前,首先需要将训练好的 PyTorch 模型导出为 MNN 格式。项目Python源码提供了导出脚本libs/converter/torch2mnn.py。

以LiteHRNet18为例,导出命令如下:

需要安装依赖库: pip install onnx onnxsim onnxruntime mnn

python 复制代码
"""
This code is used to convert the pytorch model into an onnx/MNN format model.
"""
import os
import torch.onnx
from pose.inference import PoseEstimation
from basetrainer.utils.converter import pytorch2onnx, onnx2mnn


def load_model(config_file, model_file, device="cuda:0"):
    pose = PoseEstimation(config_file, model_file, device=device)
    model = pose.model
    config = pose.config
    return model, config


def convert2mnn(config_file, model_file, device="cuda:0", onnx_type="kp"):
    """
    :param model_file:
    :param input_size:
    :param device:
    :param onnx_type:
    :return:
    """
    model, config = load_model(config_file, model_file, device=device)
    model = model.to(device)
    model.eval()
    model_name = os.path.basename(model_file)[:-len(".pth")]
    onnx_file = os.path.join(os.path.dirname(model_file), model_name + ".onnx")
    # dummy_input = torch.randn(1, 3, 240, 320).to("cuda")
    input_size = tuple(config.MODEL.IMAGE_SIZE)  # w,h
    input_shape = (1, 3, input_size[1], input_size[0])
    onnx_file = pytorch2onnx.convert2onnx(model,
                                          input_shape=input_shape,
                                          input_names=['input'],
                                          output_names=['output'],
                                          onnx_file=onnx_file,
                                          opset_version=11,
                                          )
    mnn_file = onnx2mnn.convert2mnn(onnx_file, fp16=True)


if __name__ == "__main__":
    model_file = "work_space/pressure_meter/LiteHRNet18_4_192_192_custom_coco_20261023_105744_0418/model/best_model_209_1.0000.pth"
    config_file = "work_space/pressure_meter/LiteHRNet18_4_192_192_custom_coco_20261023_105744_0418/litehrnet18_192_192.yaml"

其他模型导出方式完全一致,只需替换对应的model_file模型文件和配置文件config_file即可导出的*.mnn 文件。


4. Android端上部署模型

(1) 版本说明

Android Studio开发版本

请参考:Android项目常见问题解决办法

(2) JNI接口实现

Android Demo部署框架采用MNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。Android源码核心算法部分均采用C++实现,上层通过JNI接口调用。

java 复制代码
package com.cv.dl.model;

import android.graphics.Bitmap;

public class Detector {

    static {
        System.loadLibrary("cvdl-lib");
    }


    /***
     * 初始化检测模型
     * @param root:模型文件的根目录,放在assets文件夹下
     * @param det_model: 检测模型
     * @param rec_model: 识别模型(可选)
     * @param model_type:模型类型
     * @param num_thread:开启线程数
     * @param useGPU:是否开启GPU进行加速
     */
    public static native void init(String root, String det_model, String rec_model, int model_type, int num_thread, boolean useGPU);

    /***
     * 进行检测(用于静态图)
     * @param bitmap 图像(bitmap),ARGB_8888格式
     * @param score_thresh:置信度阈值
     * @param iou_thresh:  IOU阈值
     * @param filter:是否开启关键点去抖动,平滑视频流中的关键点,输入必须是连续帧的图像,使用前必须先初始化
     * @return
     */
    public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh, boolean filter);

}

如果你想在这个Android Demo部署你自己训练的YOLO模型,你可将训练好的Pytorch模型转换成MNN模型,然后把MNN模型代替你模型即可。

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

项目开发常见的问题,请参考:Android项目常见问题解决办法


5. Android测试效果

指针压力表读数Android APK安装包体验效果: https://download.csdn.net/download/guyuealian/93758160

APP在普通Android手机上可以达到实时的效果,CPU(4线程)约40ms左右,GPU约30ms左右 ,基本满足业务的性能需求。


6.项目源码下载

如需下载项目源码,请关注【AI吃大瓜】,回复【指针压力表】即可下载

Android项目源码内容包含:

  1. Android Demo提供YOLO11n指针压力表目标检测C++推理代码
  2. Android Demo提供指针压力表:零刻度线、最大刻度线、指针起点和指针终点共四个关键点检测C++推理代码
  3. Android Demo提供MNN模型权重文件:高精度版本HRNet-w32,以及轻量化模型LiteHRNet和Mobilenet-v2模型,配置好环境,可直接运行
  4. OpenCV+base-utils+MNN所有依赖库都已经配置好,可直接build构建APP运行
  5. 项目MNN C/C++源码支持CPU和GPU运行,LiteHRNet可以达到实时检测效果,CPU(4线程) 约40ms左右,GPU OpenCL约30ms左右。
  6. Android Demo支持提供视频关键点去抖动算法(filter=true)
  7. Android Demo支持支持图片,视频,摄像头测试
相关推荐
fengci.2 小时前
CTF2刷题记录(困难部分)
android·开发语言·前端·学习·php
hunterandroid2 小时前
[Android 从零到一] ARouter 路由框架原理:APT 生成路由表与组件化通信
android
最好一梦2 小时前
佳维视安卓工控机在堆垛机中的应用
android
传奇开心果编程3 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
腾讯端服务4 小时前
一码Duo端-Kuikly-iOS折叠屏新UI适配实践
android·ui·ios·kotlin·鸿蒙
T量子永生4 小时前
Android SISO 分布式编译集群配置方案
android·分布式·云计算·源代码管理
街头便衣4 小时前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
AI吃大瓜5 小时前
指针压力表读数2:Pytorch实现指针压力表读数(含训练代码)
指针读数·指针压力表·指针压力表读数·压力表检测·压力表自动读数
警醒与鞭策16 小时前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化