voc2007数据集_【目标检测数据集】PASCAL VOC制作

【VOC2007+2012】

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

PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,用于构建和评估用于图像分类(Classification)检测(Object Detection)和分割(Segmentation)的算法,从2005年到2012年每年都会举行一场图像识别challenge。

数据集类别(20类):

Person: person;Animal: bird, cat, cow, dog, horse, sheep;Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train;Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor;

数据集目录(VOC2007为例,只列出目标检测所用到的):

-VOCdevkit-VOC2007-Annotations         #存放xml标注文件,每个xml文件都对应于JPEGImages文件夹的一张图片,文件命名格式为:<图片编号.xml>-JPEGImages          #存放训练图片和测试图片,文件命名格式为:<图片编号.jpg>-ImageSets           #存放的是challenge对应的图像数据-Main              #存放的是图像物体识别的数据,包含下列4个文件,文件内容格式均为:<图片编号>-train.txt       #记录训练集所包含的图片编号-test.txt        #记录测试集所包含的图片编号-val.txt         #记录验证集所包含的图片编号-trainval.txt    #记录验证集和训练集所包含的图片编号

把上述目录所列的文件夹建好,接下来制作自己的VOC格式数据集。

【标注工具labelImg】

labelImg软件是一款免费的图像标注工具,常用来为目标检测任务标注数据集。labelImg的安装和使用参考GitHub项目:

https://github.com/tzutalin/labelImg​github.com

记录下自己Mac版本的安装过程:

conda activate 环境名称         #可选
pip install pyqt5
pip install libxml2
pip install labelImg
labelImg                      #运行

【制作自己的数据集】

1.JPEGImages文件夹

搜集并删选出自定类别的图片数据,将所有的.jpg图像文件放入JPEGImages文件夹,命名格式统一为“%6d.jpg”,(000001.jpg)

# -*- coding:utf8 -*-'''批量重命名文件夹中的图片文件'''
import os
class BatchRename():def __init__(self):self.path = './JPEGImages'  # 修改成自己JPEGImages文件夹路径def rename(self):filelist = os.listdir(self.path)total_num = len(filelist)i = 1n = 6for item in filelist:if item.endswith('.jpg'):n = 6 - len(str(i))src = os.path.join(os.path.abspath(self.path), item)dst = os.path.join(os.path.abspath(self.path), str(0) * n + str(i) + '.jpg')try:os.rename(src, dst)print'converting %s to %s ...' % (src, dst)i = i + 1except:continueprint'total %d to rename & converted %d jpgs' % (total_num, i)
if __name__ == '__main__':demo = BatchRename()demo.rename()

2.Annotations文件夹

使用labelImg工具标注图片中的目标,选择好图片存放文件夹(JPEGImages)和标注文件夹(Annotations),接下来就是无止尽的标注。。。

3.ImageSets文件夹

在ImageSets文件夹下新建Main文件夹,执行下面代码生成test.txt , train.txt , trainval.txt , val.txt。

# -*- coding:utf-8 -*-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('Done')

【数据集常用代码】

1.批量修改xml标签

import os
import xml.etree.ElementTree as ET#程序功能:批量修改VOC数据集中xml标签文件的标签名称
def changelabelname(inputpath):listdir = os.listdir(inputpath)for file in listdir:if file.endswith('xml'):file = os.path.join(inputpath,file)tree = ET.parse(file)root = tree.getroot()for object1 in root.findall('object'):for sku in object1.findall('name'):           #查找需要修改的名称if (sku.text == 'type2_03'):               #‘preName’为修改前的名称sku.text = 'type2_02'                 #‘TESTNAME’为修改后的名称tree.write(file,encoding='utf-8')     #写进原始的xml文件并避免原始xml中文字符乱码else:passelse:passif __name__ == '__main__':inputpath = 'anno/'  #此处替换为自己的路径changelabelname(inputpath)

2.批量统计每个类别的图片数量及目标数量

import re
import os
import xml.etree.ElementTree as ETclass1 = 'type1_01'    #根据自己的类别修改(以下要均修改)
class2 = 'type2_02'
class3 = 'type2_03'
class4 = 'type1_02'
'''
class20 = 'tvmonitor'
'''
annotation_folder = './Annotations/'  # 改为自己标签文件夹的路径
# annotation_folder = '/home/.../VOC2007/Annotations/'
list = os.listdir(annotation_folder)def file_name(file_dir):L = []for root, dirs, files in os.walk(file_dir):for file in files:if os.path.splitext(file)[1] == '.xml':L.append(os.path.join(root, file))return Ltotal_number1 = 0    
total_number2 = 0
total_number3 = 0
total_number4 = 0
'''
total_number20 = 0
'''
total = 0
total_pic = 0pic_num1 = 0
pic_num2 = 0
pic_num3 = 0
pic_num4 = 0
'''
pic_num20 = 0
'''flag1 = 0
flag2 = 0
flag3 = 0
flag4 = 0
'''
flag20 = 0
'''xml_dirs = file_name(annotation_folder)for i in range(0, len(xml_dirs)):print(xml_dirs[i])annotation_file = open(xml_dirs[i]).read()root = ET.fromstring(annotation_file)total_pic = total_pic + 1for obj in root.findall('object'):label = obj.find('name').textif label == class1:total_number1 = total_number1 + 1flag1 = 1total = total + 1if label == class2:total_number2 = total_number2 + 1flag2 = 1total = total + 1if label == class3:total_number3 = total_number3 + 1flag3 = 1total = total + 1if label == class4:total_number4 = total_number4 + 1flag4 = 1total = total + 1'''if label == class20:total_number20=total_number20+1flag20=1total = total + 1'''if flag1 == 1:pic_num1 = pic_num1 + 1# print("pic number:", pic_num1)flag1 = 0if flag2 == 1:pic_num2 = pic_num2 + 1flag2 = 0if flag3 == 1:pic_num3 = pic_num3 + 1flag3 = 0if flag4 == 1:pic_num4 = pic_num4 + 1flag4 = 0'''if flag20==1:pic_num20=pic_num20+1flag20=0'''print(class1, pic_num1, total_number1)
print(class2, pic_num2, total_number2)
print(class3, pic_num3, total_number3)
print(class4, pic_num4, total_number4)
'''
print(class20,pic_num20, total_number20)
'''print("total", total_pic, total)

3.图片批量增广(水平、上下翻转等)

"""
图片批量翻转
"""
from PIL import Image
import os
import os.path# 指明被遍历的文件夹
rootdir = r'Rust_01/'
for parent, dirnames, filenames in os.walk(rootdir):  # 遍历图片for filename in filenames:print('parent is :' + parent)print('filename is :' + filename)currentPath = os.path.join(parent, filename)print('the fulll name of the file is :' + currentPath)im = Image.open(currentPath)# Image.FLIP_LEFT_RIGHT,表示将图像左右翻转out = im.transpose(Image.FLIP_LEFT_RIGHT)# Image.FLIP_TOP_BOTTOM,表示将图像上下翻转# out = im.transpose(Image.FLIP_TOP_BOTTOM)# Image.ROTATE_90,表示将图像逆时针旋转90°# out = im.transpose(Image.ROTATE_90)# Image.ROTATE_180,表示将图像逆时针旋转180°# out = im.transpose(Image.ROTATE_180)# Image.ROTATE_270,表示将图像逆时针旋转270°# out = im.transpose(Image.ROTATE_270)# Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)# out = im.transpose(Image.TRANSPOSE)# Image.TRANSVERSE,表示将图像进行转置,再水平翻转# out = im.transpose(Image.TRANSVERSE)# 新建文件夹保存翻转后图片newname = r"Rust_01/" + '' + filenameout.save(newname)  # 保存结束

说明:研一初学目标检测,本文记录自己制作数据集的过程,以上参考、摘抄于以下文章,推荐阅读。有些代码忘记在哪里借鉴的了,如有读者见到,联系,加入参考链接。

参考:

转载:VOC2007数据集制作 - _harvey - 博客园​www.cnblogs.comCSDN-专业IT技术社区-登录​blog.csdn.netCSDN-专业IT技术社区-登录​blog.csdn.net

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

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

相关文章

JDK和JRE的区别?main方法的注意点?强制和自动类型转换?

&#x1f4a1;涉及的知识点速通&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的输出都经历了啥&#xff1f;&#x1f6eb; Java的三个版本都是啥&#xff1f;&#x1f6eb; 关于main方法你都知道啥&#xff1f;&#x1f6eb; 强制and自动类型转换都是啥?各位小…

java将date类型转成yyyymmdd_java中的Date怎么转换成YYYYMMDD形式?

展开全部SimpleDateFormat inSdf new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);创建SimpleDateFormat对象的时候使用带Locale的构e69da5e6ba9062616964757a686964616f31333365633938造参数因为你的星期和月份是用E文写的 所以parse回来的时候自…

安卓10不支持qmc解码_Root神器支持安卓10 面具Magisk v20.4+Magisk Manager v7.5.1

Magisk的功能和xposed框架的功能差不多&#xff0c;也有很多插件可安装&#xff0c;而且自带root&#xff0c;刷入这个Magisk后你的rom同时也就有root了(支持安卓7.0&#xff0c;7.1&#xff0c;8.0&#xff0c;8.1,9,10)这也是目前安装8.1root的普遍方法&#xff0c;因为目前s…

centos7配置br0_Docker CentOS7 修改网络配置与宿主机桥接

Docker CentOS7 修改网络配置与宿主机桥接1、创建桥接物理网络(1)新建br0桥接网络&#xff0c;brctl show可以查看(需安装bridge-utils)(2)将宿主机物理网卡IP、掩码、网关、dns(或者dhcp)配置到br0上(3)删除宿主机物理网卡IP、掩码、网关、dns(或者dhcp)配置(4)将宿主机物理网…

==和equals判等、空串和null串、字符串常用API

&#x1f4a1;涉及的知识点速通&#x1f6eb; 关于变量和常量你都知道啥?&#x1f6eb; &和&&#xff06;、|和||有什么区别&#xff1f;&#x1f6eb; 关于字符串的问题你能答对几道&#xff1f;&#x1fa82; 可以修改一个字符串中的值吗?&#x1fa82; 字符串使用…

俩台电脑怎么设置同一局域网_方法 | 把手机上的照片传到电脑上

我想把手机上的照片/视频传到电脑上怎么办? 什么云盘&#xff0c;手机助手等等全扔到一边去&#xff0c;不用。请让我慢慢道来&#xff1a;现在&#xff0c;人们手机用的越来越多&#xff0c;即使在大街上&#xff0c;到处都是“低头族”。但是&#xff0c;有好多小伙伴问&…

数据持化技术的发展演变(SQL、JDBC、mybatis)

文章目录1 简单SQL语句1.1 查询1.2 新增1.3 修改1.4 删除1.5 多表查询2 JDBC2.1 什么是JDBC2.2 什么是jar和maven2.3 JDBC的使用2.4 JDBC总结3 mybatis3.1 什么是ORM?为什么是ORM不是JDBC&#xff1f;3.2 mybatis的使用3.3 mybatis总结4 mybatis与jdbc的逻辑相同处环境配置 j…

传统蒙文字体_蒙古要改回使用传统回鹘蒙文,这是种什么文字,蒙古为什么要改回...

喜欢就点关注吧!文字是一个国家的文化象征&#xff0c;也是其书面交流的主要工具&#xff0c;世界上的大多数国家都有自己独特的文字&#xff0c;我们的邻国蒙古也是如此&#xff0c;近日蒙古国实行了一场意义重大的文字改革&#xff0c;据新华社乌兰巴托3月18日报道&#xff0…

三态输出门实验报告注意事项_数电基础知识:各种IO输出的类型

集电极开路(OC)集电极开路输出的结构如图1所示&#xff0c;右边的那个三极管集电极什么都不接&#xff0c;所以叫做集电极开路&#xff1b;左边的三极管为反相之用&#xff0c;使输入为“0”时&#xff0c;输出也为“0”。对于图 1&#xff0c;当左端的输入为“0”时&#xff0…

数据持久化技术——MP

文章目录1 环境搭建1.1 创建一个maven的project1.2 pom.xml文件导入web开发依赖1.3 创建SpringBoot项目的主程序入口2 代码生成器3 配置数据库4 导入前端页面5 开始前端控制器的编码5.1 wrapper构造器mybatis-plus(简称 MP)是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基…

win7无法连接打印机拒绝访问_如何解决局域网无法访问SQL Server 2008 无法连接到(local)...

初次安装使用SQL server 2008时&#xff0c;可能会遇到无法连接到(local)的情况。那么&#xff0c;如何解决此问题&#xff1f;工具/原料: SQL server 2008方法/步骤1. 打开SQL server 配置管理器-->SQL server 网络配置-->实例名的协议(我的实例名为SQLEXPRESS)。2. 将S…

windows进程管理器_任务管理器就能搞定9成的电脑问题?方法在这里!

90% 对于电脑的不满&#xff0c;都逃不出这几个方面&#xff1a;电脑状态无法随时监测、运行卡顿、开机时间长、莫名黑屏、电池关键时刻不扛使(笔记本电池怎么保养&#xff1f;能不能一直插电源充电&#xff1f;可以戳这里→)&#xff0c;很多小伙伴就选择安装第三方软件来解决…

三维网格精简算法java版_ISMAR 2020 | 商汤提出手机端实时单目三维重建系统

导读&#xff1a;商汤研究院和浙江大学CAD&CG国家重点实验室合作研发了一个手机端实时单目三维重建系统Mobile3DRecon。与现有的基于RGBD的在线三维重建或离线生成表面网格的系统不同&#xff0c;该系统结合前端位姿跟踪结果&#xff0c;允许用户使用单目摄像头在线重建场景…

【分类汇总】idea快捷键、idea配置、常用插件

写在前面 千万别看目录很长就感觉本篇博客很絮叨繁琐&#xff0c;里面多是配置的讲解贴了很多的图片方便大家了解&#xff0c;配置成功一次之后就可以一直使用了。 快捷键的使用建议大家先看&#xff0c;后续敲代码的时候刻意的使用快捷键&#xff0c;相信经过两三天的使用就可…

win10设置默认输入法_个性化设置技巧

个性化设置技巧子墨居士前言本次内容主要是win10系统自带的功能&#xff0c;不是用第三方软件优化桌面的情况下&#xff0c;让自己的电脑桌面能更美观、更舒服。系统自身的个性化设置主要是下图中的几个。鼠标右击->个性化设置。 第三方软件的效果会更好&#xff0c;毕竟是专…

什么叫组网_家庭wifi,如何组网最合适

wifi信号通过电磁波在空中传播的&#xff0c;属于微波通信的一种&#xff0c;因为微波本身及发射功率的限制&#xff0c;导致wifi的穿透能力比较差&#xff0c;北方比较厚的承重强&#xff0c;铁门、家具等对都会对wifi信号有较强的削弱作用。穿过的障碍物越多&#xff0c;这种…

java输入输出、数组初始化

&#x1f4a1;涉及的知识点速通&#x1f6eb; 关于输入输出你都知道啥?&#x1f6eb; 关于控制路程都需要注意啥?&#x1f6eb; 关于数组的问题你能答对几道&#xff1f;&#x1fa82; 数组初始化的小细节你都知道吗?&#x1fa82; 这些Arrays的常见API你都掌握了吗?&#…

linux rm 命令删除文件恢复_Linux之恢复误删除文件

前言每当我们在生产环境服务器上执行rm命令时&#xff0c;总是提心吊胆的&#xff0c;因为一不小心执行了误删&#xff0c;然后就要准备跑路了&#xff0c;毕竟人不是机器&#xff0c;更何况机器也有 bug。那么如果真的删除了不该删除的文件&#xff0c;比如数据库、日志或执行…

ac2100 反弹shell无法粘贴_记一次突破反弹shell

背景某天闲着无聊&#xff0c;小伙伴发来一个某网站&#xff0c;说只能执行命令&#xff0c;不能反弹shell。测试对着目标站点一顿测试。发现确实存在shiro反序列化&#xff0c;并且存在可以利用的gadget。利用发现确实可以执行命令&#xff0c;但是我们执行反弹的时候。反弹不…

java三大特征 重载与重写的区别

&#x1f4a1;涉及的知识点速通&#x1f6eb; OOP的三大特征都是什么?&#x1fa82; 什么是封装?&#x1fa82; 什么是继承?&#x1fa82; 什么是多态?&#x1f6eb; 关于构造器你都知道什么?&#x1f6eb; 关于类的源文件都需要知道什么?&#x1f6eb; 重载和重写都是什…