常见的数据集格式有三种,分别为voc(xml)、coco(json)、yolo(txt)。
1 VOC
VOC数据集由五个部分构成:JPEGImages,Annotations,ImageSets,SegmentationClass以及SegmentationObject.
.
└── VOC #根目录
└── VOC2012 #不同年份的数据集
├── Annotations #存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等
├── ImageSets #该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本
│ ├── Action
│ ├── Layout
│ ├── Main
│ └── Segmentation
├── JPEGImages #存放源图片
├── SegmentationClass #存放的是图片,语义分割相关
└── SegmentationObject #存放的是图片,实例分割相关
- Annotations(注释):**数据集标签的存储路径,通过XML文件格式,为图像数据存储各类任务的标签。**每张图片对应一个.xml文件
<annotation>
<folder>VOC2012</folder> # 图片所处文件夹
<filename>2007_000027.jpg</filename> # 图片名称
<source> # 图片来源信息
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
</source>
<size> # 图片大小信息
<width>486</width>
<height>500</height>
<depth>3</depth>
</size>
<segmented>0</segmented> # 是否有分割label
<object> # 图片所包含的物体(每个物体一个object)
<name>person</name> # 物体名称
<pose>Unspecified</pose> # 物体姿态
<truncated>0</truncated> #物体是否被部分遮挡
<difficult>0</difficult> # 是否为难以辨识的物体, 主要指要结体背景才能判断出类别的物体。
<bndbox> #物体的bound box(矩形)
<xmin>174</xmin> # 左
<ymin>101</ymin> # 上
<xmax>349</xmax># 右
<ymax>351</ymax># 下
</bndbox>
<part> # 物体的部分
<name>head</name> # 部分名称
<bndbox># 部分的bound box(矩形)
<xmin>169</xmin>
<ymin>104</ymin>
<xmax>209</xmax>
<ymax>146</ymax>
</bndbox>
</part>
</object>
</annotation>
- ImageSets:主要讨论Main文件夹,此文件夹中存放的多个文本文件,分别存放的是各图片的文件名及正负样本
person.txt
2008_000078 -1
2008_000080 -1
2008_000082 -1
2008_000084 -1
2008_000090 1 # 图片2008_000090 含有person
2008_000107 -1
2008_000115 -1
2008_000116 -1
2008_000119 -1
2008_000120 -1
2008_000123 -1
2008_000133 1 # 图片2008_000133 含有person
- JPEGImages:存放的是训练与测试的所有图片。
- SegmentationClass与SegmentationObject:存放的都是图片,且都是图像分割结果图。
class segmentation
标注出每一个像素的类别,以类为分割条件。object segmentation
标注出每一个像素属于哪一个物体,以物体为分割条件。
2 COCO
COCO是一个大规模的目标检测、分割和标注数据集,其格式更加丰富和复杂,COCO数据集的主要标注文件是JSON格式。
COCO数据集现在有3种标注类型,分别是:
object instances(目标实例)
object keypoints(目标上的关键点)
image captions(看图说话)
这3种类型共享这些基本类型:info、image、license,使用JSON文件存储。
COCO #根目录
├── annotations # 存放json格式的标注
│ ├── instances_train2017.json
│ └── instances_val2017.json
└── train2017 # 存放图片文件
│ ├── 00000006584.jpg
│ ├── 00000002424.jpg
│ └── 00000008534.jpg
└── val2017
├── 000000007741.jpg
└── 000000002595.jpg
与VOC一个文件一个xml标准不同的是,COCO所有的目标框标注都是在同一个json里。
{
"info":{ # 数据集信息描述
"year": 2017, # 数据集年份
"version": "1.0", # 数据集版本
"description": "coco 2017 Dataset", # 数据集描述
"contributor": "coco", # 数据集提供者
"url": "http://cocodataset.org", # 数据集下载链接
"date_created": "2017/09/01", # 数据集创建日期
}
"licenses":[
{
"id": 4,
"name": Attribution License,
"url": "http://.....",
}
]
"images":[ # 所有图片列表
# 图片242287信息
{
"id": 242287, # 图片的ID编号(每张图片ID唯一)
"width": 426, # 图片宽
"height": 640, # 图片高
"file_name": "242287.jpg", # 图片名字
"license": int, # 协议
"flickr_url": str, # flickr链接地址
"coco_url": str, # 网络连接地址
"date_captured": datetime, # 数据集获取日期
}
# 图片242288信息
{
"id": 242288, # 图片的ID编号(每张图片ID唯一)
"width": 450, # 图片宽
"height": 550, # 图片高
"file_name": "242288.jpg", # 图片名字
"license": int, # 协议
"flickr_url": str, # flickr链接地址
"coco_url": str, # 网络连接地址
"date_captured": datetime, # 数据集获取日期
}
...
]
"annotations":[ # 所有图片的标注信息
# 标注125686
{
"id": 125686, # 目标对象ID(每个对象ID唯一),每张图片可能有多个目标
"image_id": 242287, # 对应图片ID
"category_id": 2, # 对应类别ID,与categories中的ID对应
"segmentation": RLE or [polygon], # 实例分割,对象的边界点坐标[x1,y1,x2,y2,....,xn,yn]
"area": 5322, # 对象区域面积
"bbox": [xmin,ymin,width,height], # 目标检测,对象定位边框[x,y,w,h]
"iscrowd": 0 or 1, # 表示是否多个物体
}
# 标注125688
{
"id": 125688, # 目标对象ID(每个对象ID唯一),每张图片可能有多个目标
"image_id": 242288, # 对应图片ID
"category_id": 2, # 对应类别ID,与categories中的ID对应
"segmentation": [[20,1,12,10,...]], # 解释见下
"area": 5322, # 对象区域面积
"bbox": [xmin,ymin,width,height], # 目标检测,对象定位边框[x,y,w,h]
"iscrowd": 0 or 1, # 表示是否多个物体
}
]
"categories":[# 类别描述
# 类别2
{
"id": 2, # 类别对应的ID(0默认为背景)
"name": "bicycle", # 子类别名字
"supercategory": "vehicle", # 主类别名字
}
# 类别3
{
"id": 3, # 类别对应的ID(0默认为背景)
"name": "animal", # 子类别名字
"supercategory": "cat", # 主类别名字
}
]
}
segmentation的另一种表示方法的解释
“segmentation”: [
size:[46,46],
count:[138,3,1,…]
]
把一张图分为若干像素点,则count:[138,3,1,...]
表示[非物体像素点数,物体像素点个数,非物体像素点数,...]
非物体像素点计数与物体像素点计数交叉时清空重算
3 YOLO
yolo数据集标注格式主要是 yolov5 项目需要用到,标签使用txt文本进行保存。
dataset
├─images
│ ├─train
│ │ ├─ flip_mirror_himg0026393.jpg
│ │ ├─ flip_mirror_himg0026394.jpg
│ │ ├─ flip_mirror_himg0026395.jpg
│ │ ├─ flip_mirror_himg0027314.jpg
│ │ ├─ flip_mirror_himg0027315.jpg
│ │ └─flip_mirror_himg0027316.jpg
│ │
│ └─val
│ ├─ flip_mirror_himg0027317.jpg
│ └─flip_mirror_himg0027318.jpg
│
└─labels
├─train
│ ├─ flip_mirror_aimg0025023.txt
│ ├─ flip_mirror_aimg0025024.txt
│ ├─ flip_mirror_aimg0025025.txt
│ ├─ flip_mirror_aimg0025026.txt
│ ├─ flip_mirror_aimg0025027.txt
│ └─ flip_mirror_aimg0025028.txt
│
└─val
├─ flip_mirror_aimg0025029.txt
└─flip_mirror_aimg0025030.txt
yolo标注格式
<object-class> <x> <y> <width> <height>
0 0.412500 0.318981 0.358333 0.636111
object-class:类别
x,y:目标的中心坐标,相对于图片的H和W做归一化。即x/W,y/H。
width,height:目标(bbox)的宽和高,相对于图像的H和W做归一化。
4 数据集使用(COCO为例)
官方文档coco使用方法
- root(str或pathlib.Path):
这个参数指定了图像下载或访问的根目录。数据集加载器将从这里查找图像。 - annFile(string):
这个参数提供了与数据集相关的JSON注释文件的路径。在COCO数据集中,这个JSON文件包含了每个图像的详细注释,包括边界框、类别和其他元数据。 - transform(callable,可选):
这个参数定义了一个函数或变换,用于在将图像加载为PIL(Python Imaging Library)图像后应用于它。常见的变换包括调整大小、归一化或转换为张量。例如,transforms.PILToTensor 表示将PIL图像转换为张量,这在许多深度学习框架中很常见。 - target_transform(callable,可选):
这个参数指定了一个函数或变换,用于在加载目标(注释或标签)后应用于它们。这在需要对注释进行处理或转换为不同格式的任务中非常有用。 - transforms(callable,可选):
这个参数定义了一个函数或变换,接受输入样本(图像)及其对应的目标(注释),并返回它们的转换版本。当需要同时对输入图像和其注释进行联合转换或增强时,这非常有用。
import torchvision
from PIL import ImageDraw
coco_dataset = torchvision.datasets.CocoDetection(root="/val2017",
annFile="instances_val2017.json")
# 读取json各信息,绘制矩形框
image,info = coco_dataset[0]
image_handler = ImageDraw(image)
for box in info:
x_min, y_min, x_max, y_max = box['bbox']
image_handler.rectangle(((x_min, y_min), (x_max, y_max)), outline='red')
image.show()