指针压力表读数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测试效果)
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
更多项目《指针压力表读数》系列文章请参考:
- 指针压力表读数1:指针压力表数据集下载https://blog.csdn.net/guyuealian/article/details/168873184
- 指针压力表读数2:Pytorch实现指针压力表读数(含训练代码) https://blog.csdn.net/guyuealian/article/details/168873246
- 指针压力表读数3:C/C++实现指针压力表读数(可实时检测) https://blog.csdn.net/guyuealian/article/details/168873267
- 指针压力表读数4:Android实现指针压力表读数(可实时检测) 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开发版本

(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项目源码内容包含:
- Android Demo提供YOLO11n指针压力表目标检测C++推理代码
- Android Demo提供指针压力表:零刻度线、最大刻度线、指针起点和指针终点共四个关键点检测C++推理代码
- Android Demo提供MNN模型权重文件:高精度版本HRNet-w32,以及轻量化模型LiteHRNet和Mobilenet-v2模型,配置好环境,可直接运行
- OpenCV+base-utils+MNN所有依赖库都已经配置好,可直接build构建APP运行
- 项目MNN C/C++源码支持CPU和GPU运行,LiteHRNet可以达到实时检测效果,CPU(4线程) 约40ms左右,GPU OpenCL约30ms左右。
- Android Demo支持提供视频关键点去抖动算法(filter=true)
- Android Demo支持支持图片,视频,摄像头测试