目标检测数据集 - MS COCO


在这里插入图片描述

论文:Microsoft COCO: Common Objects in Context

网址:https://arxiv.org/abs/1405.0312

官网:https://cocodataset.org/

1. 数据集介绍

MS COCO是一个非常大型,且常用的数据集,其中包括了目标检测、分割、图像描述等,其主要特征如下:

  • Object segmentation:目标集分割
  • Recognition in context:图像情景识别
  • Superpixel stuff segmentation:超像素分割
  • 330K image(>200K labeled):超过33万张图像,标注过的图像超过20万张
  • 1.5 million object instances:150万个对象实例
  • 80 object categories:80个目标类别
  • 91 stuff categories:91个材料类别
  • 5 captions per image:每张图像有5段情景描述
  • 250000 people with keypoints:对25万个人进行了关键点标注

什么是stuff类别?

  • stuff中包含没有明确边界的材料和对象

object的80类与stuff中的91类的区别在哪?

  • 简单的理解就是object80类是stuff91类的子集。如果仅仅是做目标检测,基本只用object80类即可。

与PASCAL VOC对比

在这里插入图片描述

与训练效果好,但是更费时。

数据集下载

进入MS COCO官网,点击Dataset->download

对于目标检测,主要下载三个文件:

  • 2017 Train images [118K/18GB]:训练过程中,使用到的所有图像文件
  • 2017 Val images [5K/1GB]:验证过程中使用到的所有图像文件
  • 2017 Train/Val annotations [241MB]:对于训练集和验证集的标注json文件

将下载好的文件都解压到同一文件夹下,可得到如下文件结构:

在这里插入图片描述

官方有给出一个关于标注文件的格式说明:https://cocodataset.org/#format-data

在instances_train2017.json中

在这里插入图片描述

注意:这里的category_id对应的是在stuff91类中的索引。

在这里插入图片描述

在类别中,有一个supercategory超类,为一些类别的统称。这里的id也是对应的stuff91种的索引。这里共80个类别,但是id并不是从1到80。所以,如果我们要去训练80个类别的目标检测网络的话,是需要做一个映射的,将这些类别的索引映射到1到80上。


2. 使用pycocotools读取数据

pycocotools,即python api tools of COCO。

COCO是一个大型的图像数据集,用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和LuaAPI,这些api有助于在COCO中加载、解析和可视化注释。Matlab和PythonAPI是完整的,LuaAPI只提供基本功能。

安装pycocotools

pip install pycocotools

使用pycocotools

import os.path

import matplotlib.pyplot as plt
from pycocotools.coco import COCO
from PIL import Image, ImageDraw, ImageFont

json_file = "/Volumes/zt/dataset/MS COCO2017/annotations/instances_val2017.json"
img_path = "/Volumes/zt/dataset/MS COCO2017/val2017"

# 加载coco json文件
coco = COCO(annotation_file=json_file)

# 获取json文件中所有图像的索引 并且进行排序
ids = list(sorted(coco.imgs.keys()))
print("number of images: {}".format(len(ids)))

# 获取所有coco类别标签
coco_classes = dict([(v["id"],v["name"]) for k,v in coco.cats.items()])

# 遍历前3张图像
for img_id in ids[:3]:
    # 获取对应图像id的所有标注目标的索引 annotations idx信息
    ann_ids = coco.getAnnIds(imgIds=img_id)
    # 根据标注目标的索引 annotations idx信息获取所有标注信息
    targets = coco.loadAnns(ann_ids)
    # 获取图像文件名称
    img_name = coco.loadImgs(img_id)[0]['file_name']
    # 读取图像 转为RGB格式
    img = Image.open(os.path.join(img_path,img_name)).convert("RGB")
    draw = ImageDraw.Draw(img)

    # 画出标注框
    for target in targets:
        x,y,w,h = target["bbox"]
        x1,y1,x2,y2 = x,y,int(x+w),int(y+h)
        draw.rectangle((x1,y1,x2,y2),width=3,outline="red")
        font = ImageFont.truetype('/System/Library/Fonts/Times.ttc', 24)
        draw.text((x1,y1),coco_classes[target["category_id"]],fill="red",font=font)

    plt.imshow(img)
    plt.show()

结果:

在这里插入图片描述


3. 验证mAP

首先要弄清楚cocoapi指定的数据格式(训练网络预测的结果),在官网的Evaluate下拉框中选择Results Format,可以看到每种任务的指定数据格式要求。

在这里插入图片描述

根据官方文档给的预测结果格式可以看到,我们需要以列表的形式保存结果,列表中的每个元素对应一个检测目标(每个元素都是字典类型),每个目标记录了四个信息:

  • image_id记录该目标所属图像的id(int类型)
  • category_id记录预测该目标的类别索引,注意这里索引是对应stuff中91个类别的索引信息(int类型)
  • bbox记录预测该目标的边界框信息,注意对应目标的[xmin,ymin,width,height](list[float]类型)
  • score记录预测该目标的概率(float类型)

计算mAP,代码实现:

from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval

# 载入coco2017验证集标注文件
# accumulate predictions from all iamges
coco_true = COCO(annotation_file='./instances_train2017.json')
# 载入网络在coco2017验证集上的预测结果
coco_pred = COCO(annotation_file='./predict_result.json')

coco_evaluator = COCOeval(cocoGt=coco_true, cocoDt=coco_pred,iouType='bbox')
coco_evaluator.evaluate()
coco_evaluator.accumulate()
coco_evaluator.summarize()
  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用:COCO数据集是一个用于目标检测和图像分割任务的常用数据集。它不包含背景,类别id从1开始,默认0留给背景。如果你的自己生成的json文件里有id为0的数据,你可以尝试将其删除。或者你可以修改你的代码,使其在读取数据时忽略掉id为0的标签。你可以参考之前的博文"labelme的使用",了解如何将自己的数据集转化为COCO格式。 引用:要加载ms-coco数据集,你需要使用pycocotools库。首先,你需要通过COCO类载入之前标注好的json文件,得到一个coco对象。然后,通过coco.loadRes()函数载入网络在数据集上的预测结果,得到一个coco对象。接下来,在COCOEval类中传入初始化参数cocoGT、cocoDT和iouType,其中cocoGT表示Ground Truth(真实标注信息),cocoDT表示自己预测的信息,iouType表示计算mAP时所采用的IoU类型(在目标检测任务中,传入bbox参数)。最后,调用.evaluate()、.accumulate()和.summarize()函数,就能计算出我们预测的结果和真实的目标边界框的mAP了。 引用:加载ms-coco数据集的整体概览示例如下:首先,载入coco标注文件,得到一个coco_true对象。然后,载入网络在数据集上的预测结果,得到一个coco_pre对象。接下来,创建一个COCOeval对象,传入参数cocoGt(即coco_true)、cocoDt(即coco_pre)和iouType(表示计算mAP时所采用的IoU类型)。然后,调用.evaluate()、.accumulate()和.summarize()函数,就能计算出我们预测的结果和真实的目标边界框的mAP了。 综上所述,要加载ms-coco数据集,你需要使用pycocotools库,并按照相应的步骤和代码逻辑进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MS COCO数据集及COCO的API简介](https://blog.csdn.net/Highlight_Jin/article/details/125022702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mango1698

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值