转载自:https://blog.csdn.net/weixin_48866452/article/details/123353367
基于深度学习的仪表盘识别
代码:https://github.com/HibikiJie/ReadMeter
权重文件:链接: https://pan.baidu.com/s/1wTPo1wJXrNyEFSu8RrD8Xw 密码: t0p4
将其放置于weight文件夹下,运行test.py,即可测试data\images\val下的图像文件
讲解
1.使用语义分割模型,在不同通道上分割出表盘和指针
2.环形的表盘展开为矩形图像
3.二维图像转换为一维数组
4.对刻度数组用均值滤波
5.定位指针相对刻度的位置
6.输出相对位置
7.语义分割模型采用的是U2Net
1、分割
使用U2NET分割得到指针和表盘的图像
2、表盘展开
通过以图像中心为原点,以一定宽度进行扫描,将仪表盘的刻度和指针展开为矩形的图像。
3、二维图像转换为一维数组
两张图像通过竖向叠加,转变为一维数组,绘制为折线图,如下图所示。
代码示例如下
def convert_1d_data(self, line_image): """ 将图片转换为1维数组 :param line_image: 展开的图片 :return: 一维数组 """ data_1d = numpy.zeros((self.line_width), dtype=numpy.int16) for col in range(self.line_width): for row in range(self.line_height): if line_image[row, col] == 1: data_1d[col] += 1 return data_1d
通过定位每一个尖峰的点,即可得刻度盘的个度数量,以及刻度的位置。
并可定位到指针在刻度盘中的相对位置,即可得到该表盘的百分比数值。
输出为:
{'scale_num': 32, 'num_sacle': 12.643678012947584, 'ratio': 0.39573756459893383}
其中’scale_num’指的是整个表盘拥有的刻度数量;
'num_sacle’指的是指针经过的刻度数量;
'ratio’指的是指针的相对位置可以用 ratio=num_sacle÷scale_num来表示
最后用满刻度乘上ratio即可得到最终的示数
而满刻度值为1.6,即可得度数为0.633