我们知道在深度学习中,大家做得最多的工作就是数据处理,数据处理的过程占据了整个产品生命周期的大部分时间,因此如何高效的进行数据处理,是缩短产品周期的关键。

为了保证一个算法的不断优化,我们往往在训练完一个模型之后,需要进行模型的不断迭代,迭代过程中,我们需要将识别错误的样本挑选出来并进行二次标注。对于一个小的算法团队来说,标注增加了用人成本,小批量的数据交给外包反而不太合适。因此这里二次开发labelimg,形成了一个自动标注系统。

什么时候需要自动标注

自动标注需要我们实现一个训练好的模型。这个模型能够帮助我们识别实际中出现的情况,比如检测算法,此模型应当能够识别大部分数据,对于少部分识别不了的,识别错误的,需要人工手动确认。

就是之前我所写文章中出现的黑色头发和黑色帽子的识别例子。我们需要将识别错误的、未识别的数据列举出来,然后投入到数据集中进行再次训练。

这样我们能够简单确认目标有没有被正确框中,对于没有框中的少部分数据进行二次标注。当然,为了保证准确性,这里检测的阈值应该设置相对较高。

修改labelimg

这里我们以yolov5训练并转换成onnx的模型为例,介绍一些细节。

图像标注的操作过程(基于labelimg的自动标注系统)(1)

读取图片

我们查看代码可以知道,labelimg打开文件之后,直接读取下一张图片并进行展示,并且其逻辑是:先导入图片,然后在文件下找是否存在该标注文件,然后导入标注文件。因此我们只需要在导入每一张图片后直接保存识别结果就可以了。这里修改了默认,让图片和标注文件在同一个文件夹下。

保存的逻辑很简单,就是利用xml.etree.ElementTree根据标注的xml结构进行添加并保存即可。这里不再赘述。

图像标注的操作过程(基于labelimg的自动标注系统)(2)

保存xml

效果

图像标注的操作过程(基于labelimg的自动标注系统)(3)

识别效果

自动标注系统完成之后,就不用脚本先生成标注框,然后打开labelimg一个一个地去确认是否标注正确了,直接当场确认,效率提高了一些。

后续将在界面上修改,添加更多检测框架,一键导入模型。

今天尝试头条代码块发现居然不能使用,真是醉了。

本文完

,