整理个20年左右做的项目:圆形指针仪表读数识别。主要分为四个模块:圆形仪表检测——指针分割——刻度线检测——读数计算。针对这四个模块准备做一个系列,先从最简单的指针分割开始,指针分割数据放在最后。先看下指针分割最终效果(绿色为mask)。
简单记录下开发过程:
一、先找开源的,baidu的paddle模块使用了deeplabv3模型做训练。试了下在自带的测试集上效果还凑合,不过数据是真的少,就那两个表来回拍了几百张,故在项目工厂实拍的少部分数据集上测试,鲁棒性太差。表盘稍微脏一些,或者指针样式不一样,均导致效果不理想。
这里简单说一下,如果考虑部署场景是单一固定场景,比如针对某个工厂是单个项目的形式,可以考虑直接把该工厂的所有数据塞进训练过拟合就可以了。不过本文的项目还要求模型的通用性,只能去找找其他数据,找了一圈,除了baidu还真没有其他数据集了,看来这个数据真心太小众了。
二、爬数据
由于指针分割数据稀缺,只能考虑爬数据了。事实如下:在谷歌、bing搜索图片,关键词为圆形仪表盘、round meter等。爬下来后,先使用小部分数据,用paddle预训练模型推理出批量结果,作为伪标签,再对这批伪标签进行筛选,修改标注等,作为下一次deeplabv3的训练数据。如此训练、伪标签、修正迭代几次,花了几天时间,总算能得到鲁棒性较强的效果,同时也搞了2000+张的不同仪表盘的指针数据。根据这些年的实践经验,搞AI相关的开发,数据集不成熟的,大半时间都在搞数据。
三、deeplabv3模型测试
训练完成后,IOU指标看着也还行,但质检问题数据时,发现小部分数据的推理效果较为奇怪,挺清晰的指针推理出来跟狗啃的一样,调了一些参数也没发现哪的问题,考虑开发效率,只能尝试下Unet了。
不得不吐槽下,使用paddle配环境的时候经常报错,readme还有错别字你敢信,给人感觉更像小作坊出品而非大厂。
四、Unet模型测试
Unet还是比较成熟了,github链接搜一下,选了个star最多的,花了点工夫改成自己的数据集,效果和鲁棒性都杠杠的,总体感受比paddle好用一些。开发过程整理就不赘述了。
demo数据:https://download.csdn.net/download/beicheng3849/87449211
data1(收费):1000+张数据
data2(收费):1000+张数据