labelme对同一类型的多个目标的识别问题

在使用labelme标记完图像后,我们可以使用labelme自带的一套转换工具:labelme_json_to_dataset.exe 将每个图片对应的json文件转化为一个后缀为_json的文件夹。 文件夹内容如下:

labelme对同一类型的多个目标的识别问题

其中最重要的是名为label.png的16位图片,包含了具体哪一个像素作为mask的重要信息,在实际应用中,我们还需要通过一套C++脚本将16位图转成8位,否则模型无法读取。

另一个要提到的重要问题是名为_viz.png的图片,点开如下labelme对同一类型的多个目标的识别问题

可以看到我们要学习的对象已经用不同的颜色区分开了,可以看到灰色代表0号class:背景,我们希望系统是别的对象bottle是1号class,用红色标记。加入后边的酒杯作为另一个对象被标记,则有可能被自动显示为蓝色或绿色,作为2号class:cup。

这种机制的缺陷在于,每张图片上同种类型的对象只能有一个,否则即使在标记时被标记为多个,作为mask显示时仍会被认为属于同一个对象(被一个boundingbox框住)。以下图为例:

labelme对同一类型的多个目标的识别问题

我在手动标记时标记了3个鼠标,然而因为他们属于同一class,导致这3个鼠标最终被判定为一个对象。之前我在cup数据集中使用了大量含有多个cup的图片,使得模型反复将两个甚至三个茶杯当做一个整体来识别。效果如下:

labelme对同一类型的多个目标的识别问题

不仅3个茶杯被放进了同一个包围盒,连下面的鼠标也被加上了mask。之前这个问题困扰了我好一阵子,经过仔细分析才发现了问题所在。后续训练时,我用的都是只包含一个对象的图片,上面的现象也再没有出现过。不过这种方法不利于用少量的图训练尽量多的对象的目标,毕竟一张图只能放一个嘛,而且转换过程也相当繁琐,还是推荐使用coco格式的转换方法,一步到位,图片的丰富程度也高了不少。