【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

.val()数据乱码_【目标检测数据集】PASCAL VOC制作相关推荐

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

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

  2. 目标检测数据集-Pascal VOC 数据集介绍

    个人微信公众号:AI研习图书馆 ID:(Art-Intelligence) 欢迎关注,交流学习,共同进步~ 1.引言 PASCAL VOC数据集,为图像识别和分类提供了一整套标准化的优秀数据集,从20 ...

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

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

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

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

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

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

  6. 玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集

    文章目录 关于PASCAL VOC数据集 目录结构 ①创建VOC数据集的几个相关目录 XML文件的形式 ②读取dcm文件与xml文件的配对关系 ③创建VOC格式数据集 ④创建训练.验证集 本文所用代码 ...

  7. 制作目标检测数据集入门到精通(一)常用数据集(及下载数据网站)汇总

    目录 前言 1.目标识别知名数据集 1.1 PASCAL VOC 1.2 MS COCO 1.3 ImageNet 2 人脸识别相关 2.1 FERET人脸数据库 2.2 CMU Multi-PIE人 ...

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

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

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

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

最新文章

  1. 前后端、多语言、跨云部署,全链路追踪到底有多难?
  2. java统计行列和字数的函数_JAVA使用POI获取Excel的列数与行数
  3. java正则表达式判断_Java正则表达式判断
  4. 视差滚动(Parallax Scrolling)效果的原理和实现
  5. Android开发学习笔记-GridView的动态显示
  6. 【英语学习】【Level 08】U03 My Choice L6 Stories that make an impact
  7. ArcGIS API for Silverlight 入门学习笔记(一)hello world 补充问题
  8. 高级需求分析师培训要点,如何正确编写需求用例的5个提示!
  9. python 谷歌翻译 api_python免费调用谷歌翻译接口
  10. matlab绘制成像测井,成像测井系统简介.ppt
  11. Kali linux渗透测试系列————29、Kali linux 渗透攻击之无线网络攻击
  12. 丰巢“羊毛”,出在快递身上,让用户买单!
  13. 伯通过计算机网络,用于互联的计算机网络的安全系统
  14. 几个有创意有趣的网站推荐
  15. crackme02——Afkayas.1
  16. 设计模式读书笔记(三) Builder(建造者)模式
  17. 使用opencv直接打开云钥GigE网络工业相机
  18. css icon设置,CSS之字体图标 icon 的多种实现
  19. 商务电子邮箱那个安全?怎么使用163邮箱最安全?
  20. ISV是Independent Software Vendors 的英文缩写,意为“独立软件开发商”

热门文章

  1. java静态页面我都做不出_Java高并发:静态页面生成方案
  2. idea插件开发(02)---相关概念介绍
  3. 多因素方差分析中预测因素的筛多_用回归来理解方差分析(二):两因素方差分析...
  4. VS2019 配色_这个双11,凯里-欧文陪你过!欧文6正式发布,城市版配色真的香
  5. opencv java ubuntu_Ubuntu 16.04配置OpenCV 3.1.0 for Java
  6. mysql计算订单总金额_mysql统计当天消费总额
  7. qfile指定从多少行开始_大牛进化路上之Linux基础命令,看看你了解多少?
  8. mysql socket 与IP区别_MySQL本地用IP登陆而非socket
  9. 太吾绘卷第一世攻略_建平中学高二数学周练卷(2020.09)
  10. leetcode 75 --- sort-colors