VOC数据集介绍及构建自己的VOC格式目标检测数据集

文章目录

检测系列相关文章参考如下链接:

  1. VOC数据的结构介绍及自定义生成,用labelimg自已标注
  2. VOC标准数据的生成及分析,VOC易用labelimg生成,做为基础的检测数据类型
  3. VOC转YOLO,方便YOLO系列模型使用
  4. VOC转COCO,方便用于COCO map评估
  5. YOLO转VOC,方便使用我们的VOC相关分析和处理代码
  6. COCO转VOC,方便使用我们的VOC相关分析和处理代码
    以上数据格式互转,方便我们处理各种收集的开源数据和自己标记的数据的整合。当然也不是特别的全面,但是工作中常用的主流的格式是包含的。
    觉的有价值的小伙伴可以给点个赞。

1、安装标注工具

数据格式是VOC格式,标注工具是labelimg,更多安装方法查看官网

1.1 ubuntu linux 系统


git clone https://github.com/tzutalin/labelImg
cd labelImg

sudo apt-get install pyqt5-dev-tools
python3 -m install pip install lxml pyqt5
python3 -m install pip install labelImg
labelImg [IMAGE_PATH] [PRE-DEFINED CLASS FILE]

1.2 windows系统

下载地址,双击即可使用。data/predefined_classes.txt下的内容,可以修改自定义分类类别。

2、labelimg使用方法

本节将以windows系统的软件使用为例进行说明。图型界面如下:

VOC数据集介绍及构建自己的VOC格式目标检测数据集
opendir_用来打开图片所在文件夹
_change save dir
用来选择结果保存文件夹,可以与图片文件夹是同一个
更多的快捷键如下:

快捷键功能Ctrl+uLoad all of the images from a directoryCtrl+rChange the default annotation target dirCtrl+sSaveCtrl + dCopy the current label and rect boxCtrl + Shift + dDelete the current imageSpaceFlag the current image as verifiedwCreate a rect boxdNext imageaPrevious imagedelDelete the selected rect boxCtrl++Zoom inCtrl–Zoom out↑→↓←Keyboard arrows to move selected rect box这些功能可以在标注图片过程中可以逐渐熟练使用,而且界面上有按钮可以来代替这些功能。要说明的是空格键来verfied图片,标注完成后,可以过一遍图片,来逐张验证,验证前后的区别是:验证前验证后––

VOC数据集介绍及构建自己的VOC格式目标检测数据集

只是背景颜色的不现。另外,VIew选项中,有几个按扭,可以提高标注效率:

VOC数据集介绍及构建自己的VOC格式目标检测数据集

,具本分析请看下文。

; 3、标注结果文件说明

标注工具上有两种格式可以选择,Pascal VOC和YOLO格式。

Pascal VOC格式YOLO格式

VOC数据集介绍及构建自己的VOC格式目标检测数据集

对两种结果的文件分别进行保存然后查看:

VOC数据集介绍及构建自己的VOC格式目标检测数据集

上图标注了三个类别,标注结果如下:

VOC数据集介绍及构建自己的VOC格式目标检测数据集

pascal voc格式保存结果为1.xml,yolo保存结果为1.txt和classes.txt。该软件对标注好的一张图片只能保存一次,所以对其中oilTruck这个分类的框微动一下后,再次保存的。不论那种结果保存格式,文件名与图片名一一对应,只有扩展名不同。下面看一下两种格式中的标注内容。

3.1 Pascal VOC数据集介绍

本段就贴个链接1链接2吧,因为写的很好,在继续读下文前,一定要去认真看一看。

3.2 Pascal VOC格式

该种格式以xml文件进行保存,具体内容是:

<annotation>
    <folder>油罐车图片</folder>
    <filename>1.jpg</filename>
    <path>D:\Desktop\油罐车图片\1.jpg</path>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>312</width>
        <height>208</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>redCap</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>43</xmin>
            <ymin>92</ymin>
            <xmax>96</xmax>
            <ymax>144</ymax>
        </bndbox>
    </object>
    <object>
        <name>yellowCap</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>147</xmin>
            <ymin>98</ymin>
            <xmax>198</xmax>
            <ymax>151</ymax>
        </bndbox>
    </object>
    <object>
        <name>oilTruck</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>111</xmin>
            <ymin>46</ymin>
            <xmax>266</xmax>
            <ymax>157</ymax>
        </bndbox>
    </object>
</annotation>

从xml中可以看到每个分类的对应名称和位置xmin,ymin,xmax,ymax。labelimg标注坐标体系是左上角是(0,0),向右向下分别x,y的正方向。

3.3 YOLO格式说明

有两个文件,1.txt中存放结果,具体内容是:

0 0.222756 0.567308 0.169872 0.250000
1 0.552885 0.598558 0.163462 0.254808
2 0.600962 0.487981 0.496795 0.533654

classes.txt中具体内容是:

redCap
yellowCap
oilTruck

如果有多张图片时,会有与图片文件名相同的txt结果文件,但classes.txt文件只有一个,同时该文件的内容与labelimg下data/predefined_classes.txt内容相同。结果文件与classes.txt文件配合才可获得具体的结果。如果我们增加分类或修改predefined_classes.txt时,结果会发生改变,得出个结论就是使用YOLO格式保存结果不便于对标注做出改动,所以使用pascal voc格式比较好。
解释一下结果文件1.txt中内容的意义:
如第一行: 0 0.222756 0.567308 0.169872 0.250000,0表示classes.txt 中第0行分类是redCap.剩下的四个数分别的标注框的(x,y,w,h),x,y是中心点,w是宽度,h是高度。与pascal voc xml文件中结果对应的具体计算公式如下:


w_img=312
h_img=208
x1 = 43
x2 = 96
y1 = 92
y2 = 144
x=(x1+x2)/2 = 69.5
y=(y1+y2)/2 = 118
w=x2-x1 = 53
h=y2-y1 = 52
x = x/w_img = 0.22275641
y = y/h_img = 0.56730769
w = w/w_img = 0.16987179
h = h/h_img = 0.25

总的来说,不论是什么格式保存,结果无非是分类与位置共五个数

4、标注图片和结果文件整理

数据标注完以后,文件夹中是以 .jpg结尾的图片和相同文件名以 .xml结尾的标注结果,在训练前,要将这些文件整理成pascal voc格式。标注完成后的结果文件如下图:

VOC数据集介绍及构建自己的VOC格式目标检测数据集

; 4.1 Pascal VOC数据组织结构

Pascal VOC数据主要有2007和2012两年的数据,可以这里下载,也可以通过命令行下载:

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

2007有train,val,test,而2012只有train和val
下载后解压:

tar xf *.tar

解压后结果是:


VOCdevkit
├── VOC2007
└── VOC2012

VOCdevkit/VOC2007
├── Annotations
├── ImageSets
├── JPEGImages
├── SegmentationClass
└── SegmentationObject

VOCdevkit/VOC2012
├── Annotations
├── ImageSets
├── JPEGImages
├── SegmentationClass
└── SegmentationObject

VOCdevkit/VOC2007/Annotations/
├── 000001.xml
├── 000002.xml
├── 000003.xml
├── 000004.xml
├── 000005.xml
├── 000006.xml
├── 000007.xml
├── 000008.xml
├── 000009.xml
├── 000010.xml
...

VOCdevkit/VOC2007/JPEGImages/
├── 000001.jpg
├── 000002.jpg
├── 000003.jpg
├── 000004.jpg
├── 000005.jpg
├── 000006.jpg
├── 000007.jpg
├── 000008.jpg
├── 000009.jpg
├── 000010.jpg
├── 000011.jpg
├── 000012.jpg
├── 000013.jpg

VOCdevkit/VOC2007/ImageSets/
├── Layout
├── Main
└── Segmentation

VOCdevkit/VOC2007/ImageSets/
├── Layout
│   ├── test.txt
│   ├── train.txt
│   ├── trainval.txt
│   └── val.txt
├── Main
│   ├── aeroplane_test.txt
│   ├── aeroplane_train.txt
│   ├── aeroplane_trainval.txt
│   ├── aeroplane_val.txt
│   ├── bicycle_test.txt
│   ├── bicycle_train.txt
│   ├── bicycle_trainval.txt
│   ├── bicycle_val.txt
│   ├── bird_test.txt
│   ├── bird_train.txt
│   ├── bird_trainval.txt
│   ├── bird_val.txt
│   ├── boat_test.txt
│   ├── boat_train.txt
│   ├── boat_trainval.txt
│   ├── boat_val.txt
│   ├── bottle_test.txt
│   ├── bottle_train.txt
│   ├── bottle_trainval.txt
│   ├── bottle_val.txt
│   ├── bus_test.txt
│   ├── bus_train.txt
│   ├── bus_trainval.txt
│   ├── bus_val.txt
│   ├── car_test.txt
│   ├── car_train.txt
│   ├── car_trainval.txt
│   ├── car_val.txt
│   ├── cat_test.txt
│   ├── cat_train.txt
│   ├── cat_trainval.txt
│   ├── cat_val.txt
│   ├── chair_test.txt
│   ├── chair_train.txt
│   ├── chair_trainval.txt
│   ├── chair_val.txt
│   ├── cow_test.txt
│   ├── cow_train.txt
│   ├── cow_trainval.txt
│   ├── cow_val.txt
│   ├── diningtable_test.txt
│   ├── diningtable_train.txt
│   ├── diningtable_trainval.tx
│   ├── diningtable_val.txt
│   ├── dog_test.txt
│   ├── dog_train.txt
│   ├── dog_trainval.txt
│   ├── dog_val.txt
│   ├── horse_test.txt
│   ├── horse_train.txt
│   ├── horse_trainval.txt
│   ├── horse_val.txt
│   ├── motorbike_test.txt
│   ├── motorbike_train.txt
│   ├── motorbike_trainval.txt
│   ├── motorbike_val.txt
│   ├── person_test.txt
│   ├── person_train.txt
│   ├── person_trainval.txt
│   ├── person_val.txt
│   ├── pottedplant_test.txt
│   ├── pottedplant_train.txt
│   ├── pottedplant_trainval.tx
│   ├── pottedplant_val.txt
│   ├── sheep_test.txt
│   ├── sheep_train.txt
│   ├── sheep_trainval.txt
│   ├── sheep_val.txt
│   ├── sofa_test.txt
│   ├── sofa_train.txt
│   ├── sofa_trainval.txt
│   ├── sofa_val.txt
│   ├── test.txt
│   ├── train_test.txt
│   ├── train_train.txt
│   ├── train_trainval.txt
│   ├── train.txt
│   ├── train_val.txt
│   ├── trainval.txt
│   ├── tvmonitor_test.txt
│   ├── tvmonitor_train.txt
│   ├── tvmonitor_trainval.txt
│   ├── tvmonitor_val.txt
│   └── val.txt
└── Segmentation
    ├── test.txt
    ├── train.txt
    ├── trainval.txt
    └── val.txt

可以看到文件结构是相同的。
目标检测只用到 Annotations&#x3001;ImageSets&#x548C;JPEGImages,而ImageSets下只用 Main
对于2007,Main下各个txt文件的说明为:

*_train.txt是各个分类的训练图片,来自2007 trainval数据集
*_val.txt是各个分类的验证图片,来自2007 trainval数据集
*_trainval.txt 是各个分类的训练和验证图片,来自2007 trainval数据集
*_test.txt是各个分类的测试图片,来自2007 test数据集

train.txt
val.txt
trainval.txt
test.txt

以上各个分类的文件与总文件行数是完全对应的,不同的是各个分类在图片名后会有1或-1来表示该图片是正样本还是负样本,以 car这个分类为例:

VOC数据集介绍及构建自己的VOC格式目标检测数据集
可以看到文件名一样,行数也一样。同理,对于val.txt,trainval.txt,test.txt都是相同的。
我们再看一下数量:
VOC数据集介绍及构建自己的VOC格式目标检测数据集
可以看到,数据上的一致性。另外注意,有四个文件是train_train.txt,train_val.txt,train_trainval.txt,train_test.txt,这个是火车分类,不要误理解为训练文件。
以上,我们就可以对pascal voc的结构有一个整体的认识。

4.2 自定义数据集整理为Pascal VOC格式

因为目标检测只用到 Annotations&#x3001;ImageSets&#x548C;JPEGImages,而ImageSets下只用 Main,所以我们可以照着创建一个这样的格式。如下:

VOCdevkit/VOC2021
├── Annotations
├── ImageSets
│   └── Main
└── JPGImages

我们可以执行如下命令来实现这个功能:

mv *.jpg VOCdevkit/VOC2021/JPEGImages
mv *.xml VOCdevkit/VOC2021/Annotations

要强调的一点是每一张图片并不是都会有对应的标注文件,对于一个要标注目都没有的图片是不会进行标注,也就不会有标注文件;也就是说xml文件数量会小于等于jpg的图片文件,对于没有标记文件的图片会被当做背景来处理,下文中也会有说明具体的处理方法。

将图片和标注文件放入对应的文件后的,还需要对ImageSets/Main下的train.txt和val.txt进行生成,使用如下代码:


import os
years=[('2021',1.0)]

wd = os.getcwd()
for year,percent in years:
    img_files = os.listdir('%s/VOCdevkit/VOC%s/JPEGImages' %(wd,year))
    split = int(len(img_files) * percent)
    train_img_files,val_img_files = img_files[:split],img_files[split:]
    with open('%s/VOCdevkit/VOC%s/ImageSets/Main/train.txt' %(wd,year),'w') as f1:
        for img_file in train_img_files:
            f1.write(img_file.split('.')[0]+'\n')
    print('train.txt done')
    with open('%s/VOCdevkit/VOC%s/ImageSets/Main/val.txt' %(wd,year),'w') as f2:
        for img_file in val_img_files:
            f2.write(img_file.split('.')[0]+'\n')
    print('val.txt done')

到此,其本上完成数据的整理工作。

4.3 Pascal VOC 格式转YOLO

这个转换过程主要是对于标签格式的转换,本文3.2节已经对YOLO的标签格式进行过介绍。转换代码如下:


import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets = [('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test'),
('2021', 'train'), ('2021', 'val')]

classes = ["aeroplane","bicycle","bird","boat","bottle","bus","car","cat","chair","cow", \
"diningtable","dog","horse","motorbike","person","pottedplant","sheep","sofa","train","tvmonitor"]

def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    try:
        in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
        out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
        tree=ET.parse(in_file)
        root = tree.getroot()
        size = root.find('size')

        w = int(size.find('width').text)
        h = int(size.find('height').text)

        for obj in root.iter('object'):
            difficult = obj.find('difficult').text
            cls = obj.find('name').text
            if cls not in classes or int(difficult) == 1:
                continue
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
            bb = convert((w,h), b)
            out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
    except:
        out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
        out_file.close()

wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

strs_train = 'cat '+ ' '.join([a+'_'+b+'.txt' for a,b in sets if b=='train']) +'> train.txt'
strs_val = 'cat '+ ' '.join([a+'_'+b+'.txt' for a,b in sets if b=='val']) +'> val.txt'
os.system(strs_train)
os.system(strs_val)
print("all Done!")

以上代码可以可以将多个年份文件夹整合成一份train.txt和val.txt,也就是说可以将多次收集的不同文件汇合到一起来做训练,适合多次收集的数据。

Original: https://blog.csdn.net/u011119817/article/details/116591311
Author: 牛andmore牛
Title: VOC数据集介绍及构建自己的VOC格式目标检测数据集

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/682779/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 损失函数解读 之 Focal Loss

    前言 Focal loss 是一个在目标检测领域常用的损失函数,它是何凯明大佬在RetinaNet网络中提出的,解决了目标检测中 正负样本极不平衡和 难分类样本学习的问题。 论文名…

    人工智能 2023年7月28日
    0103
  • 分享一个不错的数据分析实战案例【全程附图】EXCEL

    大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师。欢迎大家跟我一起走进数据分析的世界,一起学习!感兴趣的朋友可以关注我或者我的数据分析专栏,里面有许多优质的文章跟大家…

    人工智能 2023年7月16日
    074
  • PyTorch学习笔记(4)–DataLoader的使用

    PyTorch学习笔记(4)–DataLoader的使用 本博文是PyTorch的学习笔记,第4次内容记录,主要介绍DataLoader的基本使用。 目录 PyTorch学习笔记(…

    人工智能 2023年6月17日
    0132
  • OpenCV的车道线检测

    资源下载地址:https://download.csdn.net/download/sheziqiong/85604275资源下载地址:https://download.csdn….

    人工智能 2023年7月19日
    086
  • 目标检测精度评价指标

    在目标检测领域中,存在着很多 精度评价指标,需要根据应用场景自主的选择更合适的评价指标。 有人举过一些很典型的例子: 倘若某人声称创建了一个能够识别登上飞机的恐怖分子的模型,并且准…

    人工智能 2023年7月11日
    077
  • Python的第三方库pandas

    1.pandas的介绍 pandas是Python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于P…

    人工智能 2023年7月7日
    068
  • 图像处理中常用的相似度评估指标

    导读 有时候我们想要计算两张图片是否相似,而用来衡量两张图片相似度的算法也有很多,例如: RMSE、 PSNR、 SSIM、 UQI、 SIFT以及 &#x6DF1;&am…

    人工智能 2023年6月17日
    085
  • 正确简单地安装Tensorflow和Keras

    安装前注意: 这里只讨论tensorflow和keras的安装,如果你的电脑不支持CUDA、没有CUDA Toolkit、没有cuDNN这些基本的深度学习运算环境,那这篇文章可以关…

    人工智能 2023年5月23日
    0109
  • 同义词抽取:从知识库中自动发现同义词的方法

    原论文:《Automatic Synonym Discovery with Knowledge Bases》 背景知识 同义词抽取是一种NLP领域下游任务使用广泛的基础任务,可以用…

    人工智能 2023年6月1日
    098
  • 董付国老师Python系列教材推荐与选用参考

    总体说明:1)每本书侧重点不一样;2)基础语法知识本身是类似的,但每本书案例设计与选取的难易程度和适用专业有所不同;3)个人读者不建议买太多,选择2本认认真真地读完,理解书中案例,…

    人工智能 2023年6月11日
    064
  • BatchNorm和LayerNorm——通俗易懂的理解

    可能很多人都知道BatchNorm一般用于CV领域,而LayerNorm一般用于NLP领域,但并不理解其中的原因。这篇文章会以一种通俗易懂的方式对BatchNorm和LayerNo…

    人工智能 2023年6月24日
    097
  • 最细!numpy.random.seed() 函数的解释

    目录 一:最细最易理解的解释! 1.1:实例:如果使用相同的seed( )值,则每次生成的随机数都相同怎么理解?不相同的seed( )值,则每次生成的随机数都不相同怎么理解? 二:…

    人工智能 2023年6月15日
    0123
  • 阿里面试题:Pandas中合并数据的5个函数,各有千秋!

    前几天,在一个群里面,看到一位朋友,说自己接到了阿里的面试,人家问了一些关于pandas的使用。其中一个问题是: pandas中合并数据的5中方法。 今天借着这个机会,就为大家盘点…

    人工智能 2023年7月8日
    059
  • PyTorch: 目标检测(object detection)介绍

    目标检测(object detection) 一、 介绍 在图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。 然而,很多时候图像里有多个我们感兴趣的目…

    人工智能 2023年5月26日
    086
  • 2020ccks知识图谱问答总结

    公众号 系统之神与我同在 前几个月参加了今年ccks(中国知识图谱与计算语义大会)任务四基于知识图谱问答的比赛: a榜第三 b榜出差去了 等回来的时候结束了 在这里写个分享 知识图…

    人工智能 2023年6月10日
    064
  • (笔记)ROC & AUC 总结

    Section 1:ROC曲线 ROC曲线也称为接受者操作特征曲线(Receiver Operating Characteristic)或感受性曲线,ROC曲线上的每个点反映着对同…

    人工智能 2023年6月16日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球