来自pycocotools的函数注释
#定义了以下API函数: COCO—加载COCO注释文件并准备数据结构的COCO api类。 decodeMask:解码通过游程长度编码编码的二进制掩码M。 encodeMask:使用游程编码对二进制掩码M进行编码。 getAnnIds:获取满足给定筛选条件的ann ID。 getCatIds:获取满足给定筛选条件的cat ID。 getImgIds:获取满足给定筛选条件的img ID。 loadAnns:加载具有指定ID的ANN。 loadCats:使用指定ID加载CAT。 loadImgs:使用指定的ID加载imgs。 annToMask:将注释中的分段转换为二进制掩码。 showAnns:显示指定的注释。 loadRes:加载算法结果并创建用于访问它们的API。 download:从mscoco下载COCO图像。组织服务器。 在整个API中,“ann”=注释,“cat”=类别,“img”=图像。 有关每个功能的帮助可通过以下方式访问:“Help COCO>function”
以instances_val2017.json为例,调用pycocotools,读取COCO类
from pycocotools.coco import COCO json_file = r'instances_val2017.json' coco = COCO(json_file)
print(coco.dataset.keys())
输出结果
dict_keys(['info', 'licenses', 'images', 'annotations', 'categories'])
函数说明
有的博客说还有一个关键索引type,但是我没找到
img_id = img_id_list[2] ann_ids = coco.getAnnIds(imgIds=[img_id]) print(ann_ids)
输出结果
[481918, 489768, 495624, 1424143, 1437313, 1507017, 1804847]
函数说明
getAnnIds函数有四个参数,imgIds=[]、catIds=[]、areaRng=[]、iscrowd=None,areaRng是图像区域,iscrowd是标注信息中的一个属性,输出的是满足条件的标注信息ID
anns = coco.loadAnns(ids=ann_ids) print(anns)
输出结果
[{"segmentation": [[510.66,423.01,511.72,420.03,510.45......]],"area": 702.1057499999998,"iscrowd": 0,"image_id": 289343,"bbox": [473.07,395.93,38.65,28.67],"category_id": 18,"id": 1768},......]
函数说明
loadAnns函数只有一个参数ids,代表输入的标注ID列表,输出对应ID的详细标注信息
catidlist = coco.getCatIds() print(catidlist)
输出结果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40......]
函数说明
getCatIds函数三个参数,分别是catNms=[], supNms=[], catIds,catNms输入的是类别名,supNms输入的是父类名,catIds输入的是想要类别的id,返回的是满足条件的全部id
coco数据集中类别id是不连号的,原因不知道
catcls = coco.loadCats() print(catcls)
输出结果
[{'supercategory': 'outdoor', 'id': 13, 'name': 'stop sign'}]
函数说明
loadCats函数只有一个参数ids,输入的是类别的id,得到的是类别id的详细信息
img_id_list = coco.getImgIds() print(img_id_list) print(len(img_id_list))
输出结果
[397133, 37777.....]
5000
函数说明
getImgIds有两个参数imgIds=[], catIds=[],imgIds指定图像ID范围,catIds指定类别范围,函数会返回同时满足两者条件的图像ID
img_id = img_id_list[2] img_info = coco.loadImgs(ids=[img_id]) print(img_info)
输出结果
[{'license': 4, 'file_name': '000000252219.jpg', 'coco_url': 'http://images.cocodataset.org/val2017/000000252219.jpg', 'height': 428, 'width': 640, 'date_captured': '2013-11-14 22:32:02', 'flickr_url': 'http://farm4.staticflickr.com/3446/3232237447_13d84bd0a1_z.jpg', 'id': 252219}]
函数说明
loadImgs只有一个参数ids,输入的是个图像id的列表,如果是一个图像直接输入id也可以。
输出的是json文档中对应的图像信息,输入的img_id同输出中的'id': 252219
之后就可以读取图像信息了,如图像名,图像宽、高
import skimage.io as io import matplotlib.pyplot as plt catIds = coco.getCatIds(catNms=['person', 'dog']) imgIds = coco.getImgIds(catIds=catIds) index = 11 img = coco.loadImgs(imgIds[index])[0] print(img['coco_url']) i = io.imread(img['coco_url']) #i = cv2.imread(os.path.join(r'E:\datasets\coco\val2017', 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) plt.savefig('testblueline.jpg') plt.show()
输出结果
函数说明
showAnns函数有两个参数anns, draw_bbox,anns输入的是图像的标注信息,draw_bbox是是否在结果中画框、默认为False
showAnns函数中图像绘制语句是用matplotlib.pyplot写的,因此只能用plt绘制结果
可以使用io.imread(img['coco_url'])读取网络图像,也可以使用i = cv2.imread(os.path.join(r'E:\datasets\coco\val2017', img['file_name']))读取本地图像
plt.imshow(i)绘制图像i,plt.show()显示绘制结果,这两个语句完全不同,没有语句plt.show(),无法显示绘制结果
COCO数据集的标注文档中,还有关键点的标注文件person_keypoints_val2017.json,也可以使用此语句进行绘制
from pycocotools.coco import COCO import skimage.io as io import matplotlib.pyplot as plt import cv2 if __name__ == '__main__': json_file = r'instances_val2017.json' coco = COCO(json_file) print(coco.dataset.keys()) #类别信息 catIds = coco.getCatIds(catNms=['dog']) catInfo = coco.loadCats(catIds) print(f"catIds:{catIds}") print(f"catcls:{catInfo}") #图像信息 imgIds = coco.getImgIds(catIds=catIds) index = 5 #随便选择一张图 imgInfo = coco.loadImgs(imgIds[index])[0] print(f"imgIds:{imgIds}") print(f"img:{imgInfo}") #标注信息 annIds = coco.getAnnIds(imgIds=imgInfo['id'], catIds=catIds, iscrowd=None) annsInfo = coco.loadAnns(annIds) print(f"annIds:{annIds}") print(f"annsInfo:{annsInfo}") #显示图像 i = io.imread(imgInfo['coco_url']) #i = cv2.imread(os.path.join(r'E:\datasets\coco\val2017', img['file_name'])) plt.imshow(i) plt.axis('off') coco.showAnns(annsInfo, True) #plt.savefig('testbluelinew.jpg') plt.show()
pycocotools库的安装和使用方法_ayiya_Oese的博客-CSDN博客_pycocotools使用
【笔记】JSON :COCO API 读取 COCO数据集_程序猿的探索之路的博客-CSDN博客_coco数据集读取
pycocotools使用教程,基础版_持久决心的博客-CSDN博客_pycocotools