《南溪的目标检测学习笔记》——COCO数据集的学习笔记
Posted songyuc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《南溪的目标检测学习笔记》——COCO数据集的学习笔记相关的知识,希望对你有一定的参考价值。
1 COCO数据集
COCO数据集下载链接:COCO_download
1.1 数据概览
类别数量:80类
Dataset | number of images |
---|---|
train | 118287 |
val | 5000 |
目标数量
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官网中对小中大目标的定义进行了说明;
Type | Area |
---|---|
Small | 0 ≤ a ≤ 3 2 2 0 \\leq a \\leq 32^2 0≤a≤322 |
Medium | 3 2 2 ≤ a ≤ 9 6 2 32^2 \\leq a \\leq 96^2 322≤a≤962 |
Large | a ≥ 9 6 2 a \\geq 96^2 a≥962 |
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.linspace
的num
参数(采样个数)为整型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数据集的学习笔记的主要内容,如果未能解决你的问题,请参考以下文章