所以我一直在使用这段代码。我试图从COCO数据集生成图像的原始掩码。
dataDir='G:'
dataType='train2014'
annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)
coco=COCO(annFile)
annFile = '{}/annotations/person_keypoints_{}.json'.format(dataDir,dataType)
coco_kps=COCO(annFile)
catIds = coco.getCatIds(catNms=['person'])
imgIds = coco.getImgIds(catIds=catIds );
imgIds = coco.getImgIds(imgIds = imgIds[0])
img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
I = io.imread('G:/train2014/'+img['file_name'])
plt.imshow(I); plt.axis('off')
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
coco.showAnns(anns)
但我得到的是像这样的东西
但我想要的是这样的
如何针对每张图片获取原始蒙版?
答案 0 :(得分:2)
不熟悉COCO,但我发现有annToMask
函数可以为每个注释生成二进制掩码。
所以在未经测试的伪代码中,假设没有重叠的掩码,你应该有类似的东西:
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
mask = np.zeros_like(img)
for i, ann in enumerate(annIds):
mask += coco.annToMask(ann) * i
答案 1 :(得分:2)
根据Filippo先生的直觉,我能够制作正确的代码,看起来像这样。
mask = coco.annToMask(anns[0])
for i in range(len(anns)):
mask += coco.annToMask(anns[i])
plt.imshow(mask)
答案 2 :(得分:1)
我参加聚会很晚,但是如果可以帮助某人。 我不知道您的代码是否适用于您的应用程序,但是,如果您希望蒙版的每个像素都具有注释类别ID的值,那么您就不能仅添加蒙版,因为有些蒙版会重叠。我为此使用了最大的numpy:
cat_ids = coco.getCatIds()
anns_ids = coco.getAnnIds(imgIds=img['id'], catIds=cat_ids, iscrowd=None)
anns = coco.loadAnns(anns_ids)
anns_img = np.zeros((img['height'],img['width']))
for ann in anns:
anns_img = np.maximum(anns_img,coco.annToMask(ann)*ann['category_id'])
编辑:
这是我在2017年数据集的图像47112上的代码示例:
灰色阴影的值是数据集说明中所述的类别ID。
请注意,这里的比萨在多边形的边缘与桌子重叠。如果我们添加蒙版,则重叠部分将被赋予一个ID,该ID对应于比萨饼和餐桌的总和。但是,使用max只能保留其中一个类。在这种情况下,由于类别表的ID大于类别披萨的ID,因此即使披萨在上方可见,重叠也会影响类别表。我不确定这是否可以轻松解决。