【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

voc2007数据集_【目标检测数据集】PASCAL VOC制作相关推荐

  1. 目标检测:PASCAL VOC 数据集简介

    一.简介 PASCAL VOC 挑战赛主要有 Object Classification .Object Detection.Object Segmentation.Human Layout.Acti ...

  2. 语义分割数据集转目标检测数据集

    前言 最近,在做实时性计算的东西,最初用的语义分割unet,发现它在服务器级GPU下推理的特别慢,但是精度还不错,但是我们追求的是实时性,所以我们还是用一下目标检测,最终选定yolov5 yolov5 ...

  3. 目标检测数据集PASCAL VOC简介

    简介 PASCAL VOC挑战赛 (The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛, PASCAL全称:Pattern Analysis, Stat ...

  4. PASCAL VOC目标检测数据集格式转化为COCO目标检测数据集格式

    VOC2012目标检测数据集格式转化为COCO目标检测数据集格式 你只需要传入一个VOC数据集根路径可以直接运行,简直不要太方便好吧 需要材料: VOC2012原始数据集 一个pycharm项目文件夹 ...

  5. 如何利用python将NWPU VHR-10目标检测遥感数据集的格式转换成VOC目标检测数据集的格式

    VOC目标检测数据集的格式 其中图片存放在JPEGImages文件夹中,标注是xml文件,存储在Annotations文件中 关于train集和val集的txt划分存放在ImageSets文件夹下面的 ...

  6. coco数据集目标检测论文_目标检测coco数据集点滴介绍

    目标检测coco数据集点滴介绍 1.  COCO数据集介绍 MS COCO 是google 开源的大型数据集, 分为目标检测.分割.关键点检测三大任务, 数据集主要由图片和json 标签文件组成. c ...

  7. 100种目标检测数据集【voc格式yolo格式json格式coco格式】+YOLO系列算法源码及训练好的模型

    提示:本文介绍并分享了应用于各行业.各领域非常有用的目标检测数据集(感谢您的关注+三连,数据集持续更新中-),其中绝大部分数据集作者已应用于各种实际落地项目,数据集整体质量好,标注精确,数据的多样性充 ...

  8. MSCOCO数据集转VOC数据集训练目标检测模型

    MSCOCO数据集转VOC数据集训练目标检测模型 Images 2014 Train images [83K/13GB] 2014 Val images [41K/6GB] 2014 Test ima ...

  9. 【yolo5】目标检测数据集制作

    目录 1.先验知识 2. VOC和COCO数据集: 2.1 VOC形式及其数据结构XML特点(好像可以使用py库中工具直接进行清洗) 2.1.1 VOC数据集的组织结构如下所示 2.1.2 XML的操 ...

  10. 数据集:Udacity Self-Driving 目标检测数据集

    转载自:http://blog.csdn.net/jesse_mx/article/details/72599220 前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SS ...

最新文章

  1. 调用 fork() 两次以避免僵死进程
  2. 学python心得体会1000字-学习python cgi的一点心得体会
  3. 背景建模与前景检测2(Background Generation And Foreground Detection Phase 2)
  4. Tkinter的listbox组件
  5. 22行代码AC——L1-023 输出GPLT(~解题报告~)
  6. Ant Design 使用小结
  7. JAVA入门级教学之(成员内部类)
  8. 计算机相关专业及本科课程整理
  9. 文件复制 详解(C++)
  10. html可视区高度,你真的懂js获取可视区宽高吗
  11. Android开机动画总结
  12. Vue 仿网易云音乐 WebApp
  13. 金蝶迷你版凭证导入工具_金蝶kis迷你版如何插入凭证?
  14. 关于Visual Studio 中“scanf”输入报错的解决方法
  15. 制造企业生产管理创新理念
  16. Grammer -- 助动词
  17. 佳能镜头编码_基于优化镜头的编码,现在可用于4k流
  18. 手机APP开发(安卓、IOS)logo图标在线生成工具上线啦
  19. 导线截面积和电流的关系
  20. 获取自然周;一年中总的周数,以及当前日期处于第几周

热门文章

  1. galaxy s8 android pc,手机秒变PC!三星Galaxy S8桌面模式曝光
  2. mysql连接不上怎么重置密码错误_MySQL数据库连接不上、密码修改问题
  3. python open函数参数newline_Python open() 函数
  4. 怎么从gitlab上下载别人的代码
  5. BugkuCTF-Crypto题rsa
  6. php上传商品信息并显示,第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)...
  7. java applet 访问文件_使用JavaApplet访问数据库
  8. php 验证码一直不对,ThinkPHP验证码老是出错怎么办
  9. mysql对测试如何_我如何对MySQL进行基准测试?
  10. 电大计算机应用基础试卷号2007,电大计算机应用基础(试卷版)计算机试卷7.doc...