pascal VOC数据集+xml注释
VOC2007和2012区别:
相同but大小不同
+Open Images DatasetV4最大数据集
pascal VOC2007数据集介绍:
├── Annotations(标注文件) # 存放 .xml 格式文件,每一个xml文件名对应JPEGImages 中的一张图片,.xml文件里是对图片的解释
├── ImageSets # 这个目录下有三个文件夹Layout,Main,Segmentation,文件夹存放的都是 .txt 文件,类别标签
│ ├── Layou t #存放的是人体部位的数据
│ ├── Main # 存放物体识别的分类数据,里面有*_train.txt 训练样本集 、_val.txt 评估样本集 、_trainval.txt 训练与评估样本汇总,*表示分类,总共20类:-1表示负样本,+1为正样本
│ └── Segmentation #存放可用于分割的数据
├── JPEGImages(图像文件) # 图像文件 .jpg 格式
├── labels
├── SegmentationClass # 存放的是图片文件,分割后的图片
└── SegmentationObject # 存放的是图片文件,分割后的图片
共9963张、20个对象分类、测试4952张、训练5011张
xml文件注释——size图片尺寸通道数+object(name名称+bndbox框)
一般不对其进行操作:
<annotation>
<folder>VOC2007</folder>
<filename>000001.jpg</filename> #文件名
<source>#文件来源
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>341012865</flickrid>
</source>
<owner>
<flickrid>Fried Camels</flickrid>
<name>Jinky the Fruit Bat</name>
</owner>
文件尺寸,包括长、宽、通道数:
<size>
<width>353</width>
<height>500</height>
<depth>3</depth>
</size>
是否用于分割:
<segmented>0</segmented>
真实标记的物体:
<object>
<name>dog</name> #目标类别
<pose>Left</pose> #三个属性:拍摄角度、是否被截断(0表示完整)、目标是否难以识别(0表示容易识别)
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox> #bounding-box先验框:包含左下角和右上角xy坐标
#跟坐标原点有关左上和右下
<xmin>48</xmin>
<ymin>240</ymin>
<xmax>195</xmax>
<ymax>371</ymax>
</bndbox>
</object>
真实标记的第二个物体:
<object>
<name>person</name>
<pose>Left</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>8</xmin>
<ymin>12</ymin>
<xmax>352</xmax>
<ymax>498</ymax>
</bndbox>
</object>
</annotation>
①可以汇总数据集所有的标签类别
#!/usr/bin/env python
# encoding: utf-8
'''
@Author : pentiumCM
@Email : 842679178@qq.com
@Software: PyCharm
@File : label_stat.py
@Time : 2020/12/4 23:56
@desc : VOC数据集标签类别汇总
'''
import xml.dom.minidom as xmldom
import os
def voc_label_statistics(annotation_path):
'''
voc数据集类别标签统计
:param annotation_path: voc数据集的标签文件夹
:return: [class1,class2.....]
'''
annotation_names = [os.path.join(annotation_path, i) for i in os.listdir(annotation_path)]
labels = list()
for names in annotation_names:
xmlfilepath = names
domobj = xmldom.parse(xmlfilepath)
# 得到元素对象
elementobj = domobj.documentElement
# 获得子标签
subElementObj = elementobj.getElementsByTagName("object")
for s in subElementObj:
label = s.getElementsByTagName("name")[0].firstChild.data
if label not in labels:
labels.append(label)
print(labels)
print(len(labels))
return labels
if __name__ == '__main__':
annotation_path = "./VOC2007/Annotations/"
label = voc_label_statistics(annotation_path)
结果即打印出一系列的标签名字和标签类别数量
②划分数据集为
train.txt: 是用来训练的图片文件的文件名列表 (训练集)
val.txt: 是用来验证的图片文件的文件名列表 (验证集)
trianval.txt:是用来训练和验证的图片文件的文件名列表 (训练集 + 验证集)
test.txt:是用来测试的图片文件的文件名列表 (测试集)
voc_data_divide.py
'''
VOC数据集划分
生成:trainval.txt,train.txt,val.txt,test.txt
为ImageSets文件夹下面Main子文件夹中的训练集+验证集、训练集、验证集、测试集的划分
'''
import os
import random
def data_divide(annotation_filepath, divide_save_filepath):
"""
数据集划分:训练集,验证集,测试集,在ImageSets/Main/生成 train.txt,val.txt,trainval.txt,test.txt
:param annotation_filepath:标注文件的路径 Annotations
:param divide_save_filepath:数据集划分保存的路径 ImageSets/Main/
:return:
"""
# train_percent:训练集占(训练集+验证集)的比例
train_percent = 1.0
# trainval_percent:(训练集+验证集)占总数据集的比例。测试集所占比例为:1-trainval_percent
trainval_percent = 0.6
'''
temp_xml = os.listdir(annotation_filepath)
total_xml = []
for xml in temp_xml:
if xml.endswith(".xml"):
total_xml.append(xml)
'''
total_xml = os.listdir(annotation_filepath) # 此句与上述''' '''意义相同
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)
print("train and val size", tv)
print("traub suze", tr)
print("sum suze", num)
ftrainval = open(os.path.join(divide_save_filepath, 'trainval.txt'), 'w')
ftest = open(os.path.join(divide_save_filepath, 'test.txt'), 'w')
ftrain = open(os.path.join(divide_save_filepath, 'train.txt'), 'w')
fval = open(os.path.join(divide_save_filepath, '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()
if __name__ == '__main__':
annotation_filepath = "./Annotations/"
divide_save_filepath = "./ImageSets/Main/"
data_divide(annotation_filepath, divide_save_filepath)
稍微修改了一下路径和一些总结