在计算机视觉领域,为模型提供训练数据是一个繁琐的任务。即使假设训练图像适当地代表了推理场景,快速管理注释很快变成了一个挑战。在某些注释格式(如PASCAL VOCXML、YOLO DarkNet)中,每张图像都有一个注释文件。而在其他格式(如COCO JSON、TensorFlow Object Detection CSV)中,有一个单一的注释文件,用于表示所有图像的边界框。因此,一个特别具有挑战性的问题是确定哪些图像缺少注释——无论是意外还是故意的。
当图像中应该被注释的对象没有被注释时,就会发生缺失标注。这是有问题的,因为模型将被训练成对对象的假阴性。而当图像中没有对象出现,因此不需要记录边界框时,就会发生空标注。这并不一定是问题——实际上,这可能是为了训练一个模型,即对象并不总是出现在画面中。
让考虑一个国际象棋数据集的例子:上面可以看到四个不同棋盘状态的国际象棋图像。空棋盘状态没有棋子被注释;将在下面看到关于它的空标注信息。较浅的棋盘没有棋子被注释;它是缺失标注。较深的多棋子棋盘有13个棋子的注释;这是可能期望的正常状态。最后一个较深的棋盘只有一个棋子被注释;它也是正常状态。
没有棋子出现的棋盘不需要任何边界框。然而,可能仍然希望将这个图像包含在数据集中。在这种情况下,可能希望训练模型,即使没有棋子出现,一个有图案的棋盘也可以存在。
那么,如果希望在数据集中包含一个没有任何边界框的图像,如何在注释中表示这一点呢?这取决于注释格式。在PASCAL VOC XML中,如果将这个图像和注释包含在数据集中,可能会看到以下注释:
<annotation>
<folder></folder>
<filename>e0d38d159ad3a801d0304d7e275812cc.jpg</filename>
<path>e0d38d159ad3a801d0304d7e275812cc.jpg</path>
<source>
<database>roboflow.ai</database>
</source>
<size>
<width>2284</width>
<height>1529</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
</annotation>
这个注释包含了图像的名称、路径和大小。值得注意的是,这个注释不包含任何边界框信息。它是一个空标注。
同样的注释在COCO JSON中,图像被记录在JSON的images
部分,但在JSON的annotations
部分没有关于该图像的数据。在这种意义上,COCO JSON是在说,“这里是要包含在数据集中的图像”,以及“这里是那些图像的边界框”。如果有一个命名的图像但没有边界框,可以推断出有一个空示例图像。图像被记录,但不会有任何图像ID 0的注释。
"images": [
{
"id": 0,
"license": 1,
"file_name": "e0d38d159ad3a801d0304d7e275812cc_jpg.rf.0cd06a940ccc9894109d83792535e3eb.jpg",
"height": 416,
"width": 416,
"date_captured": "2020-03-27T21:30:28+00:00"
},
// ... 其他图像信息
]
Roboflow在上传时检查所有图像及其注释,并在任何注释缺失时警告用户。如果缺少标签,它们会显示在Roboflow中的“未标注”标签页中。上传时,Roboflow对所有图像和注释运行一个数据集健康检查。其中一项检查是针对缺失与空标注的。