序言

记得之前参加过一个钢筋计数的比赛,虽然没有获得好的名次,但是觉得还是挺实用的。基于此,有感而发,构建了一个一次性筷子计数的数据集,整个过程并不是人工纯标注,分享一下事半功倍的构建过程。

一、数据准备

首先自己拍照收集一批图片,示例如下,大概拍了两百多张:
构建了一个用于目标检测点数的数据集(一次性筷子计数)_神经网络
构建了一个用于目标检测点数的数据集(一次性筷子计数)_上传_02
好了,数据收集完了,那下一步就是标注了,可是。。。这么多目标,一张图片就接近上百个框,这要标到啥时候?不怕,还记得我之前写过的yolov5实现半标注的文章吗?要学以致用,现在可以派上用场了。

二、半标注

首先选出10张比较具有代表性的图片数据,使用labelimg进行标注(想要完全人工不标注是不可能的,或多或少还是要标一点的),得到标注的结果(这里标注十张就够了,标注太多太累了)。
构建了一个用于目标检测点数的数据集(一次性筷子计数)_深度学习_03
得到标注的xml文件结果后,对这十张图像使用imgaug(使用imgaug数据增强,标注的结果会随着增强进行相应变化,不需要重新标注)进行数据增强,随机hsv空间变化、旋转、裁剪、高斯模糊等,每一张扩充9张数据,即得到100张用于训练一个差不多的模型,如下,上面十张是我原始数据,下面90张为数据增强后的数据(注意:因为这个数据比较特殊,目标是不受角度影响,而且目标比较多,所以随机选择任意角度是没问题的,其他数据的话如果增强这么多,有可能存在严重过拟合现象)。
构建了一个用于目标检测点数的数据集(一次性筷子计数)_神经网络_04

三、yolov5训练

对于这个数据集,100张足够训练出一个精度较高的模型了,因为我们的目的是用他来标注,并不是最终的模型。所以这里你可以选择一个精度很高的5模型,比如v5l(我们这步要确保精度要足够高,数据少没必要用小模型),训练过程这里就不阐述了,网上很多教程,100张数据训练还是很快的,迭代50个轮次,大概10-20分钟,训练结果如下,因为是但类别,所以没有类别损失:
构建了一个用于目标检测点数的数据集(一次性筷子计数)_神经网络_05
可以看到精确率可以达到0.9以上,召回率接近0.8+,map0.5也达到了0.8,map0.5:0.95稍微低一点,也达到了0.5。看着好像结果不怎样,要知道这只是100张图片的训练结果,要啥自行车。没关系,可视化看一下能不能用,我这里稍微修改了一下程序中图像输出的部分,把框变换成中心点在图上画出,结果更容易一目了然。
构建了一个用于目标检测点数的数据集(一次性筷子计数)_数据_06
构建了一个用于目标检测点数的数据集(一次性筷子计数)_神经网络_07
哎哟,好像还不错噢,虽然还是有一些预测错的,但是没关系,使用半标注程序得到输出后还可以进行使用labelimg再微调。

接着将所有收集的图片,使用半标注程序,进行预测,得到所有的输出xml文件。

四、labelimg微调

打开labelimg,加载图片和xmls文件夹,这时候你会看到密密麻麻的框,不禁会想到,这怎么调阿,一个一个找不得累死。。。(举个例子,你看到这张图你会咋想,难道要一个一个框去检查嘛?当然不用)
构建了一个用于目标检测点数的数据集(一次性筷子计数)_数据_08
这时候可以借助可视化的结果来进行微调就好了,例如上面提到的这张图,你一看过去是不是就知道那里的框有问题呢,所以微调起来也是轻轻松松的啦(不过这里要注意的是,在预测的时候半标注和正常预测阈值要设为一样,比如iou阈值、置信度阈值,不然的话你的两部分输出结果是不同的,这样微调起来也很麻烦)。
构建了一个用于目标检测点数的数据集(一次性筷子计数)_数据_06
最后微调完后就可以将全部的图像送入yolov5中正常训练了,当然如果图像还是不够,建议还是要使用离线数据增强来增加数据,这个需要自己权衡了。

五、效果展示

构建了一个用于目标检测点数的数据集(一次性筷子计数)_神经网络_10
构建了一个用于目标检测点数的数据集(一次性筷子计数)_神经网络_11
构建了一个用于目标检测点数的数据集(一次性筷子计数)_人工智能_12

很有趣也很实用的构建过程。代码没整理就不上传了,原理很简单可以自己尝试着去实现。

图片和标注文件已上传资源,需要的自行下载。
构建了一个用于目标检测点数的数据集(一次性筷子计数)_数据_13