PASCAL 全称:Pattern Analysis, Statical Modeling and Computational Learning
PASCAL VOC(The PASCAL Visual Object Classes )是一个经典的计算机视觉数据集,由牛津大学、马里兰大学和微软剑桥研究院的研究人员创建的。 该数据集于2005年首次发布,从那时起就被用于训练和评估目标检测算法。
PASCAL VOC 从 2005年开始举办挑战赛,每年的内容都有所不同,主要包括:
我们知道在 ImageNet挑战赛上涌现了一大批优秀的分类模型,而PASCAL挑战赛上则是涌现了一大批优秀的目标检测和分割模型,这项挑战赛已于2012年停止举办了,但是研究者仍然可以在其服务器上提交预测结果以评估模型的性能。
虽然近期的目标检测或分割模型更倾向于使用MS COCO数据集,但是这丝毫不影响 PASCAL VOC数据集的重要性,毕竟PASCAL对于目标检测或分割类型来说属于先驱者的地位。对于现在的研究者来说比较重要的两个年份的数据集是 PASCAL VOC 2007 与 PASCAL VOC 2012,这两个数据集频频在现在的一些检测或分割类的论文当中出现。
官网地址:http://host.robots.ox.ac.uk/pascal/VOC/
官方文档 : http://host.robots.ox.ac.uk/pascal/VOC/pubs/everingham10.pdf
Pascal VOC 2007
Pascal VOC 2012
a、Pascal VOC 2007 数据集
点击链接 进入 Pascal VOC 2007 主页 : http://host.robots.ox.ac.uk/pascal/VOC/voc2007
在页面中找到如下 下载链接,点击进行下载
b、Pascal VOC 2012 数据集
点击链接 进入 Pascal VOC 2012 主页 : http://host.robots.ox.ac.uk/pascal/VOC/voc2012/
在页面中找到如下 下载链接,点击进行下载
对于 分类 和 检测 来说,下图所示为数据集的发展历程,相同颜色的代表相同的数据集:
虽然 Pascal VOC 2012 和 2007 版本的数据集存在一些共享的部分,但是它们的图像和标注文件在细节上还是有所不同的,因此在使用数据集时需要注意版本和文件的正确匹配。
对于 图像分类任务 和 目标检测任务,数据集有 20个类别 (4大类)
}
"aeroplane": 1,
"bicycle": 2,
"bird": 3,
"boat": 4,
"bottle": 5,
"bus": 6,
"car": 7,
"cat": 8,
"chair": 9,
"cow": 10,
"diningtable": 11,
"dog": 12,
"horse": 13,
"motorbike": 14,
"person": 15,
"pottedplant": 16,
"sheep": 17,
"sofa": 18,
"train": 19,
"tvmonitor": 20
}
\quad \quad 官方地址
目前广大研究者们普遍使用的是 VOC2007和VOC2012数据集。
论文中针对 VOC2007和VOC2012 的具体用法有以下几种:
.
└── VOCdevkit
└── VOC2007
├── Annotations 标注文件(图像分类、目标检测、人体布局)
│ ├── 000005.xml
│ ├── 000007.xml
│ ├── 000009.xml
│ └── ... (共 5011个标注文件)
├── ImageSets 数据集分割信息 (训练集、验证集、训练集+验证集)
│ ├── Layout 用于人体布局图像信息
│ │ ├── train.txt
│ │ ├── trainval.txt
│ │ └── val.txt
│ ├── Main 用于图像分类和目标检测图像信息
│ │ ├── train.txt
│ │ ├── trainval.txt
│ │ ├── val.txt
│ │ └── ... (共63个文件)
│ └── Segmentation 用于语义分割和实例分割图像信息
│ ├── train.txt
│ ├── trainval.txt
│ └── val.txt
├── JPEGImages 所有原图像
│ ├── 000005.jpg
│ ├── 000007.jpg
│ ├── 000009.jpg
│ └── ... (共5011张图像)
├── SegmentationClass 语义分割标注图像
│ ├── 000032.png
│ ├── 000033.png
│ ├── 000039.png
│ └── ... (共422张图像)
└── SegmentationObject 实例分割标注图像
├── 000032.png
├── 000033.png
├── 000039.png
└── ... (共422张图像)
.
└── VOCdevkit
└── VOC2012
├── Annotations 标注文件(图像分类、目标检测、人体布局)
│ ├── 2007_000027.xml
│ ├── 2007_000032.xml
│ ├── 2007_000033.xml
│ ├── 2007_000039.xml
│ └── ...(共17125张图像)
├── ImageSets 数据集分割信息 (训练集、验证集、训练集+验证集)
│ ├── Action 用于动作识别
│ │ ├── train.txt 2296张图像
│ │ ├── trainval.txt 4588张图像
│ │ ├── val.txt 2292张图像
│ │ └── ...
│ ├── Layout 用于人体布局
│ │ ├── train.txt 4425张图像
│ │ ├── trainval.txt 850张图像
│ │ └── val.txt 425张图像
│ ├── Main 用于图像分类和目标检测
│ │ ├── train.txt 5717张图像
│ │ ├── train_val.txt 11540张图像
│ │ └── trainval.txt 5823张图像
│ └── Segmentation 用于语义分割和实例分割
│ ├── train.txt 1464张图像
│ ├── trainval.txt 2913张图像
│ └── val.txt 1449张图像
├── JPEGImages 所有原图像
│ ├── 2007_000027.jpg
│ ├── 2007_000032.jpg
│ ├── 2007_000033.jpg
│ ├── 2007_000039.jpg
│ └── ...(共17125张图像)
├── SegmentationClass 语义分割标注图像
│ ├── 2007_000032.png
│ ├── 2007_000033.png
│ ├── 2007_000039.png
│ ├── 2007_000042.png
│ └── ...(共2913张图像)
└── SegmentationObject 实例分割标注图像
├── 2007_000032.png
├── 2007_000033.png
├── 2007_000039.png
├── 2007_000042.png
└── ...(共2913张图像)
1、Pascal VOC 2012 的数据集 因为是在前几年的数据集上进行扩增,所以文件名中包含年份,而 Pascal VOC 2007 的文件名中不包含
- Pascal VOC 2007 的标注文件名 和 图像文件名 类似为: 000005.xml、 000005.jpg
- Pascal VOC 2012 的标注文件名 和 图像文件名 类似为: 2007_000027.xml、 2007_000039.png
2、Pascal VOC 2012 的 ImageSets 中包括 Action 文件:用于动作识别任务的数据集划分,而 Pascal VOC 2007 的 ImageSets 文件中不包含, 因为 动作识别任务(Action Classification) 是2010年才有的。
3、.xml 的标注文件内容 有所不同,比如: 12版本中有的图像标注 是有 动作信息
<annotation>
<folder>VOC2007folder>
<filename>000001.jpgfilename>
<source>
<database>The VOC2007 Databasedatabase>
<annotation>PASCAL VOC2007annotation>
<image>flickrimage>
<flickrid>341012865flickrid>
source>
<owner>
<flickrid>Fried Camelsflickrid>
<name>Jinky the Fruit Batname>
owner>
<size>
<width>353width>
<height>500height>
<depth>3depth>
size>
<segmented>0segmented>
<object>
<name>dogname>
<pose>Leftpose>
<truncated>1truncated>
<difficult>0difficult>
<bndbox>
<xmin>48xmin>
<ymin>240ymin>
<xmax>195xmax>
<ymax>371ymax>
bndbox>
object>
<object>
<name>personname>
<pose>Leftpose>
<truncated>1truncated>
<difficult>0difficult>
<bndbox>
<xmin>8xmin>
<ymin>12ymin>
<xmax>352xmax>
<ymax>498ymax>
bndbox>
object>
annotation>
}
"aeroplane": 1,
"bicycle": 2,
"bird": 3,
"boat": 4,
"bottle": 5,
"bus": 6,
"car": 7,
"cat": 8,
"chair": 9,
"cow": 10,
"diningtable": 11,
"dog": 12,
"horse": 13,
"motorbike": 14,
"person": 15,
"pottedplant": 16,
"sheep": 17,
"sofa": 18,
"train": 19,
"tvmonitor": 20
}
< /part> 标签 框起来的部分,就是人体布局的标签
<annotation>
<folder>VOC2012folder>
<filename>2007_000027.jpgfilename>
<source>
<database>The VOC2007 Databasedatabase>
<annotation>PASCAL VOC2007annotation>
<image>flickrimage>
source>
<size>
<width>486width>
<height>500height>
<depth>3depth>
size>
<segmented>0segmented>
<object>
<name>personname>
<pose>Unspecifiedpose>
<truncated>0truncated>
<difficult>0difficult>
<bndbox>
<xmin>174xmin>
<ymin>101ymin>
<xmax>349xmax>
<ymax>351ymax>
bndbox>
<part>
<name>headname>
<bndbox>
<xmin>169xmin>
<ymin>104ymin>
<xmax>209xmax>
<ymax>146ymax>
bndbox>
part>
<part>
<name>handname>
<bndbox>
<xmin>278xmin>
<ymin>210ymin>
<xmax>297xmax>
<ymax>233ymax>
bndbox>
part>
<part>
<name>footname>
<bndbox>
<xmin>273xmin>
<ymin>333ymin>
<xmax>297xmax>
<ymax>354ymax>
bndbox>
part>
<part>
<name>footname>
<bndbox>
<xmin>319xmin>
<ymin>307ymin>
<xmax>340xmax>
<ymax>326ymax>
bndbox>
part>
object>
annotation>
< /actions> 标签 框起来的部分,就是动作识别的标签
<annotation>
<filename>2011_003279.jpgfilename>
<folder>VOC2011folder>
<object>
<name>personname>
<actions>
<jumping>0jumping>
<other>0other>
<phoning>0phoning>
<playinginstrument>0playinginstrument>
<reading>0reading>
<ridingbike>0ridingbike>
<ridinghorse>0ridinghorse>
<running>0running>
<takingphoto>0takingphoto>
<usingcomputer>0usingcomputer>
<walking>1walking>
actions>
<bndbox>
<xmax>188xmax>
<xmin>109xmin>
<ymax>500ymax>
<ymin>307ymin>
bndbox>
<difficult>0difficult>
<pose>Unspecifiedpose>
<point>
<x>153x>
<y>374y>
point>
object>
<segmented>0segmented>
<size>
<depth>3depth>
<height>500height>
<width>367width>
size>
<source>
<annotation>PASCAL VOC2011annotation>
<database>The VOC2011 Databasedatabase>
<image>flickrimage>
source>
annotation>
将数据集转换为 yolo 格式 , YOLO 数据格式介绍: YOLO 数据集格式
import xml.etree.ElementTree as ET
import os
# voc的20个类别
classes = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable',
'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
def convert(size, bbox):
x = (bbox[0] + bbox[1]) / 2.0
y = (bbox[2] + bbox[3]) / 2.0
w = bbox[1] - bbox[0]
h = bbox[3] - bbox[2]
x = x / size[0]
w = w / size[0]
y = y / size[1]
h = h / size[1]
return (x, y, w, h)
def convert_annotation(xml_file, save_file):
# 保存yolo格式 的label 的 .txt 文件地址
save_file = open(save_file, 'w')
tree = ET.parse(xml_file)
size = tree.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in tree.findall('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls) + 1 # 类别索引从1开始,类别0是背景
bbox = obj.find('bndbox')
b = (float(bbox.find('xmin').text),
float(bbox.find('xmax').text),
float(bbox.find('ymin').text),
float(bbox.find('ymax').text))
bb = convert((w, h), b)
save_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
save_file.close()
if __name__ == "__main__":
# 数据集根目录地址
data_root = "/Users/enzo/Documents/GitHub/dataset/VOCdevkit/VOC2007"
# 标注文件地址
annotation = os.path.join(data_root, 'Annotations')
# yolo格式的文件保存地址
save_root = './labels'
if not os.path.exists(save_root):
os.makedirs(save_root)
for train_val in ["train", "val"]:
if not os.path.exists(os.path.join(save_root, train_val)):
os.makedirs(os.path.join(save_root, train_val))
# 数据集划分的 .txt 文件地址
txt_file = os.path.join(data_root, 'ImageSets/Main', train_val+'.txt')
with open(txt_file, 'r') as f:
lines = f.readlines()
file_names = [line.strip() for line in lines if len(line.strip())>0]
for file_name in file_names:
xml_file = os.path.join(annotation, file_name+'.xml')
save_file = os.path.join(save_root, train_val, file_name+'.txt')
convert_annotation(xml_file, save_file)
https://arleyzhang.github.io/articles/1dc20586/