Pascal VOC数据集标注

Pascal VOC数据集标注

标注数据文件

目前流行的数据标注文件格式主要有VOC_2007、VOC_2012,该文本格式来源于Pascal VOC标准数据集,这是衡量图像分类识别能力的重要基准之一。本文采用VOC_2007数据格式文件,以xml格式存储。

1,首先安装标注工具labelxml,相关教程可以参考如下链接:

https://www.cnblogs.com/kxqblog/p/16021711.html

2,安装完毕后,新建一个文件夹,在文件夹下新建以下三个文件夹:

Annotations 文件夹

该文件夹下存放的是每一个图片的标注信息,文件都是.xml格式,文件名和图片名是一致的对于该xml的格式。

JPEGImages 文件夹

该文件夹下存放着所有的训练集图片,格式都是.jpg

ImageSets 文件夹

在这个文件夹中还有一个Main文件夹,这个文件夹中主要有四个.txt文件,分别是train.txttest.txttrainval.txtval.txt

test.txt中保存的是测试所用的所有样本的名字,不过没有后缀(下同),一般测试的样本数量占总数据集的50%

train.txt中保存的是训练所用的样本名,样本数量通常占trainval的50%左右

val.txt中保存的是验证所用的样本名,数量占trainval的50%左右

trainval.txt中保存的是训练验证样本,是上面两个的总和,一般数量占总数据集的50%

补充说明:一般VOC数据集组织如下:

└─VOCdevkit
    └─VOC2012
        ├─Annotations 
        ├─ImageSets
        │  ├─Action
        │  ├─Layout
        │  ├─Main
        │  └─Segmentation
        ├─JPEGImages
        ├─SegmentationClass
        └─SegmentationObject

前三个已经详细说明,下面解释4,5两个说明语义分割与实例分割,当然这两个文件夹具体名字并不叫语义分割与实例分割,只是经过语义分割与实例分割的图像存放于这两个文件夹下。

语义分割(SegmentationClass)

通常意义上的目标分割指的就是语义分割,图像语义分割,简而言之就是对一张图片上的所有像素点进行分类,即对图像中的每个像素都划分出对应的类别,实现像素级别的分类。

举例说明:语义分割(下图左)就是需要区分到图中每一点像素点,而不仅仅是矩形框框住了。但是同一物体的不同实例不需要单独分割出来。对下图左,标注为人,羊,狗,草地。而不需要羊1,羊2,羊3,羊4,羊5等

实例分割(SegmentationClass)

而类的具体对象,即为实例,那么实例分割不但要进行像素级别的分类,还需在具体的类别基础上区别开不同的实例。举例说明1:比如说图像有多个人甲、乙、丙,那边他们的语义分割结果都是人,而实例分割结果却是不同的对象,具体如下图所示:

3,标注图像

在tensorflow环境下打开labelxml,将图片集放在JPEGImages文件夹里面,注意图片的格式必须是jpg格式的。打开labelImg标注工具,然后点击左侧的工具栏“Open Dir”按钮,选择刚才放在JPEGImages文件夹。这时,主界面将会自动加载第一张待标注照片。

点击“Change Save Dir”选择同一目录下的“Annotations”文件夹作为xml数据目录。点击左侧工具栏的“Create RectBox”按钮,然后在主界面上点击拉个矩形框,将猫出来。圈定后,将会弹出一个对话框,用于输入标注物体的名称,输入jumao作为猫的名称。

之后,点击左侧工具栏的“Save”按钮,由于之前选择刚才创建的Annotations作为保存目录,系统将自动生成voc_2007格式的xml文件保存起来。这样就完成了一张熊猫照片的物体标注了。

接下来点击左侧工具栏的“Next Image”进入下一张图像,按照以上步骤,画框、输入名称、保存,如此反复,直到把所有照片都标注好,保存起来。

4,划分训练集、测试集、验证集

完成所有熊猫照片的标注后,还要将数据集划分下训练集、测试集和验证集。在ImageSets文件夹下新建一个Main文件夹。
在github上下载一个自动划分的脚本:https://github.com/EddyGao/make_VOC2007/blob/master/make_main_txt.py 然后执行以下代码:

import os
import random

trainval_percent = 0.66
train_percent = 0.5
xmlfilepath = 'C:\\Users\username\\Desktop\\ImageData\\Pascal_VOC\\Annotations'
txtsavepath = 'C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\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('C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\ImageSets\\Main\\trainval.txt', 'w')
ftest = open('C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\ImageSets\\Main\\test.txt', 'w')
ftrain = open('C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\ImageSets\\Main\\train.txt', 'w')
fval = open('C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\ImageSets\\Main\\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()

此时,将会按照脚本里面设置的比例,自动拆分训练集、测试集和验证集,将相应的文件名列表保存在里面。

注:训练集、测试集和验证集区别联系:

训练集:学习样本数据集,通过匹配一些参数来建立一个分类器。建立一种分类的方式,主要是用来训练模型的。作用是估计模型。

验证集:对学习出来的模型,调整分类器的参数,如在神经网络中选择隐藏单元数。验证集还用来确定网络结构或者控制模型复杂程度的参数。作用是确定网络结构或者控制模型复杂程度的参数。

测试集:测试训练好的模型分辨能力。该数据集与训练集、验证集完全分离,不参与模型训练。作用是检验最终选择最优的模型性能。

划分数据集作用:为了防止过度拟合。如果我们把所有数据都用来训练模型的话,建立的模型自然是最契合这些数据的,测试表现也好。但换了其它数据集测试这个模型效果可能就没那么好。总而言之,训练集和测试集相同的话,模型评估结果肯定比实际要好,但是模型的泛化性能较差。

至此,VOC数据集制作任务结束。

参考文档:

https://my.oschina.net/u/876354/blog/1927351?tdsourcetag=s_pcqq_aiomsg

https://wap.sciencenet.cn/blog-3428464-1280762.html

https://www.cnblogs.com/hider/p/15781829.html

posted @ 2022-04-09 16:44  Deceiver_Ker  阅读(797)  评论(0编辑  收藏  举报