VOC数据集简介与制作

article/2025/10/30 5:45:07

一、VOC数据集简介

1.1 VOC的任务

PASCAL VOC 挑战赛主要有 Object Classification (分类)、Object Detection(检测)、Object Segmentation(分割)、Human Layout、Action Classification 这几类子任务。

分类:在测试图像预测是否为二十个分类之一,正确分类
检测:在测试图像上预测二十个分类对象的有无与位置信息
分割:对每个对象与类别生成像素级别的分割标签,确定像素是为目标20个分类或者背景。

此外Pascal VOC还提供一些很有意思的标注数据包括Action Classification (行为识别)、Human Layout(人体Layout分析)等。
行为识别:预测图像中人的行为动作
Person Layout:检测人与其各个身体组成部分,如果手、脚、头等
在这里插入图片描述

1.2 数据构成

PASCAL VOC 2007 和 2012 数据集总共分 4 个大类:vehicle、household、animal、person,总共 20 个小类(加背景 21 类),预测的时候是只输出下图中黑色粗体的类别
在这里插入图片描述
目前目标检测常用的是 VOC2007 和 VOC2012 数据集,因为二者是互斥的。

VOC2007 和 VOC2012 目标检测任务中的训练、验证和测试数据统计如下表所示
在这里插入图片描述
trainval是train和val的合并。

1.3 组织结构

以 VOC 2012为例,解压后的文件为:

.
└── VOCdevkit     #根目录└── VOC2012   #不同年份的数据集,这里只下载了2012的,还有2007等其它年份的├── Annotations        #存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等├── ImageSets          #该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本│   ├── Action│   ├── Layout│   ├── Main           #存放的是分类和检测的数据集分割文件│   └── Segmentation├── JPEGImages         #存放源图片├── SegmentationClass  #存放的是图片,语义(class)分割相关└── SegmentationObject #存放的是图片,实例(object)分割相关├── Main
│   ├── train.txt 写着用于训练的图片名称, 共 2501 个
│   ├── val.txt 写着用于验证的图片名称,共 2510 个
│   ├── trainval.txt train与val的合集。共 5011 个
│   ├── test.txt 写着用于测试的图片名称,共 4952

1.3.1 Annotations

其中xml主要介绍了对应图片的基本信息,如来自那个文件夹、文件名、来源、图像尺寸以及图像中包含哪些目标以及目标的信息等等,xml内容如下:

<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>  # 图像尺寸, 用于对 bbox 左上和右下坐标点做归一化操作<width>353</width><height>500</height><depth>3</depth></size><segmented>0</segmented>  # 是否用于分割,1有分割标注,0表示没有分割标注。<object><name>dog</name>  # 物体类别<pose>Left</pose>  # 拍摄角度:front, rear, left, right, unspecified <truncated>1</truncated>  # 目标是否被截断(比如在图片之外),或者被遮挡(超过15%)<difficult>0</difficult>  # 检测难易程度,这个主要是根据目标的大小,光照变化,图片质量来判断,0表示不是,1表示是<bndbox><xmin>48</xmin><ymin>240</ymin><xmax>195</xmax><ymax>371</ymax></bndbox></object><object><name>person</name><pose>Left</pose><truncated>1</truncated> # 是否被标记为截断,0表示没有,1表示是<difficult>0</difficult><bndbox><xmin>8</xmin><ymin>12</ymin><xmax>352</xmax><ymax>498</ymax></bndbox></object>
</annotation>

1.3.2 ImageSets

ImageSets包含如下四个子文件夹:Action、Layout、Main、Segmentation。里面是标注类别的每个文件列表信息:

  • Action中是所有具有Action标注信息图像文件名的txt文件列表,
  • Layout中的txt文件表示包含Layout标注信息的图像文件名列表,
  • Main文件夹中包含20个类别每个类别一个txt文件,每个txt文件都是包含该类别的图像文件名称列表,
  • Segmentation则是包含语义分割信息图像文件的列表。

在main中针对每个类别都有个三个文件,分别为:

  • CLASSNAME_train.txt
  • CLASSNAME_trainval.txt
  • CLASSNAME_val.txt

以CLASSNAME = aeroplane为例,main中的三个文件分别为:

  • aeroplane_train.txt
  • aeroplane_trainval.txt
  • aeroplane_val.txt

每个类别txt文件里面的内容格式为 :图像文件名 + 空格 + 标记,以aeroplane_train.txt中的举例如下:
2008_000290 0
2008_000291 1
2008_000297 -1

其中2008_000290、2008_000291、2008_000297表示三张图像文件名

  • 0 表示图像中包含aeroplane对象但是难识别样本
  • 1 表示图像中包含aeroplane
  • -1 表示图像中不包含aeroplane

1.3.3 JPEGImages

所有的原始图像文件,格式必须是JPG格式,这个要特别注意!如果你打算使用VOC2012格式生成数据,那么原始图像格式在采样时候请用JPG格式保存,避免后期生成使用tensorflow工具生成的时候出错。

1.3.4 SegmentationClass

所有分割的图像标注,分割图像安装每个类别标注的数据

1.3.5 SegmentationObject

所有分割的图像标注,分割图像安装每个类别每个对象不同标注的数据

1.4 提交格式

1.4.1 Classification Task

每一类都有一个 txt 文件,里面每一行都是测试集中的一张图片,前面一列是图片名称,后面一列是预测的分数。

# comp1_cls_test_car.txt, 内容如下000004 0.702732
000006 0.870849
000008 0.532489
000018 0.477167
000019 0.112426

1.4.2 Detection Task

每一类都有一个 txt 文件,里面每一行都是测试集中的一张图片,每行的格式为: ,confidence 用来计算 mAP

# comp3_det_test_car.txt,内容如下
# comp3:只允许用所给训练数据,comp4:允许使用外部数据000004 0.702732 89 112 516 466
000006 0.870849 373 168 488 229
000006 0.852346 407 157 500 213
000006 0.914587 2 161 55 221
000008 0.532489 175 184 232 201

1.5 评估标准

PASCAL的评估标准是 mAP(mean average precision)。下面是一个二分类的 P-R 曲线(precision-recall curve),对于 PASCAL 来说,每一类都有一个这样的 P-R曲线,P-R 曲线下面与 x 轴围成的面积称为 average precision,每个类别都有一个 AP,20个类别的 AP 取平均值 就是 mAP。
在这里插入图片描述

2 VOC数据集的制作

在我们训练Faster-RCNN/SSD模型时,有些数据集需要我们自己制作的,接下来我就说一说如何自己制作一个VOC数据集。

2.1 创建数据集文件夹

handvoc是你自己数据集的名字,在该目录下有第三个文件夹如下所示。
在这里插入图片描述
其中ImgeSets下还有一个Main文件夹
在这里插入图片描述
文件夹说明:

  • JPEGImages中存放要训练的图片。
  • Annotations中这XML信息,XML文件名与训练图片的文件名一一对应。
  • ImageSets中存放文件夹Main,Main中存放四个txt文件,train存放着用于训练图片名字集合,test存放着用于测试的名字集合。
    在这里插入图片描述

2.2 将训练图片放到JPEGImages

将选取的图片放置于放于目录:JPEGImages下,然后将图片重命名为VOC2007的“000005.jpg”形式。重命名的python代码为:

import os
path = "D:\\handvoc\\JPEGImages"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:print(file)
for file in filelist:   #遍历所有文件Olddir=os.path.join(path,file)   #原来的文件路径if os.path.isdir(Olddir):   #如果是文件夹则跳过continuefilename=os.path.splitext(file)[0]   #文件名filetype=os.path.splitext(file)[1]   #文件扩展名Newdir=os.path.join(path,str(count).zfill(6)+filetype)  #用字符串函数zfill 以0补全所需位数os.rename(Olddir,Newdir)#重命名count+=1

更改名字之后的图片:在这里插入图片描述

2.3 标注图片,标注文件保存到Annotations

使用labelImg进行标注,使用方法如下:https://editor.csdn.net/md/?articleId=107818472
链接: labelImg使用方法.
注意:标注自己的图片的时候,类别名称请用小写字母,比如汽车使用car,不要用Car 。若出现无法找到resources的错误,此时只需将resources.py复制到libs文件夹中即可。

2.4 生成ImageSets\Main里的四个txt文件

在ImageSets里再新建文件夹,命名为Main,在Main文件夹中生成四个txt文件,即:
在这里插入图片描述

  • test.txt是测试集
  • train.txt是训练集
  • val.txt是验证集
  • trainval.txt是训练和验证集

VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。
txt文件中的内容为样本图片的名字(不带后缀),格式如下:
在这里插入图片描述
上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些。在自己的文件夹下生成自己数据集的代码如下:

import os
import random 
trainval_percent = 0.8
train_percent = 0.6
xmlfilepath = 'D:\handvoc\Annatations'
txtsavepath = 'D:\handvoc\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('D:\\handvoc\\ImageSets\\Main\\trainval.txt', 'w')
ftest = open('D:\\handvoc\\ImageSets\\Main\\test.txt', 'w')
ftrain = open('D:\\handvoc\\ImageSets\\Main\\train.txt', 'w')
fval = open('D:\\handvoc\\ImageSets\\Main\\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()

你要根据你的情况修改生成比例以及文件夹的位置。


http://chatgpt.dhexx.cn/article/blR6ZXme.shtml

相关文章

详解 VOC 数据集

本视频配套视频链接&#xff1a;https://www.bilibili.com/video/BV1ZL4y1p7Cz/ 我们先来介绍一个经典的数据集&#xff1a;VOC 数据集。Visual Object Class 的首字母缩写&#xff0c;它的官方地址为 http://host.robots.ox.ac.uk/pascal/VOC/。 虽然现在大家更倾向于使用我…

测试报告编写,测试结果编写

测试报告&#xff0c;就是向整个团队告诉你的测试情况&#xff0c;以及发现一些问题说明。 所以&#xff1a; 第一步&#xff0c;先告诉别人&#xff0c;你的测试结果&#xff0c;测试结果只有两种&#xff0c;测试通过/测试未通过。 第二步&#xff0c;写出这个需求的提测的…

软件测试项目测试报告总结

测试计划概念&#xff1a;就在软件测试工作实施之前明确测试对象&#xff0c;并且通过资源、时间、风险、测试范围和预算等方面的综合分析和规划&#xff0c;保证有效的实施软件测试。 需求挖掘的6个方面&#xff1a; 1、输入方面 2、处理方面 3、结果输出方面 4、性能需求…

稳定性测试-几点总结

混合场景业务比例&#xff1a; 稳定性测试一般基于混合场景进行压测&#xff0c;业务比例由项目组人员给出。&#xff08;最好基于线上业务调用量情况进行统计&#xff0c;但大部分系统没有该数据&#xff0c;那就由他们自己拍脑袋吧&#xff09; PS: JMeter控制业务比例用 th…

测试总结报告模板

1. 编写目的 [简述本报告的目的。例如&#xff1a;本测试报告为XX项目的测试总结报告&#xff0c;目的在于总结测试阶段的测试及分析测试结果&#xff0c;描述系统是否符合需求&#xff08;或达到XX功能目标&#xff09;&#xff0c;同时对软件质量进行相关的评估&#xff0c;…

性能测试结果分析结果

在做性能测试的时候&#xff0c;在使用LR或者jmeter等一些性能测试工具测试执行结束后&#xff0c;首先要做的是判断采集到的结果数据是否真实有效。多数的性能测试场景都要迭代的进行测试&#xff0c;因此很多测试结果本身就不能反应问题&#xff0c;深入分析这样的结果没啥意…

主观评价测试

一、静物测试 1.测试目的&#xff1a;测试IPC在室内正常照度场景下的效果 2.测试设备&#xff1a;色温照度计&#xff0c;激光红外测距仪 3.测试环境&#xff1a;在不同色温环境下A,TL84 CWF D65对静物场景测试图卡和人物进行拍摄&#xff0c;观察图像和人物效果&#xff08…

测试总结的重要性

测试总结很重要&#xff0c;包括项目整理的总结、个人的总结、小组的总结;做项目总结&#xff0c;是为了梳理整个过程&#xff0c;明确问题和找到原因&#xff0c;改进整个流程和推进项目状态越来越好。 自己目前所做的是项目的总结&#xff0c;会针对三方做一个总结&#xff0…

测试总结该怎么写...

最近参与了几次面试&#xff0c;面试者的简历中都会提及&#xff1a;需求或者版本测试结束后会进行版本总结&#xff0c;而不仅仅是提供一份测试报告。 于是特意追问了一下&#xff0c;总结中都包含什么内容&#xff0c;答复上基本都是围绕此次测试过程中发现的BUG数量以及修复…

如何分析测试结果和评估测试工作的质量

软件测试中每一项测试活动都会产生测试结果&#xff0c;通过测试结果来评估产品的质量体现了测试的目的和价值。而通过测试结果评估测试工作本身的质量也非常重要&#xff0c;能让我们及时发现测试中存在的问题&#xff0c;并及时改正&#xff0c;是测试工作进行持续改进的基础…

测试报告怎么写?

测试报告是一份描述软件的测试过程、测试环境、测试范围、测试结果的文档&#xff0c;用来分析总结系统存在的风险以及测试结论。 &#xff08;1&#xff09;测试过程测试过程需要对测试人员、测试时间、测试地点、测试版本等信息进行描述。其他测试过程中发生的关键信息均可在…

评测报告的结论如何写?

背景 最近组内同学开始编写评测报告&#xff0c;报告中的结论中存在以下几种情况&#xff1a; 1.结论是一大段文字&#xff0c;像散文一样 2.评测数据结果中存在多个数据维度&#xff0c;将所有的数据结果都罗列到结论中&#xff0c;主要信息不突出 3.只是将评测数据罗列到…

【Linux】syscall系统调用原理及实现

一、什么是系统调用 系统调用 跟用户自定义函数一样也是一个函数&#xff0c;不同的是 系统调用 运行在内核态&#xff0c;而用户自定义函数运行在用户态。由于某些指令&#xff08;如设置时钟、关闭/打开中断和I/O操作等&#xff09;只能运行在内核态&#xff0c;所以操作系统…

Syscall的实现

1. How does syscall works 2. Kernel定义一个系统调用的表sys_call_table,这个表定义了每个系统调用的: 系统调用号NR_xxx 及其对应的系统调用的处理函数, 系统调用号对应sys_call_table[]数组的下标, 数组项的值保存系统调用的处理函数, 如下: 3. 如下,…

system call——系统调用

1. 系统调用 系统调用是操作系统提供的有效服务界面&#xff0c;一般使用高级语言编写&#xff0c;如c和c&#xff0c;对于特定的较为底层的任务&#xff0c;则使用汇编语言指令。 2. API和系统调用 API&#xff0c;应用程序接口&#xff0c;提供应用程序与开发人员基于某软件…

syscall 系统调用

转自&#xff1a;http://blog.csdn.net/b02042236/article/details/6136598 5.1.5 如何使用系统调用 如图5.2所示&#xff0c;用户应用可以通过两种方式使用系统调用。第一种方式是通过C库函数&#xff0c;包括系统调用在C库中的封装函数和其他普通函数。 图5.2 使用系统调用…

linux下syscall函数

NAME syscall - 间接系统调用 SYNOPSIS #define _GNU_SOURCE #include <unistd.h> #include <sys/syscall.h> /* For SYS_xxx definitions */ int syscall(int number, ...); DESCRIPTION …

#Java干货分享:这五个网站能打通你的任督二脉,让你技术大增

现如今的程序员可是一个需要时刻学习的职业&#xff0c;尤其是目前非常火热的Java&#xff0c;作为应用最为广泛的语言&#xff0c;在这一点上体现得尤其强烈。今天分享一些网站资源给大家学习&#xff0c;希望能够为你提供帮助&#xff01; 1、GitHub 这个网站不用多说&…

redis 技术分享

1、是什么 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 2、应用场景 2.1 特点 Redis 与其他 key - …