前言
目前在目标检测任务中,VOC和COCO是两个影响力最大的数据集系列。有时候我们希望将一些经典模型如RCNN、YOLO、SSD等运用到自己的数据集中,同时希望能够尽可能快的部署、验证,而不是花时间重新写一整套dataset和dataloader。此时我们可以将自己的数据集封装成VOC或COCO固定格式,然后对模型的接口做一些细微修改,就可以跑起来。
本文主要讨论COCO数据集的detection任务,并基于SSD-Pytorch的源码进行修改,将自己的数据集封装成COCO格式,并在SSD上跑起来。
关键词:COCO数据集
、SSD
、pytorch
、目标检测
注:编者水平有限,如有谬误,欢迎指正。若要转载,请注明出处,谢谢。
联系方式:
邮箱:yue_zhan@yahoo.com
QQ:1156356625
COCO-detection数据集格式
注:格式相对官方做了简化处理
数据集的格式一般用一个json文件表示,训练集测试集分开保存。数据集格式如下:
generated_list = {
"images": [],
"annotations": [],
"categories": []
拆开来,先说说images
,它是一个字典的列表,其中每个元素对应一个样本图片:
{
"file_name": 图片路径,
"width": 图片宽度,
"height": 图片高度,
"id": 图片编号}
前三项包含了文件的基本信息,id是最重要的一项,其编号是人为指定,与文件层级没有关系。
然后是annotations
,同样也是一个字典的列表,每个元素对应一个标注。
{
"image_id": 对应图片的编号,
"category_id": label,
"id": annotation编号,
"bbox": bbox}
这里的image_id和images
的id要对应起来,这两个id是必须一对多严格对应起来的,否则在调试的时候可能会出现loss能下降但是不收敛的情况(找错标注)。label是标注类别,K类的话对应就是0到K-1。annotations
也有一个id,这里的表示其自身的编号。因为一张图片对应多个标注框,所以annotation也要重新编号。bbox格式默认为XYWH格式,即[x, y, w, h]代表标注框左上角点x、y坐标与其宽高,其数据格式是列表。
最后是category
的格式,同样也是字典列表。不过对于一个数据集,这项是定长的,可以预先生成好。
{
"id": 0, #类别编号
"name": "类别名0"}
...
"id": K-1,
"name": "类别名1"}
对于普通的检测任务,这些数据就已经足够了,接下来是封装。
自定义数据集封装
对于数据的排列没有要求,只需要图片和标注的文件在一个目录就可以,至于目录的层叠嵌套没有什么影响。封装可以分为两个步骤:
数据集的划分可以根据个人需求来,现在假设数据集没有人为划分过,按比例随机进行划分。我按照8:2把训练集划成train和val两部分,然后把划分的文件路径
# 过滤有效样本对,图片和标注需要在同一目录下,且命名前缀一致,如果残缺则滤掉
def get_path_list(root_dir):
# 图片及标注格式
img_extensions = ['jpg', 'jpeg', 'bmp', 'png', 'gif']
annotation_extensions = ['json']
# 图片及标注的路径列表
images_path_list = []
annotations_path_list = []
# 遍历所有子路径
for root, dir, files in os.walk(root_dir):
if files:
files.sort()
imglist_org = [fn for fn in files if any(fn.endswith(ext) for ext in img_extensions)]
anlist_org = []
delete_index = []