制作VOC数据集

本文详细解析了PASCAL VOC数据集的结构,包括JPEGImages、Annotations和ImageSets等关键组成部分,并提供了创建自定义数据集的步骤,涵盖图片存储、txt文件生成及XML标签生成。

一、VOC数据集长什么样
PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge。
本文主要分析PASCAL VOC数据集中和图像中物体识别相关的内容。
在这里采用PASCAL VOC2012作为例子。下载地址为:点击打开链接。(本文中的系统环境为ubuntu14.04)
下载完之后解压,可以在VOCdevkit目录下的VOC2012中看到如下的文件:

其中在图像物体识别上着重需要了解的是Annotations(xml图片信息)、ImageSets[challenge对应的图像数据,main存放训练测试的.txt,包括每一类图片(txt:前面的表示图像的name,后面的1代表正样本,-1代表负样本。)train.txt(数据位置)]和JPEGImages(图片)。

①JPEGImages:JPEGImages文件夹中包含了PASCAL VOC所提供的所有的图片信息,包括了训练图片和测试图片。
这些图像都是以“年份_编号.jpg”格式命名的。
图片的像素尺寸大小不一,但是横向图的尺寸大约在500*375左右,纵向图的尺寸大约在375*500左右,基本不会偏差超过100。

②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>

对应的图片为:
③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两者没有交集,也就是训练数据和验证数据不能有重复,在选取训练数据的时候 ,也应该是随机产生的。
④SegmentationClass和SegmentationObject:这两个文件夹下保存了物体分割后的图片
 

二、制作自己的数据集

存入JPEGImages文件夹——你可以直接从各种渠道下载得到所需要的图片集,存入到JPEGImages文件夹下,命名格式统一为“%6d.jpg”,(000001.jpg)

第二步:生成Main文件夹下的.txt文件——在主目录下运行以下代码既可生成test.txt、train.txt、val.txt、trainval.txt四个文件,请注意每一个path地址是否正确

# -*- 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')

运行完成,得到四个txt文件:可以打开看一看,内容就是各个图片的索引,意味着哪些图片用做训练,哪些用做测试。

③  生成.xml标签

cvs生成.xml(以Google openimage为例):点击下载代码

txt同理换一下数据就好

 


---------------------   
参考:1.https://blog.csdn.net/zhangjunbob/article/details/52769381  

             2.https://blog.csdn.net/zzZ_CMing/article/details/81131101

### 创建和准备 VOC 格式的数据集 #### 1. 数据收集 为了构建一个适合机器学习或深度学习项目的 VOC 格式数据集,第一步是获取高质量的原始图像素材。这些图像可以来源于公开数据库、自拍照片或者通过爬虫工具抓取互联网上的图片资源[^1]。 #### 2. 图像标注 完成图像采集之后,需要对每张图片中的对象进行精确标注。VOC格式支持多种类型的标签文件,最常见的是XML格式。每一个XML文件对应一张图片,并记录该图内的所有物体类别及其边界框位置信息。具体来说,这涉及定义每个目标的位置参数(xmin, ymin, xmax, ymax),以及分配相应的类名给它们[^2]。 #### 3. 文件结构组织 建立清晰合理的目录体系对于后续处理至关重要。典型的VOC风格数据集中应该包含以下几个主要部分: - **JPEGImages**: 存储所有的输入图像; - **Annotations**: 放置与上述图像对应的标注文件(.xml); - **ImageSets/Main/**: 提供各种索引列表(train.txt,val.txt,test.txt),用来指示哪些样本属于训练集、验证集还是测试集[^3]。 #### 4. 划分数据子集 最后一步就是合理分割整个集合成为相互独立又互补的部分——即前面提到过的训练集、验证集和测试集。一般推荐采用70%-80%作为训练用途;剩余则平均分配至验证及最终评测阶段使用。 ```python import os from xml.etree.ElementTree import Element, SubElement, tostring def create_voc_annotation(image_name, objects): annotation = Element('annotation') folder = SubElement(annotation, 'folder') folder.text = 'VOC' filename = SubElement(annotation, 'filename') filename.text = image_name source = SubElement(annotation, 'source') database = SubElement(source, 'database') database.text = 'The VOC Database' size_part = SubElement(annotation, 'size') width = SubElement(size_part, 'width') height = SubElement(size_part, 'height') depth = SubElement(size_part, 'depth') # Assuming RGB images width.text = str(IMAGE_WIDTH) height.text = str(IMAGE_HEIGHT) depth.text = str(DEPTH) segmented = SubElement(annotation, 'segmented') segmented.text = '0' for obj in objects: object_elem = SubElement(annotation, 'object') name = SubElement(object_elem, 'name') pose = SubElement(object_elem, 'pose') truncated = SubElement(object_elem, 'truncated') difficult = SubElement(object_elem, 'difficult') bndbox = SubElement(object_elem, 'bndbox') name.text = obj['class'] pose.text = 'Unspecified' truncated.text = '0' difficult.text = '0' xmin = SubElement(bndbox, 'xmin') ymin = SubElement(bndbox, 'ymin') xmax = SubElement(bndbox, 'xmax') ymax = SubElement(bndbox, 'ymax') xmin.text = str(obj['bbox'][0]) ymin.text = str(obj['bbox'][1]) xmax.text = str(obj['bbox'][2]) ymax.text = str(obj['bbox'][3]) return annotation # Example usage of the function with dummy data. objects_info = [{'class': 'smoker', 'bbox':[50,60,198,200]}] image_file_name="example.jpg" tree_structure = create_voc_annotation(image_file_name, objects_info) print(tostring(tree_structure)) ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值