数据集详解(只介绍目标检测中):

目标检测主要用Annotations保存标签数据、ImageSets保存具体数据集的索引、JPEGImages保存图片。其他为分割。有20个类别

Annotations:

文件保存位置:VOC2012/Annotations的xml文件

保存信息:

1、物体name:如fperson;

2、size:width,height,depth

3、bbox: xmin、xmax、ymin、ymax

ImageSets:

包括 Action,Layout,Main,Segmentation 四个文件夹。

Action:存放的是人的动作(例如running、jumping等等)
Layout:存放的是具有人体部位的数据(人的head、hand、feet等等,这也是VOC challenge的一部分
Main:存放的是图像物体识别的数据,总共分为20类。
Segmentation:存放的是可用于分割的数据。
ImageSets/Main/ 文件夹以 , {class}_trainval.txt ,{class}_val.txt 的格式命名。 train.txt, val.txt 例外

1、 {class}_train.txt 保存类别为 class 的训练集的所有索引,每一个 class 的 train 数据都有 5717 个。
2、{class}_val.txt 保存类别为 class 的验证集的所有索引,每一个 class 的val数据都有 5823 个
3、{class}_trainval.txt 保存类别为 class 的训练验证集的所有索引,每一个 class 的val数据都有11540 个

每个文件内容:

其中1表示正样本,-1表示负样本

VOC2012/ImageSets/Main/train.txt 保存了所有训练集的文件名,ImageSets/Main/val.txt 保存了所有验证集的文件名从 VOC2012/JPEGImages/ 找到文件名对应的图片文件,VOC2012/Annotations找到文件名对应的标签文件

JPEGImages:

需要解码获得图像数据


import os
import sys
import os.pathimport random
import numpy as npimport torch
import torch.utils.data as data
import torchvision.transforms as transformsimport cv2class yoloDataset(data.Dataset):'''自定义封装数据集    '''image_size = 224def __init__(self,root,list_file,train,transform):print('数据初始化')self.root=rootself.train = trainself.transform=transform    #对图像转化self.fnames = []            #图像名字self.boxes = []self.labels = []self.mean = (123,117,104)   #RGB均值with open(list_file) as f:lines  = f.readlines()# 遍历voc2012train.txt每一行for line in lines:splited = line.strip().split()# 赋值图像名字self.fnames.append(splited[0])# 赋值一张图的物体总数num_faces = int(splited[1])box=[]label=[]# 遍历一张图的所有物体#  bbox坐标(4个值)   物体对应的类的序号(1个值)  所以要加5*ifor i in range(num_faces):x = float(splited[2+5*i])y = float(splited[3+5*i])x2 = float(splited[4+5*i])y2 = float(splited[5+5*i])c = splited[6+5*i]box.append([x,y,x2,y2])label.append(int(c)+1)# bbox  写入所有物体的坐标值self.boxes.append(torch.Tensor(box))# label 写入标签self.labels.append(torch.LongTensor(label))# 数据集中图像总数self.num_samples = len(self.boxes)def __getitem__(self,idx):'''继承Dataset,需实现该方法,得到一个item'''fname = self.fnames[idx]# 读取图像img = cv2.imread(os.path.join(self.root+fname))# clone 深复制,不共享内存# 拿出对应的bbox及 标签对应的序号boxes = self.boxes[idx].clone()labels = self.labels[idx].clone()# 如果为训练集,进行数据增强if self.train:# 随机翻转img, boxes = self.random_flip(img, boxes)#固定住高度,以0.6-1.4伸缩宽度,做图像形变img,boxes = self.randomScale(img,boxes)# 随机模糊img = self.randomBlur(img)# 随机亮度img = self.RandomBrightness(img)# 随机色调img = self.RandomHue(img)# 随机饱和度img = self.RandomSaturation(img)# 随机转换img,boxes,labels = self.randomShift(img,boxes,labels)h,w,_ = img.shapeboxes /= torch.Tensor([w,h,w,h]).expand_as(boxes)img = self.BGR2RGB(img) #因为pytorch自身提供的预训练好的模型期望的输入是RGBimg = self.subMean(img,self.mean) #减去均值img = cv2.resize(img,(self.image_size,self.image_size))   #改变形状到(224,224)# 拿到图像对应的真值,以便计算losstarget = self.encoder(boxes,labels)# 7x7x30  #  一张图被分为7x7的网格;30=(2x5+20)                                         #一个网格预测两个框   一个网格预测所有分类概率,VOC数据集分类为20类# 图像转化for t in self.transform:img = t(img)#返回 最终处理好的img 以及 对应的 真值target(形状为网络的输出结果的大小)return img,targetdef __len__(self):'''继承Dataset,需实现该方法,得到数据集中图像总数'''return self.num_samplesdef encoder(self,boxes,labels):'''boxes (tensor) [[x1,y1,x2,y2],[x1,y1,x2,y2],[]]labels (tensor) [...]return 7x7x30'''target = torch.zeros((7,7,30))cell_size = 1./7# boxes[:, 2:]代表  2: 代表xmax,ymax# boxes[:, :2]代表  :2  代表xmin,ymin# wh代表  bbox的宽(xmax-xmin)和高(ymax-ymin)wh = boxes[:,2:]-boxes[:,:2]# bbox的中心点坐标cxcy = (boxes[:,2:]+boxes[:,:2])/2# cxcy.size()[0]代表 一张图像的物体总数# 遍历一张图像的物体总数for i in range(cxcy.size()[0]):# 拿到第i行数据,即第i个bbox的中心点坐标(相对于整张图,取值在0-1之间)cxcy_sample = cxcy[i]# ceil返回数字的上入整数# cxcy_sample为一个物体的中心点坐标,求该坐标位于7x7网格的哪个网格# cxcy_sample坐标在0-1之间  现在求它再0-7之间的值,故乘以7# ij长度为2,代表7x7框的某一个框 负责预测一个物体ij = (cxcy_sample/cell_size).ceil()-1# 每行的第4和第9的值设置为1,即每个网格提供的两个真实候选框 框住物体的概率是1.#xml中坐标理解:原图像左上角为原点,右边为x轴,下边为y轴。# 而二维矩阵(x,y)  x代表第几行,y代表第几列# 假设ij为(1,2) 代表x轴方向长度为1,y轴方向长度为2# 二维矩阵取(2,1) 从0开始,代表第2行,第1列的值# 画一下图就明白了target[int(ij[1]),int(ij[0]),4] = 1target[int(ij[1]),int(ij[0]),9] = 1# 加9是因为前0-9为两个真实候选款的值。后10-20为20分类   将对应分类标为1target[int(ij[1]),int(ij[0]),int(labels[i])+9] = 1# 匹配到的网格的左上角的坐标(取值在0-1之间)(原作者)# 根据二维矩阵的性质,从上到下  从左到右xy = ij*cell_size#cxcy_sample:第i个bbox的中心点坐标     xy:匹配到的网格的左上角相对坐标# delta_xy:真实框的中心点坐标相对于  位于该中心点所在网格的左上角   的相对坐标,此时可以将网格的左上角看做原点,你这点相对于原点的位置。取值在0-1,但是比1/7小delta_xy = (cxcy_sample -xy)/cell_size# x,y代表了检测框中心相对于网格边框的坐标。w,h的取值相对于整幅图像的尺寸# 写入一个网格对应两个框的x,y,   wh:bbox的宽(xmax-xmin)和高(ymax-ymin)(取值在0-1之间)target[int(ij[1]),int(ij[0]),2:4] = wh[i]target[int(ij[1]),int(ij[0]),:2] = delta_xytarget[int(ij[1]),int(ij[0]),7:9] = wh[i]target[int(ij[1]),int(ij[0]),5:7] = delta_xyreturn target

此处未定义随机裁剪等图像转化的函数

参考:

PASCAL VOC 2012 数据集详解_wenxueliu的博客-CSDN博客_voc2012数据集

认识PASCAL VOC数据集(目标检测)相关推荐

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

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

  2. [数据集][VOC][目标检测]西瓜数据集目标检测可用yolo训练-1702张介绍

    数据集名称:高质量西瓜目标检测数据集 数据集地址:数据集VOC格式目标检测数据集西瓜数据集-1702张-数据集文档类资源-CSDN下载 数据集介绍: 数据集格式:Pascal VOC格式(不包含分割路 ...

  3. [数据集][目标检测]篮球数据集VOC格式7398张

    数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):7398 标注数量(xml文件个数):739 ...

  4. RCNN系列实验的PASCAL VOC数据集格式设置

    我们在做RCNN系列的实验时,往往需要把数据集的格式设置为和PASCAL VOC数据集一样的格式,其实当然也可以修改读取数据的代码,只是这样更为麻烦,自己的数据格式变了又得修改.  首先以VOC200 ...

  5. 图像处理基本库的学习笔记5--公共数据集,PASCAL VOC数据集,NYUD V2数据集的简介与提取,COCO2017,医学影像数据集汇总

    目录 公共数据集 计算机视觉标准数据集整理-PASCAL VOC数据集 数据集文件结构 Annotation JPEGImages SegmentationClass SegmentationObje ...

  6. 人工智能学习:PASCAL VOC数据集读取(6)

    PASCAL VOC是一个国际的计算机视觉挑战赛,数据集包含了20个分类的3万多张图片.挑战赛及其数据集基础上涌现不少知名的目标检测模型如R-CNN,YOLO,SSD等.可以通过下载和读取的方法载入P ...

  7. Pascal VOC 数据集介绍(tensorflow model zoo)

    Pascal VOC 数据集的下载 # 下载2007年的训练数据 wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06- ...

  8. PASCAL VOC数据集分析(分类部分)

    PASCAL VOC数据集分析 PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge. 每一年都有自己的数据集.pa ...

  9. PASCAL VOC数据集

    一.简介 PASCAL: pattern analysis, statistical modelling and computational learning VOC: visual object c ...

  10. PASCAL VOC 数据集的标注格式

    PASCAL VOC 数据集的标注格式 PASCAL VOC 挑战赛 ( **The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛. PASCAL的全称是 ...

最新文章

  1. 一个思维习惯,让你成为架构师
  2. 从自来水公司到社会工作者再做运维,我深耕 IT 一线的这 8 年
  3. Android学习笔记--动画特效
  4. Python_编写UDP通信编解码类、文件的上传、远程执行命令、黏包
  5. 老问题,SQL保存图片。保存以后再读出来,发现stream的大小不一致。虽然老,但没搜到结果。...
  6. vs2008 error LNK2019: 无法解析的外部符号总结
  7. Python——相对路径的学习笔记
  8. delphi 调试控件代码_机器人调试(六十七)
  9. 第一周golang学习:--基本数据类型与string字符串类型之间的转换
  10. 移动端 重定向 https 请求
  11. MySQL分库分表dble初次尝试
  12. 【虚拟机数据恢复】VMware ESX SERVER数据恢复案例
  13. Drools-决策表
  14. 手淘推出“店铺二楼”
  15. canvas绘制火柴人
  16. 事件抽取文献整理(2018)
  17. 共振峰估计2MATLAB
  18. 【递推矩阵快速幂】hdu 2604
  19. 如何选出符合一定条件的股票
  20. 阿哈c语言教程pdf,C++教程-完整版.pdf

热门文章

  1. Ubuntu搭建BT服务器FTP服务器发布种子
  2. 结果导向的前提是过程控制
  3. 醉枕江山第五十二章 公主中的公主
  4. 爱有很多种,但一不小心就会失去……
  5. Bitbake--语法和操作符
  6. linux hba卡超时时间,如何设置Emulex HBA 卡超时参数
  7. Django使用DRF + Simple JWT 完成小程序使用自定义用户的注册、登录和认证
  8. 51单片机最小系统板制作
  9. python中的round函数怎么解释_round函数怎么用_python中round函数怎么用
  10. 《当时只道是寻常》——安意如——品纳兰容若《饮水词》