代码下载: GitHub
PASCAL VOC 数据集
PASCAL VOC 为图像识别和分类提供了一整套标准化的优秀的数据集, 从 2005 年到 2012 年每年都会举行一场图像识别 challenge
默认为 20 类物体
1 数据集结构
1JPEGImages
JPEGImages 文件夹中包含了 PASCAL VOC 所提供的所有的图片信息, 包括了训练图片和测试图片.
ref:PASCAL VOC 数据集分析
2Annotations
Annotations 文件夹中存放的是 xml 格式的标签文件, 每一个 xml 文件都对应于 JPEGImages 文件夹中的一张图片.
xml 文件的具体格式如下:(对于 2007_000392.jpg)
- <annotation>
- <folder>VOC2012</folder>
- <filename>2007_000392.jpg</filename> // 文件名
- <source> // 图像来源(不重要)
- <database>The VOC2007 Database</database>
- <annotation>PASCAL VOC2007</annotation>
- <image>flickr</image>
- </source>
- <size> // 图像尺寸(长宽以及通道数)
- <width>500</width>
- <height>332</height>
- <depth>3</depth>
- </size>
- <segmented>1</segmented> // 是否用于分割(在图像物体识别中 01 无所谓)
- <object> // 检测到的物体
- <name>horse</name> // 物体类别
- <pose>Right</pose> // 拍摄角度
- <truncated>0</truncated> // 是否被截断(0 表示完整)
- <difficult>0</difficult> // 目标是否难以识别(0 表示容易识别)
- <bndbox> //bounding-box(包含左下角和右上角 xy 坐标)
- <xmin>100</xmin>
- <ymin>96</ymin>
- <xmax>355</xmax>
- <ymax>324</ymax>
- </bndbox>
- </object>
- <object> // 检测到多个物体
- <name>person</name>
- <pose>Unspecified</pose>
- <truncated>0</truncated>
- <difficult>0</difficult>
- <bndbox> // 检测矩形框坐标
- <xmin>198</xmin>
- <ymin>58</ymin>
- <xmax>286</xmax>
- <ymax>197</ymax>
- </bndbox>
- </object>
- </annotation>
对应的图片为:
3ImageSets
ImageSets 存放的是每一种类型的 challenge 对应的图像数据.
在 ImageSets 下有四个文件夹:
其中 Action 下存放的是人的动作(例如 running,jumping 等等, 这也是 VOC challenge 的一部分)
Layout 下存放的是具有人体部位的数据(人的 head,hand,feet 等等, 这也是 VOC challenge 的一部分)
Main 下存放的是图像物体识别的数据, 总共分为 20 类.
Segmentation 下存放的是可用于分割的数据.
在这里主要考察 Main 文件夹.
Main 文件夹下包含了 20 个分类的 ***_train.txt,***_val.txt 和 ***_trainval.txt.
这些 txt 中的内容都差不多如下:
前面的表示图像的 name, 后面的 1 代表正样本,-1 代表负样本.
_train 中存放的是训练使用的数据, 每一个 class 的 train 数据都有 5717 个.
_val 中存放的是验证结果使用的数据, 每一个 class 的 val 数据都有 5823 个.
_trainval 将上面两个进行了合并, 每一个 class 有 11540 个.
需要保证的是 train 和 val 两者没有交集, 也就是训练数据和验证数据不能有重复, 在选取训练数据的时候 , 也应该是随机产生的.
Ref: PASCAL VOC 数据集分析
2 生成 / 创建 PASCAL VOC 数据集
2.1 利用现有数据集 - Openimages
900 万张标注图像, 谷歌发布 Open Images 最新 V3 版 https://zhuanlan.zhihu.com/p/31376027
该数据集包含一个训练集 (9011219 张图像), 一个验证集(41620 张图像) 和一个测试集(125436 张图像).V1 版本里的验证集在 V2 版本中被划分为验证集和测试集, 这样做是为了更好地进行评估. Open Images 中的所有图像都标注有图像级标签和边界框
600 余物体类别在线浏览
分类标签示例:
2.1.1 下载 openimages
到官网下载的时候要一次性下载所有的部分, 不仅文件很大, 而且下载的也不大快, 更重要的是自己训练要用到的类别并不多.
我采用的是工具箱的方法( https://github.com/EscVM/OIDv4_ToolKit ), 实际操作起来也挺顺利的.
Open Images V4 下载自己需要的特定类别
- Step1:Install the required packages
- pip install -r requirements.txt
- Step2:
- python main.py downloader --classes ./classes.txt --type_csv all --limit 3000
用法: main.py [-h] [--Dataset/path/to/OID/CSV/] [-y]
[ - 类列表[类列表...]]
[--type_csv'train'或'validation'或'test'或'all']
[--sub 子人验证图像的子集或机器生成的 h 或 m)]
[--image_IsOccluded 1 或 0] [ - image_IsTruncated 1 或 0]
[--image_IsGroupOf 1 或 0] [ - image_IsDepiction 1 或 0]
[--image_IsInside 1 或 0] [--multiclasses 0(默认值或 1)
[--n_threads [默认 20]] [--noLabels]
- [--limit integer number]
- <command>'downloader','visualizer'或'ill_downloader'.
- Open Image Dataset Downloader
打开图像数据集下载程序
位置参数:
<command>'downloader','visualizer'或'ill_downloader'.
'downloader','visualizer'或'ill_downloader'.
可选参数:
-h, --help 显示此帮助消息并退出
--Dataset /path/to/OID/CSV/
OID 数据集文件夹的目录
-y, --yes 是和是可以下载丢失的文件
- 类列表[类列表...]
所需类的 "字符串" 序列
--type_csv'train'或'validation'或'test'或'all'
从什么 CSV 搜索图像
--sub 人工验证图像或机器生成的子集(h 或 m)
从人类验证的数据集或从
机器生成一个.
--image_IsOccluded 1 或 0
图像的可选特征. 表示
对象被图像中的另一个对象遮挡.
--image_IsTruncated 1 或 0
图像的可选特征. 表示
对象超出图像的边界.
--image_IsGroupOf 1 或 0
图像的可选特征. 表示
盒子跨越一组物体(分钟 5).
--image_IsDepiction 1 或 0
图像的可选特征. 表示
对象是一个描述.
--image_IsInside 1 或 0
图像的可选特征. 表示 a
从对象内部拍摄的照片.
--multiclasses 0(默认值)或 1
分别 (0) 或一起下载不同的类
(1)
--n_threads [默认 20]
要使用的线程数
--noLabels 没有标签创作
--limit integer number
要下载的图像数量的可选限制
下载完成后得到 OID Folder
2.1.2 CSV 生成. xml(以 Google openimage 为例)
代码下载: GitHub
Step1:Get VOC.xml - csv2voc.py
Openimage.CSV to Anotation/XXX.xml
- Input : OPEN_IMAGES_DIR = folder of CSV file
- eg. where the validation-annotations-bbox.CSV is.
- Output = Anotation/XXX.xml +
- test.txt,train.txt,val.txt,trainval.txt
生成后得到 VOCify Folder
Note: 此时无需直接操作图片
test.txt,train.txt,val.txt,trainval.txt 后期训练时可再次生成, 代码如下
- # -*- coding:utf-8 -*-
- # -*- python3.5
- import os
- import random
- trainval_percent = 0.7 #可以自己设置
- train_percent = 0.8 #可以自己设置
- xmlfilepath = 'Annotations' #地址填自己的
- txtsavepath = 'ImageSets/Main'
- total_xml = os.listdir(xmlfilepath)
- num = len(total_xml)
- list = range(num)
- tv = int(num*trainval_percent)
- tr = int(tv*train_percent)
- trainval = random.sample(list,tv)
- train = random.sample(trainval,tr)
- ftrainval = open(txtsavepath+'/trainval.txt', 'w')
- ftest = open(txtsavepath+'/test.txt', 'w')
- ftrain = open(txtsavepath+'/train.txt', 'w')
- fval = open(txtsavepath+'/val.txt', 'w')
- for i in list:
- name = total_xml[i][:-4]+'\n'
- if i in trainval:
- ftrainval.write(name)
- if i in train:
- ftrain.write(name)
- else: fval.write(name)
- else:
- ftest.write(name)
- ftrainval.close()
- ftrain.close()
- fval.close()
- ftest .close()
- print('Well finshed')
- Step2:Save images to JPEGImages folder - By hand
- cp -r Dataset/images_file* VOCify/JPEGImages
- Source : Dataset/images_file
- Destination : VOCify/JPEGImages
- Step3:Set same name - my_same_name.py
- Set Anotation/XXX.xml as JPEGImages/XXX.jpg
- Make XXX the same
ref: 制作 VOC 数据集
2.2 手工标注
推荐: 使用 labelImg 工具给图片上标签, 并生成. xml 文件
来源: https://www.cnblogs.com/Neo007/p/12316584.html