【Pytorch】目标检测数据集

发布于:2024-05-20 ⋅ 阅读:(160) ⋅ 点赞:(0)

https://www.bilibili.com/video/BV1ZL4y1p7Cz/
https://blog.csdn.net/nanzhou520/article/details/134502419

目标检测 Object Detection :检测,不仅要找到图片上的所关心的目标 位置 ,同时还要识别出这个目标是什么 类别。主流的目标检测都是以 矩阵框 的形式进行输出的,而语义分割比目标检测的精度更高。

voc数据集

https://paperswithcode.com/dataset/pascal-voc
https://arleyzhang.github.io/articles/1dc20586/

很多优秀的计算机视觉模型比如分类,定位,检测,分割,动作识别等模型都是基于PASCAL VOC挑战赛及其数据集上推出的,尤其是一些目标检测模型(比如大名鼎鼎的R CNN系列,以及后面的YOLO,SSD等)。
在 ImageNet挑战赛上涌现了一大批优秀的分类模型,而PASCAL挑战赛上则是涌现了一大批优秀的目标检测和分割模型

http://host.robots.ox.ac.uk/pascal/VOC/ 官网
在这里插入图片描述
目前广大研究者们普遍使用的是 VOC2007和VOC2012数据集,因为二者是互斥的,不相容的。

数据集下载
在这里插入图片描述
直接在官网下载(通过迅雷可以下载的很快)

https://pytorch.org/vision/stable/generated/torchvision.datasets.VOCDetection.html
在这里插入图片描述

pytorch内置了voc数据集

数据集使用
论文中针对 VOC2007和VOC2012 的具体用法有以下几种:
1、只用VOC2007的trainval 训练,使用VOC2007的test测试
2、只用VOC2012的trainval 训练,使用VOC2012的test测试,这种用法很少使用,因为大家都会结合VOC2007使用
3、使用 VOC2007 的 train+val 和 VOC2012的 train+val 训练,然后使用 VOC2007的test测试,这个用法是论文中经常看到的 07+12 ,研究者可以自己测试在VOC2007上的结果,因为VOC2007的test是公开的。
4、使用 VOC2007 的 train+val+test 和 VOC2012的 train+val训练,然后使用 VOC2012的test测试,这个用法是论文中经常看到的 07++12 ,这种方法需提交到VOC官方服务器上评估结果,因为VOC2012 test没有公布。
5、先在 MS COCO 的 trainval 上预训练,再使用 VOC2007 的 train+val、 VOC2012的 train+val 微调训练,然后使用 VOC2007的test测试,这个用法是论文中经常看到的 07+12+COCO 。
6、先在 MS COCO 的 trainval 上预训练,再使用 VOC2007 的 train+val+test 、 VOC2012的 train+val 微调训练,然后使用 VOC2012的test测试 ,这个用法是论文中经常看到的 07++12+COCO,这种方法需提交到VOC官方服务器上评估结果,因为VOC2012 test没有公布。

VOC 2007数据集标注
PASCAL VOC 2007 数据集分为两部分:训练和验证集trainval,测试集test ,两部分各占数据总量的约 50%。其中trainval 又分为训练集和测试集,二者分别各占trainval的50%。
每张图片中有可能包含不只一个目标object。

在这里插入图片描述

标注文件如下
在这里插入图片描述

注意xy坐标轴位置
在这里插入图片描述

coco数据集

https://arleyzhang.github.io/articles/e5b86f16/
https://zhuanlan.zhihu.com/p/526556895
https://paperswithcode.com/dataset/coco
https://cocodataset.org/#home

VOC 数据集和 COCO 数据集是使用较多的数据集,COCO 数据集比 VOC 数据集大,适用于大型项目。
常用的是COCO2017

├── coco2017
       ├── train2017所有训练图像文件夹(118287)
       ├── val2017 所有验证图像文件夹(5000)
       ├── annotations:标注文件夹
                  ├── istances_train2017.json:对应目标检测、分割任务的训练集标注文件
                  ├── instances_val2017.json: 对应目标检测、分割任务的验证集标注文件
                  ├── captions_train2017.json: 对应图像描述的训练集标注文件
                  ├── captions_val2017.json: 对应图像描述的验证集标注文件
                  ├── person_keypoints_train2017.json: 对应人体关键点检测的训练集标注文件
                  ├── person_keypoints_val2017.json: 对应人体关键点检测的验证集标注文件

json是一个大字典,读取出json标注格式文件,实际上是一个dict,如下所示

{
    "info": info,
    "licenses": [license],
    "images": [image],
    "annotations": [annotation],
    "categories": [category]
}

其中image和annotations如下

image{
    "id": int,# 图片的ID编号(每张图片ID是唯一的)
    "width": int,#宽
    "height": int,#高
    "file_name": str,# 图片名
    "license": int,
    "flickr_url": str,# flickr网路地址
    "coco_url": str,# 网路地址路径
    "date_captured": datetime # 数据获取日期
}

annotations字段是包含多个annotation实例的一个列表,annotation类型本身又包含了一系列的字段,如这个目标的category id和segmentation mask。segmentation格式取决于这个实例是一个单个的对象(即iscrowd=0,将使用polygons格式)还是一组对象(即iscrowd=1,将使用RLE格式)。

annotation{
    "id": int, # 对象ID,因为每一个图像有不止一个对象,所以要对每一个对象编号(每个对象的ID是唯一的)
    "image_id": int,# 对应的图片ID(与images中的ID对应)
    "category_id": int,# 类别ID(与categories中的ID对应)
    "segmentation": RLE or [polygon],# 对象的边界点(边界多边形,此时iscrowd=0)。
    #segmentation格式取决于这个实例是一个单个的对象(即iscrowd=0,将使用polygons格式)还是一组对象(即iscrowd=1,将使用RLE格式)
    "area": float,# 区域面积
    "bbox": [x,y,width,height], # 定位边框 [x,y,w,h]
    "iscrowd": 0 or 1 #见下
}

标注自己的数据集

在线工具:https://www.makesense.ai/、https://cvat.org/
本地标注:精灵标注助手

pytorch加载数据集

https://pytorch.org/vision/stable/generated/torchvision.datasets.CocoCaptions.html#torchvision.datasets.CocoCaptions

import torchvision
from PIL import ImageDraw
COCO_dataset=torchvision.datasets.CocoDetection(root="D:\\目标检测数据集\\val2017\\val2017",
                                                annFile="D:\\目标检测数据集\\annotations_trainval2017\\annotations\\instances_val2017.json",
                                                )
image,info=COCO_dataset[0]

image_handler=ImageDraw.ImageDraw(image)
#取出info中的所有bbox  在info里面循环取出bbox
for annotation in info:
    x_min,y_min,width,height=annotation['bbox']
    image_handler.rectangle(((x_min,y_min),(x_min+width,y_min+height)))

image.show()

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到