.val()数据乱码_【目标检测数据集】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/507932.shtml

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

相关文章

pytorch-多GPU训练(单机多卡、多机多卡)

pytorch-多GPU训练&#xff08;单机多卡、多机多卡&#xff09; pytorch 单机多卡训练 首先是数据集的分布处理 需要用到的包&#xff1a; torch.utils.data.distributed.DistributedSampler torch.utils.data.DataLoader torch.utils.data.Dataset DistributedSampler这个…

机器人 铑元素_智能机器人 三十三

福里斯特茫然不知所措地从窃窃私语的黑暗中转过身来&#xff0c;沉重的失败感犹如巨怪压得他喘不过气来。他顺从地跛着脚走向笼内角落里的小浴室&#xff0c;冲着微笑着的木偶刚才经过的地方点点头&#xff0c;漫不经意地问道&#xff1a;“你们是如何抓住他们的&#xff1f;”…

character-level OCR之Character Region Awareness for Text Detection(CRAFT) 论文阅读

Character Region Awareness for Text Detection 论文阅读 论文地址(arXiv) &#xff0c;pytorch版本代码地址 最近在看一些OCR的问题&#xff0c;CRAFT是在场景OCR中效果比较好的模型&#xff0c;记录一下论文的阅读 已有的文本检测工作大致如下&#xff1a; 基于回归的文…

c# wpf 面试_【远程面试】九强通信 | 九洲电器集团全资子公司

成都IT内推圈成立于2016年,专注成都IT互联网领域的招聘与求职;覆盖精准IT人群10W,通过内推圈推荐且已入职人数超过5000,合作公司均系成都知名或靠谱公司.此公众号每天7:30AM准时推送当天职位详情,敬请关注并置顶&#xff01;岗位投递一、登陆内推圈官网: www.itneituiquan.com,…

ViT(Vision Transformer)学习

ViT(Vison Transformer)学习 Paper:An image is worth 1616 words: transformers for image recognition at scale. In ICLR, 2021. Transformer 在 NLP领域大放异彩&#xff0c;并且随着模型和数据集的不断增长&#xff0c;仍然没有表现出饱和的迹象。这使得使用更大规模的数…

mysql php宝塔 root_[转载]在安卓中安装宝塔面板运行PHP+MySQL

手机上的操作我用的手机是小米10pro&#xff0c;其他手机应该也能用相同的方法安装成功。安装Linux Deploy&#xff0c;然后给它root权限。点击左上角的菜单按钮。点击号&#xff0c;创建一个名为debian的配置文件。如果已经有了名为debian的配置文件&#xff0c;选择它即可。返…

cpri带宽不足的解决方法_u盘容量不足怎么办 u盘容量不足解决方法【介绍】

我们在使用u盘的时候总能碰到各种各样的问题&#xff0c;其中u盘容量不足问题也是神烦&#xff0c;很多时候打开并没有发现有文件存在&#xff0c;但是在你存文件的时候又被提示u盘容量不足无法操作&#xff0c;关于这个问题u启动通过整理和大家一起分享下解决办法。1、u盘里的…

(python numpy) np.array.shape 中 (3,)、(3,1)、(1,3)的区别

(python numpy) np.array.shape 中 (3,)、(3,1)、(1,3)的区别 被人问到这个问题&#xff0c;就记录一下吧 1. (3,) (3,)是[x,y,z][x,y,z][x,y,z]的形式&#xff0c;即为一维数组&#xff0c;访问数组元素用一个index for example: >>> array1 np.array([1,2,3]) …

复合的赋值运算符例题_Java学习:运算符的使用与注意事项

运算符的使用与注意事项四则运算当中的加号“”有常见的三种用法&#xff1a;对于数值来&#xff0c;那就是加法。对于字符char类型来说&#xff0c;在计算之前&#xff0c;char会被提升成为int&#xff0c;然后再计算。char类型字符&#xff0c;和int类型数字之间的对照关系比…

腾讯会议如何使用讲演者模式进行汇报(nian gao)

腾讯会议如何使用讲演者模式进行汇报&#xff08;nian gao&#xff09; 首先列出步骤&#xff0c;再一一演示&#xff1a; altf5 开启讲演者模式&#xff0c;调整讲演者模式的窗口为小窗alttab 切换回腾讯会议界面&#xff0c;屏幕共享power point窗口&#xff08;注意不是“…

bulk这个词的用法_15、形容词与副词(二)比较的用法

初中英语语法——形容词与副词(二)比较的用法语法解释1、形容词与副词比较级和最高级的规则变化单音节词与部分双音节词&#xff1a;(1)一般情况加-er&#xff0c;-estlong-longer-longest strong-stronger-strongestclean-cleaner-cleanest(2)以不发音的e结尾的词&#xff0c;…

pytorch 使用DataParallel 单机多卡和单卡保存和加载模型时遇到的问题

首先很多网上的博客&#xff0c;讲的都不对&#xff0c;自己跟着他们踩了很多坑 1.单卡训练&#xff0c;单卡加载 这里我为了把三个模块save到同一个文件里&#xff0c;我选择对所有的模型先封装成一个checkpoint字典&#xff0c;然后保存到同一个文件里&#xff0c;这样就可…

retinex 的水下图像增强算法_图像增强论文:腾讯优图CVPR2019

Underexposed Photo Enhancement using Deep Illumination Estimation基于深度学习优化光照的暗光下的图像增强论文地址&#xff1a;Underexposed Photo Enhancement using Deep Illumination Estimation暗光拍照也清晰&#xff0c;这是手机厂商目前激烈竞争的新拍照目标。提出…

python 实现 BCH 纠错码的方法

python 实现 BCH 纠错码的方法 BCH码是一类重要的纠错码&#xff0c;它把信源待发的信息序列按固定的κ位一组划分成消息组&#xff0c;再将每一消息组独立变换成长为n(n>κ)的二进制数字组&#xff0c;称为码字。如果消息组的数目为M(显然M>2),由此所获得的M个码字的全…

结构体引用_C/C++结构体完全攻略

结构体是一个由程序员定义的数据类型&#xff0c;可以容纳许多不同的数据值。在过去&#xff0c;面向对象编程的应用尚未普及之前&#xff0c;程序员通常使用这些从逻辑上连接在一起的数据组合到一个单元中。一旦结构体类型被声明并且其数据成员被标识&#xff0c;即可创建该类…

python 实现 CRC 冗余码的方法

python 实现 CRC 冗余码的方法 我这里考虑输入是 torch.Tensor的一个 只包含0 &#xff0c;1 元素的张量对于输入是numpy或者0&#xff0c;1字符串的方法就更简单了&#xff0c;总之都先要将输入处理成为 0&#xff0c;1字符串&#xff0c;例如“1010”首先构造一个输入&#…

mysql root密码过期了_Mac下重置mysql的root密码

php中文网最新课程每日17点准时技术干货分享我的mysql版本 MYSQL V5.7.9&#xff0c;旧版本请使用&#xff1a;UPDATE mysql.user SET PasswordPASSWORD(新密码) WHERE Userroot;Mac OS X - 重置 MySQL Root密码密码太多记不住&#xff1f;&#xff1f;你是否忘记了Mac OS 的My…

论文页眉奇偶页不同怎么设置_还在愁毕业论文的页眉页脚吗?

在文档中添加页眉和页脚能够很好的对相关信息进行展示或说明&#xff0c;在写论文的时候&#xff0c;设置页眉和页脚&#xff0c;能够让老师清楚的了解你的论文&#xff0c;但同时页眉和页脚的设置也是最让人头疼的&#xff0c;今天零壹学长就给大家详细的介绍页眉和页脚。了解…

Acquiring lock on /*/*/.vscode-server/bin/f80445acd5a3dadef24aa20916 vscode远程linux 服务器无法建立连接

1 删除 C:\Users\‘用户名’\.ssh\ 下的 know_hosts文件 2 使用其他的ssh工具&#xff08;MobaXterm&#xff09;远程连接目标服务器 首先使用指令&#xff1a;ps -aux |grep ‘自己的用户名’ 列出自己所有的运行的程序找到正在使用报错的文件/*/*/.vscode-server/bin/f8044…

账号管理工具_全新微信个人号管理工具能选择吗?为何这么说?

点击上方“蓝字”关注我们伴随着微信营销的重要性越来越高&#xff0c;很多企业的新媒体运营人员也开始把注意力都放到了微信账号的运营上&#xff0c;不仅是公众号的发展和运营&#xff0c;个人号在这个过程中也是非常重要的。相对于公众号和微信群&#xff0c;个人号的影响力…