【机器学习】 - 目标检测 - VOC格式数据集介绍与自己制作

一、VOC数据集

 

PASCAL VOC 挑战赛主要有 Object Classification 、Object Detection、Object Segmentation、Human Layout、Action Classification 这几类子任务。每年都有新的数据集供参赛者进行训练。公布了2007和2012两年的数据集,分别称之为VOC2007和VOC2012,

VOC2012数据集下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

VOC数据集下载地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/

所有的标注图片都有Detection需要的label, 但只有部分数据有Segmentation Label。
VOC2007中包含9963张标注过的图片, 由train/val/test三部分组成, 共标注出24,640个物体。
VOC2007的test数据label已经公布, 之后的没有公布(只有图片,没有label)。
对于检测任务,VOC2012的trainval/test包含08-11年的所有对应图片。 trainval有11540张图片共27450个物体。
对于分割任务, VOC2012的trainval包含07-11年的所有对应图片, test只包含08-11。trainval有 2913张图片共6929个物体。

 二、VOC格式数据集

因为标签不再是唯一的(因为VOC数据集需要进行很多任务,对每个任务都需要有至少一个标签来进行标注),因此VOC数据集有自己固定的组织格式,以 VOC 2007 为例,解压后的文件为:

.
├── Annotations 进行 detection 任务时的标签文件,xml 形式,文件名与图片名一一对应
├── ImageSets 包含三个子文件夹 Layout、Main、Segmentation,其中 Main 存放的是分类和检测的数据集分割文件
├── JPEGImages 存放 .jpg 格式的图片文件
├── SegmentationClass 存放按照 class 分割的图片
└── SegmentationObject 存放按照 object 分割的图片├── Main
│   ├── train.txt 写着用于训练的图片名称, 共 2501 个
│   ├── val.txt 写着用于验证的图片名称,共 2510 个
│   ├── trainval.txt train与val的合集。共 5011 个
│   ├── test.txt 写着用于测试的图片名称,共 4952 个

在大家进行目标检测的时候,可能需要针对某一特定任务进行训练和检测,因此可能需要重构成自己的VOC格式数据集,即在保证组织形式不变的前提下,更换成自己的数据集。文件格式和组织形式的统一,是为了后序代码处理的统一性。

 

三、制作自己的数据集

解压VOC2007数据集后可以看到VOC2007文件夹下有以下5个文件夹:

Annotations文件夹
该文件下存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
JPEGImages文件夹
改文件夹下存放的是数据集图片,包括训练和测试图片。
ImageSets文件夹
该文件夹下存放了三个文件,分别是Layout、Main、Segmentation。在这里我们只用存放图像数据的Main文件,其他两个暂且不管。
SegmentationClass文件和SegmentationObject文件。
这两个文件都是与图像分割相关。

我们只关注三个文件夹(目标检测)

annotation 和 JPEGImages 一一对应。

 

开始制作:
制作自己的VOC2007格式数据集其实不需要上述那么多内容,我们只要做三个部分即可:Annotations文件夹、JPEGImages文件夹、ImageSets文件夹下的Main文件。


第一步:我们参照原始VOC2007数据集的文件层次创建上述四个文件夹,也就是创建一个VOCdevkit文件夹,下面再创建Annotations、JPEGImages、ImageSets三个文件夹,最后在ImageSets文件夹下再创建一个Main文件夹。
创建好所有文件夹后,我们将自己的数据集图片都放到JPEGImages文件夹下。按照习惯,我们将图片的名字修改为000001.jpg这种格式的(参照原始数据集图片命名规则),统一命名方法网络上有很多,网上很多,这里就不多赘述了。
另外强调两点:第一点是图片的格式,图片需是JPEG或者JPG格式,其他格式需要转换一下。第二点是图片的长宽比,图片长宽比不能太大或太小,这个参考原始VOC2007数据集图片即可。


第二步:我们来制作Annotations文件夹下所需要存放的xml文件。这里我们需要借助大神带给我们的福利了:LabelImg工具,可以按照上面的说明进行安装和使用。看到满篇的英文是不是很晕,那这里有个简单的方法可以帮助到大家!当然lxml 库文件还是要装的,但如果你用的是Anaconda环境,那么你什么都不用做,只需要点击这里:LabelImg标注工具,根据自己的情况选择下载window版本还是linux版本,然后解压使用就行了!
关于如何使用,这里以window版本的为例说明。下载解压后会得到一个exe可执行文件,另一个是data文件夹,这里面有个txt文件,内容是预定义的分类标签名,里面的标签可以根据自己的需要进行修改。执行exe文件打开标注界面就可以进行操作了,操作方法可以参考这篇文章:使用方法
这里给张标注工具的参考图:

下面就进行漫长的标注工作吧。。。
说明:每标注完一张图片后进行保存,保存的xml文件名要与对应图片名一致,大家可以参考原始VOC2007数据集中JPEGImages文件夹下图片的命名和Annotations文件夹中的xml文件命名规则。
备注:这里还有个制作工具  VOC2007数据格式制作工具 也很好用,大家也可以试一试。


第三步:我们来制作ImageSets文件夹下Main文件夹中的4个文件(test.txt、train.txt、trainval.txt、val.txt)。
首先我们先来了解下这四个文件到底是干什么用的,当然从文件的命名上我们也都能大体猜得上来他们的作用,不过这里还是简单的说明一下吧。
test.txt:测试集
train.txt:训练集
val.txt:验证集
trainval.txt:训练和验证集

在原始VOC2007数据集中,trainval大约占整个数据集的50%,test大约为整个数据集的50%;train大约是trainval的50%,val大约为trainval的50%。所以我们可参考以下代码来生成这4个txt文件:

import os  
import random  trainval_percent = 0.5  
train_percent = 0.5  
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()

注意:上述代码中涉及到的路径要写全,另外各个数据集所占比例根据实际数据集的大小调整比例。

至此,我们自己的VOC2007格式数据集就全部制作完成了。

 

 

参考资料:

https://blog.csdn.net/qq_41185868/article/details/79927556

https://blog.csdn.net/weixin_35653315/article/details/71028523

https://blog.csdn.net/mzpmzk/article/details/88065416

https://blog.csdn.net/gulingfengze/article/details/79639111

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python学习】win10+Anaconda3环境,安装phthon第三方库Jieba

一、介绍 jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点。 精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分…

WebPart开发

Webpart的生命周期 1. 当一个包含WebPart的WSS站点页面被响应请求或者是它被提交到Server端的时候,这时WebPart生存周期开始了 2. OnInit 初始化,加载相关配置文件 (如WebPart任务面板上的属性,样式等配置信息) . 3. Loa…

【PAT甲级最新题解】PAT甲级2020.7月春季考试满分题解(附代码)

写在前面&#xff1a;这次题目虽然大多数是模拟题且不算难&#xff0c;但是题面其实不算友好&#xff0c;不少同学因为题目描述而错失满分。 A&#xff1a; 题意&#xff1a;给定一个数字串&#xff0c;问每一个前缀串是否是素数。 模拟题不多解释。 #include<cstdio>…

如何收缩超大的SharePoint_Config数据库

前言 在已经运行了2年多的SharePoint服务器上&#xff0c;发现SharePoint_Config的数据库文件越来越大&#xff0c;已经达到90几个GB&#xff0c;收缩可以减小20几个GB&#xff0c;但是一周以后又会恢复到90几个GB大小&#xff0c;甚是奇怪。 因为磁盘空间不足&#xff0c;一共…

SharePoint PowerShell命令系列

(1) Backup-SPSite & Restore-SPSite 这两条命令可能是大家最先接触的PowerShell命令了吧, 一个是备份网站集, 另一个是还原网站集. Backup-SPSite 例子 Backup-SPSite http://site_name -Path C:\Backup\site_name.bak 参数 Force: 覆盖现有备份NoSiteLock: 设置备份…

【Processing学习】 - 公交车马路动态绘制

效果图: 汽车动态移动,云彩动态移动,小草没有找到矢量图,百度了一张先用着. float q 0; int s 0; int add 1;PImage p1;void setup() {size(800, 400);background(0, 0, 255);rect(300, 150, 300, 140, 30);//sunfill(255, 255, 0);circle(800, 0, 40);first//circle(360,…

sharepoint 2013 网站集解锁

前言 最近碰到这样的一个问题&#xff0c;就是SharePoint 站点备份&#xff08;Backup-SPSite&#xff09;的时候&#xff0c;速度特别慢&#xff0c;然后网站变成只读状态&#xff08;备份过程中只读属于正常现象&#xff09;。但是&#xff0c;自己手欠把备份命令的PowerShel…

Qt 5.14 安装,windows10系统,64位,详细步骤,非常简单!

下载地址&#xff1a;http://download.qt.io/archive/qt/5.14/5.14.2/ 直接选择windows系统或mac兄或Linux系统对应版本即可。 这里解释一下 Qt 的版本号&#xff0c;比如 5.14.2 是完整的 Qt 库版本号&#xff0c;第一个数字 5 是大版本号&#xff08;major&#xff09;&…

最新的windows xp sp3序列号 xp序列号

最新的windows xp sp3序列号(绝对可通过正版验证) MRX3F-47B9T-2487J-KWKMF-RPWBY(工行版) 可用&#xff08;强推此号) QC986-27D34-6M3TY-JJXP9-TBGMD(台湾交大学生版) 可用 CM3HY-26VYW-6JRYC-X66GX-JVY2D 可用 DP7CM-PD6MC-6BKXT-M8JJ6-RPXGJ 可用 F4297-RCWJP-P482C-YY23Y…

2023年12月16日~12月22日(自适应反馈机制下基于卷积神经网络的高清晰反射波反演算法:CNN-RWI)

标题&#xff1a;Adaptive Feedback Convolutional-Neural-Network-Based High-Resolution Reflection-Waveform Inversion 全波形反演&#xff08;FWI&#xff09;是一种非线性拟合观测地震记录从而获得高清晰速度模型的最优化算法。FWI能够通过拟合浅层初至波和反射波获得较准…

C++语言 如何用G++进行编译和运行程序

在windows下&#xff0c;我们写C程序一般会有如下几个步骤&#xff1a; 编写.cpp文件&#xff0c;代码都在里面&#xff1b;可能还有一些.h文件之类的支持文件&#xff0c;这些文件一般都会放在一起&#xff0c;或者相对位置是固定的&#xff1b;编译文件&#xff0c;链接文件…

SharePoint 2016文档库所在数据库表的说明(文档库数据库)

突然被客户问一个问题&#xff0c;说数据库存在哪一个表&#xff0c;这个原本是开发的事&#xff0c;竟然文档我了&#xff0c;好吧这里记录一下&#xff0c;以便记忆给客户汇报。 SharePoint 数据库表说明&#xff1a; FeaturesTable that holds information about all the …

C++模板类嵌套类内部类局部类的区别

模板类就是将类定义成模板的形式。 C中好像不区分内部类与嵌套类两个名词。 内部类与嵌套类都是指在类中定义类。 局部类是指在函数中定义类。 &#xff08;c不能在函数中定义函数(python可以)。c在类中定义的函数也就是成员函数。&#xff09; &#xff08;c内部类与java内…

为sharepoint 2013 增加切换账户登陆菜单

SharePoint 2010是有一个用户切换功能的&#xff0c;不知为何2013中&#xff0c;将这个优秀的功能取消了&#xff0c;使用如下可以重回辉煌 修改sharepoint 服务器上下面路径中的Welcome.ascx文件&#xff1a; C:\Program Files\Common Files\Microsoft Shared\Web Server Ext…

C++ 异常,标准异常类,自定义异常类,throw,try,catch语句

要学习异常&#xff0c;首先就要学习throw和try,catch语句&#xff1a; C中try catch语句用法有非常灵活&#xff0c;有许多种组合&#xff1b; 这里简单介绍以下最基本的用法&#xff1b; 1. 格式 try{ ... } catch{ ... } try语句块是用来判断是否有异常&#xff1b; c…

SharePoint 2013 RBS(Remote BLOB Storag) 安装、部署、垃圾回收

SharePoint 承担着文件管理的工作&#xff0c;默认都是将它们以BLOB的数据形式存储在内容数据库当中&#xff1b;当文件大时&#xff0c;就很容易导致数据库容量被这些BLOB数据所快速消耗&#xff0c;而且频繁地对这些大数据量的BLOB数据进行读写访问&#xff0c;很容易在SQL端…

Processing 闪烁的圆 动画效果

打开Processing,CtrlR运行. 运行效果 : class myRect {float x,y;float r,a;//banjing secai bianhua myRect(float x, float y, float r,float a) {this.x x;this.y y;this.r r;this.a a;}void chang(){this.a 0.02;} void display() {stroke(255);fill(120-120*cos(a…

用生动的例子花式解释:python类中一定需要有 __init__方法么?没有会怎样?

python 类中一定需要有 __init __方法么&#xff1f;没有的会怎样&#xff1f; 在回答这个问题之前&#xff0c;先说两个问题&#xff1a;① 面向对象编程&#xff1f; ② 什么是类&#xff1f; 面向对象&#xff0c;先上一个正式点的解释&#xff1a; “把一组数据结构和处…

了解 SharePoint 2010 开发中的关键设计决定

在开发项目时&#xff0c;我们经常用到SVN.但是有时候&#xff0c;只知道把源码放到trunk , 把一些文档放到Document下面。其它的目录都应该放什么东西&#xff0c;应该怎么用。可能都有点模糊。 Branch 目录 &#xff1a; 跟工程项目相关的各个工程版本分支。该目录下面的版…

C++,string类的指针,string类数组的指针 string *s

可以这样&#xff1a; #include<iostream> #include<string> using namespace std;int main(void) {string s "hello";//定义一个char类型指针&#xff0c;把string s的首元素地址赋给pt,则pt指向字符串s.char *pt &s[0]; cout << pt <&…