基于计算机视觉的水表读数读取 | 案例分享

2021-05-07 11:04:08 浏览数 (1)

本文分享如何利用现有的技术解决 水表自动读数问题。 核心的思路是:定位数字区域并截取、将目标区域中的数字分割出来、识别各个位置的数字。 涉及的技术:YOLOv3 目标检测、图像处理、分类

可以自动化的任务必须是自动化的。但是,人类开发的普通任务被证明是由机器完成的复杂任务。图像中的数字阅读就是其中之一。

读取图像中数字的任务很容易被人类完成,但是当试图在机器上实现这一功能时,困难就出现了。光照条件、图像角度、噪声、清晰度等。有许多变量会影响系统的性能。

这个小项目分析了计算机视觉技术在用水表读数中的应用。

https://github.com/RodrigoSalles/Water_meter_computer_vision

确定目标

现在许多公司都接受通过电表/水表的照片来发送用电量和用水量的读数。这样公司就很容易面对成千上万需要处理的图像。

这个小项目旨在分析使这个过程自动化成为可能的技术。

通过做一点研究,你可以看到有几种解决方案。有些是“封闭式”的,而另一些只有在受控条件下才能表现良好。由于这些技术有很多应用的可能性,我发现多关注一点会很有趣,从而学到更多。

简而言之,项目的目标是读取仪表图像中的数字:

所使用的数据集来源:https://ieee-dataport.org/open-access/water-meter-dataset

思路拆解

如何读取图片中的数字?这里将这个问题分解成三个部分。

第一:在第一阶段的目标是找到一些方法来识别和截取感兴趣区域(roi),其中包括数字。

第二:现在的目标是分割第一步裁剪的图像中包含的数字

第三:读取步骤2产生的数字

现在开始做第一步:

有几种可能的方法来分割包含数字的区域。很多都是用来读取车牌的,基于形态学的操作,比如腐蚀、膨胀等。效果不错,但是这里想尝试一些更健壮的算法。例如使用卷积神经网络来完成这项任务。

为了实现这个目标,采用了YOLOv3系统(you look only once)。该算法利用了具有特殊性质的卷积神经网络。该网络只有完全连接的卷积网络(FCN)。它被称为Darknet-53,它包含53个卷积层,每个卷积层后面是一个batch normalization层和Leaky ReLU激活。(这里你也可以将其跟换成最新的算法例如 yolov4 yolov5 pp yolo 等等)

关于yolo 的训练教程,网上很多,这里分享一个youtube上分享的教程,以及一个包含1000多个水表图像的数据集(可以在这里找到)。

为了训练网络,我们需要自己标注图像。这里原作者采用LabelImg软件标记了500张图片(未公开)。

YOLO 教程:https://www.youtube.com/watch?v=_FNfRtXEbr4 数据集:https://ieee-dataport.org/open-access/water-meter-dataset

labelImg标注

这里使用google 的 colab来训练这个模型。在平台提供的GPU的帮助下,训练了5个小时,效果非常令人满意。

定位了感兴趣的区域后,很容易从获得的坐标中切出包含数字的区域。

测试图片:

第二步对裁剪的区域进行数字分割

裁剪的区域

这里使用传统的方法将第一步中的数字区域分割出来。具体的步骤如下:

1、将图片转为灰度图:

为问题选择了最佳阈值(使用TOZERO获得最佳结果-如果像素值小于所采用的限制,则将其设置为零,并保持其他值):

利用findContours函数(OpenCV)定位轮廓。对发现的轮廓进行排序,并根据其面积进行过滤。选择了最可能包含数字的区域的值。

所得结果如下:

这里比较尴尬的是,数字6没有被识别。

第三步:数字读取

MNIST dataset

最后一个阶段的任务是读取步骤2中分割的数字。为了完成这个任务,将采用另一个卷积神经网络,借助于著名的MNIST数据集进行训练。

MNIST数据集是一个缩写词,代表 Modified National Institute of Standards and Technology dataset。它是一个由60000个小正方形组成的数据集, 数字在0到9之间的28x28像素灰度图像。

算法得到的结果如下图所示。可以看出,网络表现良好,识别数字6的错误来自第二阶段。

下一步优化方向

该项目中最复杂的部分之一是分割。影响系统性能的因素很多,需要调整的参数也很多。如何改进这一制度?第一和第三阶段显示出良好的效果。错误出现在第二阶段。后面的数字识别也并不非常的准确。

0 人点赞