1 安装COCO API
reference: https://blog.csdn.net/qq_41847324/article/details/86224628 ----------安装COCO API
1.1 下载cocoapi,在终端输入:
git clone [email protected]:lucky-ing/cocoapi.git
1.2 可以看到一个cocoapi的文件夹,进入coco/PythonAPI中
cd cocoapi/PythonAPI
1.3 开始安装 在终端输入如下命令:
python3 setup.py build_ext install
1.4 完成cocoapi创建
2 使用COCO API
reference: https://blog.csdn.net/gzj2013/article/details/82421166 -------COCO API源码
2.1 将pycocotools复制到你的项目目录下,即可通过from pycocotools.coco import COCO来使用COCO API,假设目标检测项目名为objectDetection:
cd .../object
cp -r cocoapi/PythonAPI/pycocotools objectDetection/
note: 后续如无特别说明,下面的code我们都是在objectDetection目录下的操作,文章涉及到的相关文件都在:
note: 问题: ModuleNotFoundError: No module named 'pycocotools._mask'
解决: https://github.com/cocodataset/cocoapi/issues/59
python3 setup.py build_ext --inplace
in the PythonAPI folder for python3
2.2 COCO API介绍
A) . coco数据集是Microsoft收集制作并用于Detection + Segmentation + Localization + Captioning的数据集,COCO2017一共有25G左右图片和600M左右的标注文件( annotations );
CoCo数据集一共有80个小类别,分别为:
[‘person’, ‘bicycle’, ‘car’, ‘motorcycle’, ‘airplane’, ‘bus’, ‘train’, ‘truck’, ‘boat’, ‘traffic light’, ‘fire hydrant’, ‘stop sign’, ‘parking meter’, ‘bench’, ‘bird’, ‘cat’, ‘dog’, ‘horse’, ‘sheep’, ‘cow’, ‘elephant’, ‘bear’, ‘zebra’, ‘giraffe’, ‘backpack’, ‘umbrella’, ‘handbag’, ‘tie’, ‘suitcase’, ‘frisbee’, ‘skis’, ‘snowboard’, ‘sports ball’, ‘kite’, ‘baseball bat’, ‘baseball glove’, ‘skateboard’, ‘surfboard’, ‘tennis racket’, ‘bottle’, ‘wine glass’, ‘cup’, ‘fork’, ‘knife’, ‘spoon’, ‘bowl’, ‘banana’, ‘apple’, ‘sandwich’, ‘orange’, ‘broccoli’, ‘carrot’, ‘hot dog’, ‘pizza’, ‘donut’, ‘cake’, ‘chair’, ‘couch’, ‘potted plant’, ‘bed’, ‘dining table’, ‘toilet’, ‘tv’, ‘laptop’, ‘mouse’, ‘remote’, ‘keyboard’, ‘cell phone’, ‘microwave’, ‘oven’, ‘toaster’, ‘sink’, ‘refrigerator’, ‘book’, ‘clock’, ‘vase’, ‘scissors’, ‘teddy bear’, ‘hair drier’, ‘toothbrush’]
有12大类,分别为:
[‘appliance’, ‘food’, ‘indoor’, ‘accessory’, ‘electronic’, ‘furniture’, ‘vehicle’, ‘sports’, ‘animal’, ‘kitchen’, ‘person’, ‘outdoor’]
B) . COCO.py中定义一下API:
COCO 类 - 用于加载 COCO 标注文件并准备所需的数据结构.
encodeMask - Encode binary mask M using run-length encoding.
decodeMask - Decode binary mask M encoded via run-length encoding.
getCatIds - 获取满足条件的类别的 ids.
getImgIds - 获取满足条件的图片的 ids.
loadImgs - 加载指定 ids 对应的图片.
getAnnIds - 获取满足条件的标注信息的 ids.
loadAnns - 加载指定 ids 对应的标注信息.
showAnns - 显示指定 ids 的标注信息到对应的图片上.
loadCats - 加载指定 ids 对应的类别.-----------------现实所有类别及超类是用
download - 从 mscoco.org 服务器下载 COCO 图片数据集.------------------下载时用
loadRes - 加载算法的结果并创建可用于访问数据的 API .
annToMask - 将 segmentation 标注信息转换为二值 mask.
理解 API 功能的关键是理解这里边包含的几种 ID 信息:图片 ID、类别 ID 和标注信息 ID。
在给定的 API 中, “ann”=annotation, “cat”=category, and “img”=image
C) . COCO类的构造函数
COCO类的构造函数负责加载json文件,并在标注信息 图片ID 标注信息 类别ID三者之间建立关联关系,关联关系存在以下两个变量中:
imgToAnns: 将图片id和标注信息 关联 ----1对多关系
catToImgs: 将类别id和图片id 关联 ----1对多关系
好处是: 对于给定的图片 id, 可快速找到它所有的标注信息; 对于给定的类别 id, 可快速找到属于该类的所有图片.
(1) 将数据集及标签解压到objectDetection/COCO目录下, 如下结构:
instances_val2017.json
val2017
(2) 导入COCO及配置相关路径
from pycocotools.coco import COCO
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
dataDir='COCO'
dataType='train2017'
annFile='%s/instances_%s.json'%(dataDir,dataType)
(3) 初始化COCO API :
coco = COCO(annFile)
(4) 显示COCO的所有类别及其父类
cats = coco.loadCats(coco.getCatIds())
nms=[cat['name'] for cat in cats]
print ('COCO categories: \n\n', ' '.join(nms))
nms = set([cat['supercategory'] for cat in cats])
print ('COCO supercategories: \n', ' '.join(nms))
接下来册COCO API的操作参考以下两个reference:
COCO Python API使用篇: https://blog.csdn.net/gzj2013/article/details/82385164
COCO2017数据集api说明: https://blog.csdn.net/zym19941119/article/details/80241663
常见应用步骤:
1 getCatIds( catNms = [] , supNms = [] , catIds = [] )
输入: 类别名称,或大类名称, 或类别ID
输出:图片所属类别id
当然,catNms可包括多个类别名称
例子: catIds = coco.getCatIds( catNms = ["dog"] ) # 单类别
catIds = coco.getCatIds( catNms = ["dog" , "person", "cat" ])
2 getImgIds( imgIds = [], catIds = [])
输入: 图片id 或图片所属类别id (1中的结果: catIds)
输出: 图片id ----是一个list
例子: imgIds = coco.getImgIds( catIds = catIds )
imgIds = coco.getImgIds( imgIds = [324158] ) # "image_id" : 324158
3. loadImgs( ids = [] )
输入: 图片i ( 2 中的结果:imgIds)
输出: 图片信息字典-----加载图片(可能是多张)
note: 最终得到的img并不是一张numpy格式或是PIL格式的图片,而是一个字典,包含了我们找到的这个id所代表的图片的信息
例子: img = coco.loadImgs(imgIds[np.random.randint(0, len(imgIds))])[0]
4 getAnnIds( imgIds = [], catIds = [], areaRng = [], iscrowd=None )
输入: 图片id( 3中的结果), 类别id, 实例面积,是否是人群
输出: 图片对应的注释id-----是一个list
例子: annIds = coco.getAnnIds( imgIds = img['id'], catIds = catIds, iscrow = None )
5 loadAnns( ids = [] )
输入: 图片注释id( 4中结果)
输出: 注释id的具体形状位置信息----也是一个list
例子: anns = coco.loadAnns(annIds)
6 showAnns( anns )
输入: 标注信息画在分割结果上
输出: 一张有标注信息的分割图
例子: coco.showAnns(anns)
in short:
4 5 6 连贯性说明:getAnnIds() 函数会根据 image id 来获取这张图对应的标注信息的 id, 然后 loadAnns() 函数会显示指定 id 的标注信息到图片上.
疑问: 标注信息对应的图片已经显示在当前的 “figure” 对象上了, 那么标注信息是如何找到这个 “figure” 对象的?
loadAnns() 函数内会调用 plt.gca() 函数来获取当前 “figure” 对象的轴( x轴 y轴 ), 如果存在的话直接返回, 不存在的话会新建一个"figure" 对象, 并将其轴返回.-------------------------loadAnns()自动捕捉figure()对象
1 2 3 4 5 6 连贯性说明: 图像类别---> 1 coco.getCatIds --->图像所属类别Ids ---->2 getImgIds---->图片Ids ---->3 loadImgs---->图像信息字典( 可能是多张图像 ) + 图像类别ids---->4 getAnnIds---->图像对应注释id----->5 loadAnns---->图像对应注释信息---->6 showAnns---->带有注释信息的分割图