《南溪的目标检测学习笔记》——COCO数据集的学习笔记

Posted songyuc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《南溪的目标检测学习笔记》——COCO数据集的学习笔记相关的知识,希望对你有一定的参考价值。

1 COCO数据集

COCO数据集下载链接:COCO_download

1.1 数据概览

类别数量:80类

Datasetnumber of images
train118287
val5000

目标数量

Val集目标数: 36781 (整个val集包含的实例数量)

1.2 文件结构说明

train2017: 训练集图像文件夹。
val2017: 验证集图像文件夹。

文件结构树

├── 2017 Train Images [train2017.zip]
├── 2017 Val Images [val2017.zip]
├── 2017 Train/Val annotations [annotations_trainval2017.zip]
│   ├── annotations
│      ├── instances_val2017.json
├── 2017 Testing Image info [image_info_test2017.zip] [1MB]
│   ├── image_info_test2017.json

1.3 标注格式


	"info": info, // MMDet可省略
	"licenses": [license], // MMDet可省略
	"images": list, [images],
	"annotations": list, [annotations],
	"categories": list, [categories]

1.3.1 Images

image
	"id": int, // *图像唯一标志符
	"height": int, "width": int, // *高宽
	"file_name": str, // *文件名
	"license": int,
	"flickr_url": str,
	"coco_url": str,
	"date_captured": datetime, // 数据获取时间,MMDet未使用

1.3.2 Categories:目标类别

categories[
	"id": int, // 类别唯一标志符
	"name": str, // 类别名称
	"supercategory": str, // 父类,例如:bicycle -> vehicle
]

1.3.3 Annotations

	"id": int, // 目标实例唯一标志符
	"image_id": int, // 所属的图像文件
	"category_id": int, // 对应的类别
	"segmentation": RLE or [polygon], // 实例mask标注
	// iscrowd=1: RLE, iscrowd=1: [polygon] 
	"area": float, // 标注区域的面积
	"bbox": [x,y,width,height],
	"iscrowd": 0 or 1, // 0:单个目标实例,1:包含多个目标实例,例如:一群人

XY坐标范围: [ 0 , 640 ] [0,640] [0,640]
坐标数值类型:float(python基础类型)
说明:
坐标是从0开始
COCO在官方网站的说明中说到:

… In addition, an enclosing bounding box is provided for each object (box coordinates are measured from the top left image corner and are 0-indexed). …

1.4 数据集异常值

“包含width或height为0的目标框”

COCO数据集中包含width或height为0的目标框,在train集中这样的bbox有两个;

1.5 自定义数据集

# 定义数据集字典
import json

coco_output = 
    "images": [],
    "categories": [],
    "annotations": []

categories = ["id": 1, "name": "...",
              "id": 2, "name": "...",
              "id": 1, "name": "...", ...]
coco_output["categories"] = categories

# 遍历图像文件
image_list = None
image_id = None
for file_path in image_list:
    file_name = None
    height, width = None
    image_id += 1
    # 图像信息
    image_dict = 
        "file_name": file_name,
        "height": height,
        "width": width,
        "id:": image_id  # 图像标识字符串
    
    coco_output["images"].append(image_dict)
    # 图像中对应的目标信息
    intances = None
    annotation_id = None
    for ins in intances:
        annotation_id += 1
        anno_dict = 
            "id": annotation_id,
            "image_id": image_id,
            "category_id": ins.category_id,  # 类别标识符
            "bbox": ins.bbox,  # (x,y,w,h)
            "area": ins.bbox.area,
            "iscrowd": 0,  # 单个目标或是群体目标
        
        coco_output["annotations"].append(anno_dict)
# 写入.json文件
json.dump(coco_output, open("out_path"), 'w')

1.6 常用工具

1.6.1 查看JSON文件:Dadroit JSON Viewer

可以用来查看.json文件的具体内容;

2 COCO的评价指标——mAP

请参考我的博文《南溪的目标检测学习笔记》——目标检测的评价指标(mAP)

2.1 小、中、大目标的定义

COCO官网中对小中大目标的定义进行了说明

TypeArea
Small 0 ≤ a ≤ 3 2 2 0 \\leq a \\leq 32^2 0a322
Medium 3 2 2 ≤ a ≤ 9 6 2 32^2 \\leq a \\leq 96^2 322a962
Large a ≥ 9 6 2 a \\geq 96^2 a962

Note
官网说明没有写“ = = =”,而是表示关于面积的开区间,这里我们写了“ ≤ \\leq ”和“ ≥ \\geq ”是从[源代码]中看出来的。

3 Cocoapi使用:[doc]

在使用cocoapi之前,首先需要进行安装,
cocoapi的Github链接:cocodataset/cocoapi
cocoapi安装请参考:cocoapi#readme

3.1 安装

安装依赖库:

conda install numpy

3.1.1 Ubuntu备用安装(官方安装出现错误)

请使用如下命令进行安装:

pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

3.1.2 Windows平台安装cocoapi

cocoapi官方代码不支持Win10平台,这里我们使用CSDN社区提供的解决方案进行安装,请参考:《Windows10安装COCOAPI》

根据philferriere/cocoapi的说明,需要安装“Visual C++ build tools”,我们需要在提示信息中找到安装链接,
备用链接:visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools

Troubleshooting

(1)错误提示: " fatal: unable to access ‘https://github.com/philferriere/cocoapi.git/’: Recv failure: Connection was reset; fatal: could not fetch c5643680d5755a55d374769d9e8cd9084ab07ca9 from promisor remote; … You can inspect what was checked out with ‘git status’…"

错误提示如下:

Collecting git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
  Cloning https://github.com/philferriere/cocoapi.git to c:\\users\\xxx\\appdata\\local\\temp\\pip-req-build-jp9qfx6v
  Running command git clone --filter=blob:none --quiet https://github.com/philferriere/cocoapi.git 'C:\\Users\\xxx\\AppData\\Local\\Temp\\pip-req-build-jp9qfx6v'
  fatal: unable to access 'https://github.com/philferriere/cocoapi.git/': Recv failure: Connection was reset
  fatal: could not fetch c5643680d5755a55d374769d9e8cd9084ab07ca9 from promisor remote
  warning: Clone succeeded, but checkout failed.
  You can inspect what was checked out with 'git status'
  and retry with 'git restore --source=HEAD :/'
  error: subprocess-exited-with-error
  
  × git clone --filter=blob:none --quiet https://github.com/philferriere/cocoapi.git 'C:\\Users\\xxx\\AppData\\Local\\Temp\\pip-req-build-jp9qfx6v' did not run successfully.
  │ exit code: 128
  ╰─> See above for output.
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× git clone --filter=blob:none --quiet https://github.com/philferriere/cocoapi.git 'C:\\Users\\xxx\\AppData\\Local\\Temp\\pip-req-build-jp9qfx6v' did not run successfully.
│ exit code: 128
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.

这里主要的关键提示是:unable to access ‘https://github.com/philferriere/cocoapi.git/’: Recv failure: Connection was reset;意思是当前无法正常连接github网站;
解决方案:
开启VPN,使用智能代理就可以了;

(2)提示需要“Microsoft Visual C++ 14.0…”

解决方法请参阅《pip错误“Microsoft Visual C++ 14.0 is required.”解决办法 | Supernova》

安装时下面两个组件时必需的:

  • MSVC vx - VS 202x C++ x64/x86 生成工具 (Visual C++ 编译器和库)
  • Windows 1x SDK (Windows本地C++函数库)

3.1 mAP验证基本流程

annType = ['segm', 'bbox', 'keypoints']
annType = annType[1]
"""设置标注类型为bbox"""
print("[cocoapi]:", "loading data...")
# initialize COCO ground truth api
data_dir = ".../.../COCO"
"""Local root of COCO"""
ann_file = f'data_dir/annotations/instances_val2017.json'
cocoGt = COCO(ann_file)
# Get the image ids
coco_keys = list(sorted(cocoGt.imgs.keys()))
print("len(coco_keys):", len(coco_keys))

3.2 API函数说明

pycocotools.coco.COCO.loadRes(): Load result file and return a result api object.
参数说明:
resFile: 结果文件。(不接受Path对象

Class COCO(annotation_file=None) [source]

coco数据读取器。读取包含COCO格式数据的.json文件。

coco.getCatIds(catNms: [str]):获得指定类别的category_ids

示例:catIds = coco.getCatIds(catNms=['person','dog','skateboard'])

coco.getImgIds(catIds: [], imgIds: [int]):获得满足条件的 image_ids

示例:

catIds = coco.getCatIds(catNms=['person','dog','skateboard']);
imgIds = coco.getImgIds(catIds=catIds );
imgIds = coco.getImgIds(imgIds = [324158])

coco.loadImgs(ids: [int] | int):获得指定Ids的图像文件描述

imgIds = coco.getImgIds(imgIds = [324158])
img = coco.loadImgs(ids = 324158)[0]
# 因为返回值是list格式,所以使用[0]解包获得第一个值

coco.getAnnIds(imgIds: [] | int, catIds: [] | int, iscrowd=None):获得指定条件的ann_ids

img = coco.loadImgs(ids = 324158)[0]
catIds = coco.getCatIds(catNms=['person','dog','skateboard']);
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)

coco.loadAnns():获得指定ann_ids的标注信息描述

Returns: [dict_anns];返回包含anns的列表。

annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
print(anns)

示例信息如图所示,

coco.showAnns():获得指定ann_ids的标注信息描述

3.3 调试笔记

3.2.1 错误“TypeError: type <class ‘numpy.float64‘> cannot be safely interpreted as an integer”

请参考博文《【Python Solution】TypeError: type <class ‘numpy.float64‘> cannot be safely interpreted as an integer》
根据以上博文中的信息和错误提示可以知道,这里是由于cocoapi中np.linspace的使用问题导致的,其代码为

self.iouThrs = np.linspace(.5, 0.95, np.round((0.95 - .5) / .05) + 1, endpoint=True)
num = np.round((0.95 - .5) / .05) + 1

numpy中要求np.linspacenum参数(采样个数)为整型int

Note
在调试cocoapi时,我们使用了与old版本相适配的python环境,conda环境代码如下:

conda create --name conda-coco python=3.8
pip install numpy==1.17.5 -i https://pypi.doubanio.com/simple
conda install cython matplotlib
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

3 EDA

3.1 COCO数据集存在width或者height小于10像素的目标

在对COCO数据集进行探索性数据分析之后,我们知道COCO数据集中是存在很小的目标的,例如“width或者height小于10像素的目标”,

这里我们可以看看一个示例图像,

3.2 COCO中存在目标个数为0的图像——img_id–250对应的图片

COCO数据集会存在GT目标个数为0的图片,例如:img_id–250对应的图片;

3.3 COCO数据集不存在“图像稀疏”的问题

我们经过eda数据集后发现

可以看到COCO中图像最大的尺寸为(640,640),平均尺寸为(577,484),可以看到在W和H两个维度上,平均尺寸都超过了最大尺寸的一半(也就是320像素),所以COCO不存在“图像稀疏”的问题;

以上是关于《南溪的目标检测学习笔记》——COCO数据集的学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

《南溪的目标检测学习笔记》——目标检测的评价指标(mAP)

《南溪的目标检测学习笔记》——预训练微调的学习笔记

《南溪的目标检测学习笔记》——模型预处理的学习笔记

《南溪的目标检测学习笔记》——基础算子的学习笔记

《南溪的目标检测学习笔记》——性能优化的学习笔记

《南溪的目标检测学习笔记》——深度学习的假设