web-dev-qa-db-ja.com

COCOデータセットからマスク画像を作成するにはどうすればよいですか?

だから私はこのコードを使っています、。 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)

しかし、私が得るものはこのようなものです

enter image description here

でも欲しいのはこんな感じ

enter image description here

各画像に対して生のマスクを取得するにはどうすればよいですか?

6
Farshid Rayhan

私はパーティーに遅れていますが、これが誰かを助けることができれば。コードがアプリケーションで機能するかどうかはわかりませんが、マスクの各ピクセルに注釈カテゴリIDの値を持たせたい場合は、マスクを追加するだけでは不十分です。一部が重複するためです。私はそのために最大値を使用しました:

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の私のコードの例です: Coco2017-47112With the code above 灰色の陰影の値は、データセットの説明で説明されているカテゴリのIDです。
ここでは、ピザがポリゴンの端でテーブルと重なっていることに注意してください。マスクを追加すると、重なりはピザとテーブルのクラスの合計に対応するIDになります。ただし、maxを使用すると、クラスの1つだけが保持されます。この場合、クラステーブルのIDがクラスピザのIDより大きいため、ピザが上に視覚的に表示されていても、重なりはクラステーブルに影響します。しかし、これを簡単に修正できるかどうかはわかりません。

1