pascal VOC数据集+xml注释

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)

稍微修改了一下路径和一些总结

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值