Far*_*han 5 python image-processing computer-vision image-segmentation tensorflow
所以我一直在使用这段代码。我正在尝试从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)
Run Code Online (Sandbox Code Playgroud)
但是我得到的是这样的东西
但是我想要的是这样的
如何获得针对每个图像的原始蒙版?
Kei*_*iku 18
完整的代码不在答案中,所以我将其发布在下面。
请先安装pycocotools
。
pip install pycocotools
Run Code Online (Sandbox Code Playgroud)
导入所需的模块。我假设您使用的是 jupyter 笔记本。
pip install pycocotools
Run Code Online (Sandbox Code Playgroud)
加载 coco 数据集的注释。此处指定 74 图像。
from pycocotools.coco import COCO
import os
from PIL import Image
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
Run Code Online (Sandbox Code Playgroud)
加载的信息img
如下。
coco = COCO('../datasets/coco/annotations/instances_train2017.json')
img_dir = '../datasets/coco/train2017'
image_id = 74
img = coco.imgs[image_id]
# loading annotations into memory...
# Done (t=12.70s)
# creating index...
# index created!
Run Code Online (Sandbox Code Playgroud)
显示图像如下。
img
# {'license': 2,
# 'file_name': '000000000074.jpg',
# 'coco_url': # 'http://images.cocodataset.org/train2017/000000000074.jpg',
# 'height': 426,
# 'width': 640,
# 'date_captured': '2013-11-15 03:08:44',
# 'flickr_url': # 'http://farm5.staticflickr.com/4087/5078192399_aaefdb5074_z.jpg# ',
# 'id': 74}
Run Code Online (Sandbox Code Playgroud)
如果你想查看叠加结果:
image = np.array(Image.open(os.path.join(img_dir, img['file_name'])))
plt.imshow(image, interpolation='nearest')
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果您只想查看面具,正如 Farshid Rayhan 回答的那样,请执行以下操作:
plt.imshow(image)
cat_ids = coco.getCatIds()
anns_ids = coco.getAnnIds(imgIds=img['id'], catIds=cat_ids, iscrowd=None)
anns = coco.loadAnns(anns_ids)
coco.showAnns(anns)
Run Code Online (Sandbox Code Playgroud)
我参加聚会迟到了,但如果这可以帮助别人。我不知道您的代码是否适用于您的应用程序,但是,如果您希望蒙版的每个像素都具有注释类别 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'])
Run Code Online (Sandbox Code Playgroud)
编辑:这是我在 2017 年数据集的图像 47112 上的代码示例:
灰色阴影的值是数据集描述中描述的类别的 ID。
请注意,这里披萨与桌子的多边形边缘重叠。如果我们添加掩码,重叠部分将被赋予一个 id,该 id 对应于 Pizza 和 Table 类的总和。然而,使用 max 时,仅保留该类中的一个。在这种情况下,由于类表的 id 大于披萨类的 id,因此即使披萨在视觉上位于上方,重叠也会影响类表。但我不确定这是否可以轻松解决。
按照 Filippo 先生的直觉,我能够编写正确的代码,看起来像这样。
mask = coco.annToMask(anns[0])
for i in range(len(anns)):
mask += coco.annToMask(anns[i])
plt.imshow(mask)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3987 次 |
最近记录: |