目标检测的数据集制作一般流程(Pascal VOC标准格式)

了解Pascal VOC

利用深度学习方法如Faster R-CNN或YOLOv3等进行目标检测时需要训练数据集,我们很少会根据自己的数据集格式修改代码,更多的是按照一定格式修改自己的数据格式,而PASCAL VOC为图像识别和分类提供了一整套标准化的数据集,为了方便我们目标检测的进行,可以先来详细的记录一下PASCAL VOC的格式。
Pascal VOC数据集下载地址http://host.robots.ox.ac.uk/pascal/VOC/

数据集下载后解压得到一个名为VOCdevkit的文件夹,该文件夹结构如下:

.
└── VOCdevkit     #根目录
    └── VOC2017   #不同年份的数据集,这里只下载了2007的,还有2007等其它年份的
        ├── Annotations        #存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等
        ├── ImageSets          #该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本
        │   ├── Action
        │   ├── Layout
        │   ├── Main
        │   └── Segmentation
        ├── JPEGImages         #存放源图片
        ├── SegmentationClass  #存放的是图片,语义分割相关
        └── SegmentationObject #存放的是图片,实例分割相关
(1)Annotations

在这里插入图片描述
Annotations文件夹中存放的是xml格式的标签文件,每一个xml文件都对应于JPEGImages文件夹中的一张图片,包含了图片的重要信息:图片的名称,图片中object的类别及其bounding box坐标。xml文件的解析如下:
其中:

标签解释
filename文件名
source图像来源(不重要)
size图像尺寸(长宽以及通道),包含了width,height和depth
segmented是否用于分割
object需检测到的物体,包含了物体名称name,拍摄角度pose,是否截断truncated,难以识别difficult,object对应的bounding box信息 bndbox
bndbox包含左下角和右上角x,y坐标 (xmin,ymin,xmax,ymax)
<annotation>
	<folder>VOC2007</folder>
	<filename>000051.jpg</filename>
	<source>
		<database>The VOC2007 Database</database>
		<annotation>PASCAL VOC2007</annotation>
		<image>flickr</image>
		<flickrid>291539949</flickrid>
	</source>
	<owner>
		<flickrid>kristian_svensson</flickrid>
		<name>Kristian Svensson</name>
	</owner>
	<size>
		<width>500</width>
		<height>375</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>motorbike</name>
		<pose>Unspecified</pose>
		<truncated>1</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>352</xmin>
			<ymin>138</ymin>
			<xmax>500</xmax>
			<ymax>375</ymax>
		</bndbox>
	</object>
	<object>
		<name>motorbike</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>105</xmin>
			<ymin>1</ymin>
			<xmax>427</xmax>
			<ymax>245</ymax>
		</bndbox>
	</object>
	<object>
		<name>person</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>1</difficult>
		<bndbox>
			<xmin>415</xmin>
			<ymin>61</ymin>
			<xmax>465</xmax>
			<ymax>195</ymax>
		</bndbox>
	</object>
</annotation>

以下程序可以将XML标签中目标绘制在图像中,并返回:
具体步骤为:
1.用xml.etree.ElementTree库中的parse方法解析xml文件;
2.获取xml文件的根节点
3.寻找object节点用find() 和findall(), .text表示获取节点中的内容
4.cv2绘图,rectangle画框,putTEXT标注类别

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET  
import os,cv2
 
xml_file='Annotations/000282.xml'
tree=ET.parse(xml_file)
root=tree.getroot()
imgfile='JPEGImages/000282.jpg'
im = cv2.imread(imgfile)
for object in root.findall('object'):
    object_name=object.find('name').text
    Xmin=int(object.find('bndbox').find('xmin').text)
    Ymin=int(object.find('bndbox').find('ymin').text)
    Xmax=int(object.find('bndbox').find('xmax').text)
    Ymax=int(object.find('bndbox').find('ymax').text)
    color = (4, 250, 7)
    cv2.rectangle(im,(Xmin,Ymin),(Xmax,Ymax),color,2)
    font = cv2.FONT_HERSHEY_SIMPLEX  
    cv2.putText(im, object_name, (Xmin,Ymin - 7), font, 0.5, (6, 230, 230), 2)
    cv2.imshow('01',im)
#cv2.imwrite('02.jpg', im)

在这里插入图片描述

JPEGImages

存放的是数据集的原图片,像素尺寸大小不一
在这里插入图片描述

ImageSets

ImageSets存放的是每一种计算机视觉任务类型所对应的文件夹,各个文件夹均存放txt格式文件,txt中记录图片名:

文件夹数据信息
Layout具有人体部位的数据
Main一般存放图像物体识别的数据
Segmentation用于语义,实例分割的数据

目标检测主要用到Main文件夹中的txt文件(训练自己的数据时,我们需要自己生成):

Main中的txt文件用途
train训练使用的图片名称(无后缀)
val验证使用的图片名称(无后缀)
trainval以上两者的合并
test测试使用的图片名称(无后缀)

在这里插入图片描述
以下代码可以通过统计Annotations文件夹里xml文件的数目划分各类数据集

import os
import random

path='D:/VOCtrainval_06-Nov-2007/yoloV3conf\keras-yolo3-master/VOCdevkit/VOC2007/'

trainval_percent = 0.66
train_percent = 0.5

xmlfilepath = path+'Annotations'
txtsavepath = path+'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(path+'ImageSets/Main/trainval.txt', 'w')
ftest = open(path+'ImageSets/Main/test.txt', 'w')
ftrain = open(path+'ImageSets/Main/train.txt', 'w')
fval = open(path+'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()

1.安装标注工具

数据标注工具labelImg,可以通过可视化的操作界面进行画框标注,就能自动生成VOC格式的xml文件,该工具是基于Python语言编写的,这样就支持在Windows、Linux的跨平台运行,Windows和Linux下载地址为:https://tzutalin.github.io/labelImg/
在这里插入图片描述

2.创建文件夹

按照VOC数据集的要求,创建以下文件夹
(1)Annotations:用于存放标注后的xml文件
(2)ImageSets/Main:用于存放训练集、测试集、验收集的文件列表
(3)JPEGImages:用于存放原始图像
在这里插入图片描述

3.标注数据

将源图片集放在JPEGImages文件夹里面,注意图片的格式必须是jpg格式的。
打开labelImg标注工具,然后点击左侧的工具栏“Open Dir”按钮,选择刚才放猫的JPEGImages文件夹。这时,主界面将会自动加载第一张猫照片。
在这里插入图片描述
点击左侧工具栏的“Create RectBox”按钮,然后在主界面上点击拉个矩形框,将猫圈出来。圈定后,将会弹出一个对话框,用于输入标注物体的类别,这里输入cat作为object类别。

然后点击左侧工具栏的“Save”按钮,选择刚才创建的Annotations作为保存目录,系统将自动生成VOC2007格式的xml文件保存起来。这样就完成了一张猫照片的物体标注了。
在这里插入图片描述
接下来点击左侧工具栏的“Next Image”进入下一张图像,按照以上步骤,画框、输入名称、保存,如此反复,直到把所有照片都标注好,保存起来。

这样就完成了数据集的准备

  • 19
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用TensorFlow Object Detection API对包含Pascal VOC标注格式的数据进行训练。这需要将数据集转换成TFRecord格式。TFRecord是一种二进制文件格式,可以在TensorFlow中高效地读取和处理数据。 首先,需要将Pascal VOC数据集转换成TFRecord格式。可以使用TensorFlow Object Detection API提供的脚本进行转换。具体步骤如下: 1. 下载TensorFlow Object Detection API,并安装依赖库。 2. 准备Pascal VOC数据集,并将其按照TensorFlow Object Detection API的要求进行组织。 3. 使用脚本将数据集转换成TFRecord格式。例如,可以运行以下命令: ``` python object_detection/dataset_tools/create_pascal_tf_record.py \ --label_map_path=/path/to/label_map.pbtxt \ --data_dir=/path/to/PascalVOC \ --output_path=/path/to/output.tfrecord ``` 其中,`label_map_path`是类别标签映射文件的路径,`data_dir`是Pascal VOC数据集的路径,`output_path`是输出的TFRecord文件路径。 4. 配置训练参数,包括模型类型、学习率、训练步数等。 5. 使用TensorFlow Object Detection API提供的训练脚本进行训练。例如,可以运行以下命令: ``` python object_detection/model_main.py \ --pipeline_config_path=/path/to/pipeline.config \ --model_dir=/path/to/model_dir \ --num_train_steps=50000 \ --sample_1_of_n_eval_examples=1 \ --alsologtostderr ``` 其中,`pipeline_config_path`是模型配置文件的路径,`model_dir`是模型输出结果的路径,`num_train_steps`是训练步数,`sample_1_of_n_eval_examples`是评估步数,`alsologtostderr`是将日志同时输出到标准输出。 通过以上步骤,就可以使用TensorFlow Object Detection API对Pascal VOC标注格式的数据进行训练了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值