*********************** 代码 ***********************
from pycocotools.coco import COCO
annot_file = "../datasets/coco/annotations/instances_val2017.json"
coco = COCO(annot_file)
target_category_ids = coco.getCatIds(catNms=["person", "bicycle", "motorcycle"]) # [1, 2, 4]
# 根据类别id获取图片id
image_ids = coco.getImgIds(catIds=target_category_ids)
print(image_ids) # [125572, 11149, 8211, 266400, ...]
print(len(image_ids)) # 24
*********************** 分析 ***********************
第1感觉,3个类别,获取的图片id只有24个,太少了。自己造轮子实现获取images_ids(代码省略...),用其中的image_id: 45596,在instances_val2017.json里查找它的类别id,category_id: 1,但它没有出现在coco.getImgIds(catIds=target_category_ids)里。
点击.getCatIds(),跳到源码。源码如下:
def getImgIds(self, imgIds=[], catIds=[]):
imgIds = imgIds if _isArrayLike(imgIds) else [imgIds]
catIds = catIds if _isArrayLike(catIds) else [catIds]
if len(imgIds) == len(catIds) == 0:
ids = self.imgs.keys()
else:
ids = set(imgIds)
for i, catId in enumerate(catIds):
if i == 0 and len(ids) == 0:
ids = set(self.catToImgs[catId])
else:
ids &= set(self.catToImgs[catId])
return list(ids)
*********************** 定位问题 ***********************
问题在 ids &= set(self.catToImgs[catId])
& 是求两个集合的交集, | 是求两个集合的并集
应该使用 ids |= set(self.catToImgs[catId])
后记:本来想把issue提到github,但有人提了,用的是英文,对中文同学不友好,因此记录于此。
库也很久没更新了,自己修改源码即可。