随着人工智能行业的发展,深度学习中的神经网络结构越来越复杂。众所周知深度学习是数据驱动的,日益复杂的神经网络模型需要更多的训练数据作为底层的支撑。理论上,在算力满足要求的前提下,模型效果会随着数据数量的增多而变好。实践证明,在基于深度学习的应用开发过程中,数据规模和标注数据的质量是算法研发的关键因素。本文重点介绍目标检测中的数据标注流程以及如何制定标注规则。
数据标注是通过人工把需要识别和分辨的数据贴上标签。深度神经网络学习这些标注数据的特征,最终实现自主识别的功能。下面介绍几个目标检测中的标注通用规则:
目标检测数据标注流程分为以下几步:
下面我们通过项目详细介绍数据标注的完整流程。该项目是利用目标检测算法将图像中的光盘和非光盘分别识别出来,助力光盘活动。
我们根据识别场景来确定光盘的标准,通过分析得出以下几种情况可认为是光盘。第一种,干净的碗盘;第二种,碗盘中留有食物的汤水(比如说面汤,菜汁),残渣,尖椒段、生姜等你觉得不需要吃掉的内容;第三种,碗盘中留有食物,剩下东西是一小口能吃完。特别需要注意,此次标注只关注盛放食物的碗盘不关注托盘。
标注时候需要将图片所有碗盘利用标注工具画上矩形框,注意矩形框必须贴合所标注的碗盘,标签根据图像内容是否符合光盘标准选择光盘非光盘。特别的对于遮挡情况标注时需要脑补完整后画上矩形框,如下图示例中淡绿色矩形框代表光盘,灰色矩形框代表非光盘。
有了清晰的标注规则和标注用例,需要向标注人员详细的讲解标注规则,过程中需要详尽列举出标注正确和错误用例。有了对标注规则的清晰理解,标注人员就可以进行试标注了。在大概标注到 100 张图片时候需要进行标注检查。
对标注检查需要从以下几个方面进行:
一般来说,各个标签的目标框大致有 2000 个时候基本上就可以训练出有一定效果的模型了。在图像中因为一张照片中包含多个目标,在标注到 1000 张左右时候我们就开始训练模型,随后通过训练好的模型对 500 张未标注的图片进行识别(具体数目可以根据任务总量来定),将识别结果转化为标注生成的 voc 数据集通用的 xml 文件。具体代码如下:
from lxml.etree import Element, SubElement, tostring
#转化识别框为标注框
def getObject(node_root,xmin, xmax, ymin, ymax, lable):
node_object = SubElement(node_root, 'object')
node_fixed = SubElement(node_object, 'name')
node_fixed.text = lable
node_pose = SubElement(node_object, 'pose')
node_pose.text = 'Unspecified'
node_truncated = SubElement(node_object, 'truncated')
node_truncated.text = '0'
node_difficult = SubElement(node_object, 'difficult')
node_difficult.text = '0'
node_bndbox = SubElement(node_object, 'bndbox')
node_xmin = SubElement(node_bndbox, 'xmin')
node_xmin.text = str(xmin)
node_ymin = SubElement(node_bndbox, 'ymin')
node_ymin.text = str(ymin)
node_xmax = SubElement(node_bndbox, 'xmax')
node_xmax.text = str(xmax)
node_ymax = SubElement(node_bndbox, 'ymax')
node_ymax.text = str(ymax)
def iniXml(filename,filePath,width , height):
x,y,z,w, = filePath.rsplit("/",3)
node_root = Element('annotation')
node_folder = SubElement(node_root, 'folder')
node_folder.text = z
node_filename = SubElement(node_root, 'filename')
node_filename.text = filename
node_source = SubElement(node_root, 'source')
node_database = SubElement(node_source, 'database')
node_database.text ='Unknown'
node_database.text ='The VOC2007 DatabaseUnknown'
node_database = SubElement(node_source, 'annotation')
node_database.text =' PASCAL VOC2007'
node_database = SubElement(node_source, 'image')
node_database.text ='flickr'
node_size = SubElement(node_root, 'size')
node_width = SubElement(node_size, 'width')
node_width.text = str(width)
node_height = SubElement(node_size, 'height')
node_height.text = str(height)
node_depth = SubElement(node_size, 'depth')
node_depth.text = '3'
node_segmented = SubElement(node_size, 'segmented')
node_segmented.text = '1'
return node_root
num = input(r'num:')
image_root = 'xxx/images/rmb_'+num
fileList = os.listdir(image_root)
for file in fileList:
filePath = image_root + os.sep +file
data = {
"img":filePath,
"algorithmLabel":"xx",
"imgDataType":2
}
headers = {"Content-Type": "application/json"}
res = requests.post("http://ip:port/", data=json.dumps(data), headers=headers)
lableList = res.json().get("data")
img = Image.open(filePath)
width , height = img.size[0],img.size[1]
if len(lableList)!=0:
node_root = iniXml(file,filePath,width , height)
for lableinfo in lableList:
xmin, xmax, ymin, ymax, lable = getInfo(lableinfo)
getObject(node_root, xmin, xmax, ymin, ymax, lable)
xmlroot = '/home/ap/vrc/label-img-tools/_xml/rmb_'+num
if not os.path.exists(xmlroot):
os.makedirs(xmlroot)
xmlPath = xmlroot+os.sep+file.split(".",1)[0]+".xml"
## Write document to file
with open(xmlPath,'wb') as f:
f.write(etree.tostring(node_root, pretty_print = True, xml_declaration = True, encoding='UTF-8', standalone="yes"))
else:
continue
预标注后,我们可以将图片和标注生成 xml 文件放到标注工具上,便可直接在标注界面查看模型识别的效果。对预标注内容进行标注检查,可以发现试标注的不足之处。
在通过模型预标注之后,我们需要检查预标注结果以此来挖掘试标注的不足之处,随后根据不足之处进行补充标注。在此项目中检查发现预标注中非光盘存在很多漏标注情况,于是安排标注人员在预标注基础上进行补充标注。
补充标注完成后按照上述的三个检查方面对 500 多张图像的标注数据检查。随后利用该数据进行增量训练得到新模型;通过新模型对其他未标注部分图片进行预标注,标注人员对预标注数据进行修改完善。然后循环迭代模型增量训练——预标注——补充标注过程,直到得到好的模型效果。
当遇到目标检测需求,标注的流程是这样的:确定一个标注规则——试标注——对标注数据进行检查——训练——预标注效果反馈——补充标注——…
整个流程中标注规则制定尤为重要,需要总结业务提供的图像数据,确定标注类别和标签。对于不明确的类别需要实际场景进行细分,当需要合并某些类别时候,可以直接通过程序把类别合成一个类别进行训练。同时,标注的规则要尽可能地详尽;需要给出文档和样例。此外,在试标注和正式标注过程中遇到不确定情况时,需要及时进行沟通,否则可能会影响到整体标注质量。
本文转载自:金科优源汇(ID:jkyyh2020)
原文链接:目标检测中的数据标注
领取专属 10元无门槛券
私享最新 技术干货