【笔记】从零开始制作自己的Pascal VOC数据集

2023-05-16

1 Pascal VOC 数据集简介

1.1 概要

图像分类和目标检测顶会论文的实验部分总是可以看到基于Pascal VOC数据集的算法结果分析,它为图像分类、目标检测和图像分割都提供了优秀的数据支撑,2005年到2012年每年还举办相应的竞赛。Pascal VOC2005只有4个类别bicycles, cars, motorbikes, people,个人见的比较多的VOC2007和VOC2012发展到了20个类别。详细介绍请移步Pascal VOC官网。

1.2 数据集格式

本文以Pascal VOC2007为例,可以点击VOC2007 下载对应的数据集,各数据集的下载链接如下表,其余版本请移步Pascal VOC官网。

数据集版本官网链接百度云链接
voc2007VOC2007
voc2012VOC2012
1.2.1 整体框架

下载解压之后,可以看到VOC2007的文件树如下图所示:
voc2007文件树
VOC2007文件夹下面有5个文件夹Annotations,ImageSets,JPEGImages,SegmentationClass,SegmentationObject
在这里插入图片描述
其中后面的两个SegmentationClass,SegmentationObject是针对图像分割任务的,这里不做讨论。

1.2.2 Annotations

Annotations文件夹里是*.xml文件,xml文件里存放的是图像的文件信息。
在这里插入图片描述

1.2.2.1 xml文件内容
<annotation>
	<folder>VOC2007</folder> # 图片所在文件夹
	<filename>000005.jpg</filename># 图片名字
	<source>
		<database>The VOC2007 Database</database># 所属数据集
		<annotation>PASCAL VOC2007</annotation>
		<image>flickr</image>
		<flickrid>325991873</flickrid>
	</source>
	<owner>
		<flickrid>archintent louisville</flickrid>
		<name>?</name>
	</owner>
	# 自此处开始是特别重要的核心信息
	<size># 图片尺寸信息
		<width>500</width># 宽度
		<height>375</height> #高度
		<depth>3</depth>#通道数
	</size>
	<segmented>0</segmented>
	# 下面是图片中被框出来的物体信息,每个<object></object>代表了一个物体。
	<object>
		<name>chair</name># 物体类别名称
		<pose>Rear</pose>
		<truncated>0</truncated># 物体被框出来时是否被截断,意思是框出来的是不是只是物体的一部分,如果没有被截断,该处值是0
		<difficult>0</difficult># 该物体检测出的难度是不是困难级别
		<bndbox># 最重要 物体在图像中所处的坐标信息
			<xmin>263</xmin># 左上角
			<ymin>211</ymin>#左上角
			<xmax>324</xmax># 右下角
			<ymax>339</ymax># 右下角
		</bndbox>
	</object># 自此,一个物体的信息描述完毕,接下来是另一个物体信息,如果还有下一个的话。
	<object>
		<name>chair</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>165</xmin>
			<ymin>264</ymin>
			<xmax>253</xmax>
			<ymax>372</ymax>
		</bndbox>
	</object>
	........
</annotation>
1.2.3 JPEGImages

JPEGImages文件夹中存放原始图片,一般格式为.jpg
在这里插入图片描述

1.2.4 ImageSets

ImageSets文件夹下本次讨论的只有Main文件夹,此文件夹中存放的主要又有四个文本文件-test.txt,train.txt,trainval.txt,val.txt,其中分别存放的是测试集图片的文件名、训练集图片的文件名、训练验证集图片的文件名、验证集图片的文件名
在这里插入图片描述

2 动手制作

制作VOC数据集的过程就是生成上述三个文件夹的过程。仿照标准VOC数据集,先构建框架如下图所示的数据集框架。
在这里插入图片描述
笔者课程作业是枪支检测,接下来就以枪支数据集的制作来介绍。

2.1 JPEGImages

首先找图片,数据集中占比最大最优先的是图像。可以手动从网上另存为,也可以用爬虫去爬,或者其他手段。待准备好一堆图片之后,使用脚本给他们按照0x6d.jpg的格式重命名。

# -*- coding: utf-8 -*-
# @Time    : 2018/11/10 11:59
# @Author  : lazerliu
# @File    : rename_images.py
import cv2 as cv
import os

# ==================可能需要修改的地方=====================================#
g_root_path = "E:/Pycharm/try_my_dataset_proj/datas"
os.chdir(g_root_path)  # 更改工作路径到图片根目录
org_path = "org/"  # 原图片目录
dst_path = "rename/"  # 目标图片目录
img_cnt = 5000 # 图片的起始名字,这里是‘005000.jpg’
# ==================================================================#

file_list = os.listdir(org_path)
if os.path.exists(dst_path) is False:
    os.makedirs(dst_path)
for idx, file in enumerate(file_list):
    img = cv.imread(org_path + file)
    # img=cv.resize(img,(512,512))
    img_name = os.path.join(dst_path, "%06d.jpg" % img_cnt)
    cv.imwrite(img_name, img)
    img_cnt += 1

编号之后的图片

2.1 Annotations

标注信息的生成需要借助 labelImg工具,官网下载不了,戳这里密码 t2r8。

2.1.1安装启动labelImg

下载好之后解压,首先打开data/predefined_classes.txt,全部删除之后加上我们要得类别名称,如gun
在这里插入图片描述
labelImg.exe,启动软件。如果出现闪退,戳labelImg闪退解决方案
在这里插入图片描述

2.1.2 打开要标注的图片目录

点击左侧第二个 Open Dir按钮,选择刚才生成好的图片目录。
在这里插入图片描述
在这里插入图片描述

2.1.3 标注

在英文输入法模式下,按下W,就可以选择标注区域了,用鼠标拖动,把要检测的类别标注出来,然后选择类别。
在这里插入图片描述
在这里插入图片描述
所有物体都标注结束,Ctrl+S保存,然后D或者左边的Next Image框下张图片。
在这里插入图片描述
一通操作之后便得到了图片的标注信息*.xml,现在把这些xml文件放到Annotations文件夹下。
在这里插入图片描述

2.3 ImageSets

简单运行下面的脚本即可。

# -*- coding: utf-8 -*-
# @Time    : 2018/11/12 13:03
# @Author  : lazerliu
# @File    : xml2voc.py
import os
import random

# ==================可能需要修改的地方=====================================#
g_root_path = "D:/VOCdevkit/VOC2007/"
xmlfilepath = "Annotations"  # 标注文件存放路径
saveBasePath = "ImageSets/Main/"  # ImageSets信息生成路径
trainval_percent = 0.98
train_percent = 0.98
# ==================可能需要修改的地方=====================================#

os.chdir(g_root_path)
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
xml_list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(xml_list, tv)
train = random.sample(trainval, tr)

print("train and val size", tv)
print("train  size", tr)
ftrainval = open(saveBasePath + "trainval.txt", "w")
ftest = open(saveBasePath + "test.txt", "w")
ftrain = open(saveBasePath + "train.txt", "w")
fval = open(saveBasePath + "val.txt", "w")

for i in xml_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()

在这里插入图片描述

现在,自己的VOC数据集制作完毕,可以在任何可以使用官方VOC数据集的场合下(图像分割除外)使用当前数据集了。

【完】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【笔记】从零开始制作自己的Pascal VOC数据集 的相关文章

  • 转化Foggy_Cityscapes数据集为voc和yolo格式用作目标检测

    目录 一 数据集下载 xff08 1 xff09 解压后文件夹目录 xff08 2 xff09 gtFine格式如下所示 xff1a 二 转换为VOC数据集格式 xff08 1 xff09 生成xml标签 xff08 2 xff09 将le
  • 【笔记】从零开始制作自己的Pascal VOC数据集

    1 Pascal VOC 数据集简介 1 1 概要 图像分类和目标检测顶会论文的实验部分总是可以看到基于Pascal VOC数据集的算法结果分析 xff0c 它为图像分类 目标检测和图像分割都提供了优秀的数据支撑 xff0c 2005年到2
  • VOC数据集颜色表colormap与代码

    VOC颜色和分类的对于关系 code如下 xff0c 这里提供两个版本 xff0c 一个是list tuple 版本 xff0c 支持直接在opencv的color参数使用 xff1b 另一个是ndarray版返回 list 版 def v
  • #define用法总结

    刚开始接触VC 的同学们 估计对这个东西有这莫大的恐惧 这个经常写在添加头文件的地方的奇怪语句 如果看过mfc那么 那么拿出一些application framework里面的宏 估计会吓死一片 说了这么多只是想说 不明白其用法的人很害怕
  • 目标识别数据集互相转换——xml、txt、json数据格式互转

    VOC数据格式与YOLO数据格式互转 1 VOC数据格式 VOC Visual Object Classes 是一个常用的计算机视觉数据集 它主要用于对象检测 分类和分割任务 VOC的标注格式 也被许多其他的数据集采用 因此理解这个数据格式
  • Bridge桥接模式

    作用 将抽象部份与它的实现部份分离 使它们都可以独立地变化 将抽象 Abstraction 与实现 Implementation 分离 使得二者可以独立地变化 桥接模式号称设计模式中最难理解的模式之一 关键就是这个抽象和实现的分离非常让人奇
  • DOTA目标检测数据集

    Dota开源目标检测数据集 DOTA v1 5包含16个类别中的40万个带注释的对象实例 这是DOTA v1 0的更新版本 它们都使用相同的航拍图像 但是DOTA v1 5修改并更新了对象的注释 其中许多在DOTA v1 0中丢失的10像素
  • 十万行代码!!!

    前些天 看到网上雷军写的一篇好象是叫给程序员的几个建议 说到程序员必须要写够十万行代码才能成为高手 不要心存侥幸 于是我回来计算了一下我的程序 不算不知道 一算吓一跳 居然有超过9万行的代码 如果不算表单属性等 也有45000多行纯代码 这
  • 3 个点在 2d 中共线

    我试图验证 3 个点 双 何时在二维中共线 我已经发现 如果经过验证 则返回 true 的不同 Pascal 函数 这些函数使用整数来指定 X 和 Y 坐标 我需要更精确的计算 至少到X和Y表示的小数部分前3位 作为双类型 谁能帮我解决这个
  • TJSON.JsonToObject 不通过 setter

    将 Json 字符串转换为我自己的对象时遇到一些问题 我举一些例子 我的课 TClasse class private Fid integer Fnome string procedure Setid const Value integer
  • 尝试并捕捉帕斯卡

    我正在使用 Dev Pas 1 9 2 并试图确保输入符号或字母值时程序不会崩溃 我用谷歌搜索了一遍 但找不到任何关于如何实现这一目标的资源 任何帮助是极大的赞赏 谢谢 这是我尝试管理输入的代码 Function GetMenuChoice
  • Delphi - 从由非类型化指针填充的动态数组访问数据

    我在用着德尔福2009并不是说它对我正在做的事情有很大的影响 我想如果我还在的话我也会遇到同样的情况2007 我有一个 scsi 调用 它将数据输出到指针 查看它的方式是错误的 但我很难解释这一点 本来我用的是Move填充一个静态字节数组与
  • 在循环 TStringList 项时是否有避免越界索引错误的良好实践?

    首先 我的代码 procedure TForm1 Button3Click Sender TObject var tempId i integer begin tempId strtoint edit5 Text plik TStringL
  • 这个 Pascal 语法有什么问题?

    我不明白这是怎么回事 你能帮我个忙吗 这是有问题的代码 While not EOF Archi do begin index index 1 Read Archi Alumno index Promes index Alumno index
  • 需要逆误差函数的代码

    有谁知道我在哪里可以找到 逆误差函数 的代码 Freepascal Delphi 会更好 但 C C 也可以 TMath DMath 库没有它 这是一个实现erfinv 请注意 为了使其正常工作 您还需要良好的实施erf function
  • 当我尝试从表单 A 显示表单 B 时,为什么编译器会说“未声明的标识符”?

    为什么此代码不起作用 procedure TFormNotification Button3Click Sender TObject begin FormB Show end 我越来越未声明的标识符 error 您可能有一个名为的全局变量F
  • Pascal中字符串到整数的转换,怎么做?

    如何将字符串中打印的数字转换为整数 谢谢 程序 Val procedure Val S var V var Code Integer 此过程对小数和实数进行操作 参数 S 字符序列 为了正确转换 它必须包含 0 9 V 转换结果 如果结果是
  • 使用 GetProcAddress 从 C++ 调用 Delphi DLL:回调函数因参数无效而失败

    我有一个第三方 Delphi DLL 我从 C 调用它 不幸的是 我无法访问 Pascal DLL 代码 并且我不是 Pascal 程序员 没有lib文件 所以我使用GetProcAddress调用许多DLL函数 成功地按值 地址和引用传递
  • 真正的C静态局部变量替换?

    只是试图在 ObjectPascal Delphi 中实现 C C 静态局部变量的类似功能 让我们在 C 中编写以下函数 bool update position int x int y static int dx pow 1 0 rand
  • 如何使用用户输入来寻址 Pascal 中的特定变量(Eval/Exec?)

    我正在尝试在分形程序中做一些非常具体的事情隆起7X http apophysis 7x org 使用的脚本语言是Pascal 该项目是用德尔福写的 https svn code sf net p apophysis7x svn trunk

随机推荐