VOC数据集用于制作tensorflow所需格式

13 篇文章 3 订阅
11 篇文章 0 订阅

VOC数据集

VOC主要有三个重要的文件夹:Annotations、ImageSets和JPEGImages。分别是标注信息、分割信息和原始图片等。
公开数据集有现成的对应文件,前人已经做好标注工作。
在初步训练网络时,选择该组比较完备的数据,确实是一个比较快捷的方法。

XML到CSV格式

以下是一个标准的VOC格式写法,粘贴了一个VOCtrainval_11-May-2012文件夹下的XML格式文件。

在这里插入图片描述

可以看到,除了基本尺寸,目标所在位置之外,还有part等信息,可能是用于目标特征级联。
我们暂时不需要,直接的XML转CSV格式会报错,因为存在多个xmin等数据。

以下是修改后的用于VOC格式数据集的XML转CSV的代码,主要修改部分在物体所在位置的数据读取,我在源代码上做了修改,这部分在Python可运行。

'''
import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET

os.chdir('D:\\python_objectdetection\\models-master\\models-master\\research\\object_detection\\images_voc\\test')
path = 'D:\\python_objectdetection\\models-master\\models-master\\research\\object_detection\\images_voc\\test'

def xml_to_csv(path):
xml_list = []
for xml_file in glob.glob(path + '/*.xml'):
tree = ET.parse(xml_file)
root = tree.getroot()
for member in root.findall('object'):
value = (root.find('filename').text,
int(root.find('size')[0].text),
int(root.find('size')[1].text),
member[0].text,
# 源代码长这样,[4][0]大概意思:第4个节点的几个成员;从0
# int(member[4][0].text),
# int(member[4][1].text),
# int(member[4][2].text),
# int(member[4][3].text),
#
# 因为是节点,所以这样的形式访问
int(member.find('bndbox')[0].text),
int(member.find('bndbox')[1].text),
int(member.find('bndbox')[2].text),
int(member.find('bndbox')[3].text),
)
xml_list.append(value)
print(value[3])
column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']

xml_df = pd.DataFrame(xml_list, columns=column_name)
return xml_df

def main():
image_path = path
xml_df = xml_to_csv(image_path)
xml_df.to_csv('test.csv', index=None)
print('Successfully converted xml to csv.')

main()

样本类别统计

毕竟公开数据集,类别是先前标记,在初步手写各个类别时候,存在漏写情形,也会导致报错。
以下文件用于统计CSV文件中所有的类别,C++写的。

//统计CSV格式数据集中所有被包含的物体类别

#include<fstream>
#include<map>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
#include<sstream>        //istringstream 必须包含这个头文件

int main()
{
	ifstream fin("D:\\python_objectdetection\\models-master\\models-master\\research\\object_detection\\data\\test_voc.csv"); //打开文件流操作

	string line;
	
	vector<string>classes;
	
	while (getline(fin, line))   //整行读取,换行符“\n”区分,遇到文件尾标志eof终止读取
	{
		istringstream stream_in(line); //将整行字符串line读入到字符串流istringstream中

		vector<string> fields; //声明一个字符串向量

		string field;

		while (getline(stream_in, field, ',')) //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符
		{
			fields.push_back(field); //将刚刚读取的字符串添加到向量fields中
		}

		vector<string>::iterator iter_class = find(classes.begin(), classes.end(), fields[3]);
		if (iter_class == classes.end())
		{
			classes.push_back(fields[3]);
		}
	}

	fin.close();
	
//把各类别写在另一个CSV格式文件

	ofstream file("D:\\python_objectdetection\\models-master\\models-master\\research\\object_detection\\data\\test_voc_classes.csv");

	for (int i = 1; i < classes.size(); i++)
	{
		file << classes[i] << endl;
	}
}

在统计完类别后,csv到tfrecord格式转换,在类别声明部分修改后,即可运行。
当然,也有比较工具化的,csv文件右键点击筛选即可:

在这里插入图片描述

tensorflow下pbtxt文件

训练时候,数据集的配置流程:

  1. 新建图片所在文件夹,保存对应的train和test图片;
  2. 新建data文件夹,存放CSV文件和生成的record格式,以及类别声明文件,也就是那个pbtxt格式的文件;
  3. 新建train文件夹,存放配置环境,也就是那个类似ssd_mobilenet_v1_coco.config的文件,训练过程中,模型可以在此文件夹下保存。

如果你也恰好在用这组公开数据集,那偷个懒直接copy都可以的,我这边生成的相应pbtxt格式文件在此:

//该组数据对应pbtxt格式文件

item {
name: "person"
id: 1
display_name: "person"
}

item {
name: "aeroplane"
id: 2
display_name: "aeroplane"
}

item {
name: "tvmonitor"
id: 3
display_name: "tvmonitor"
}

item {
name: "train"
id: 4
display_name: "train"
}

item {
name: "boat"
id: 5
display_name: "boat"
}

item {
name: "dog"
id: 6
display_name: "dog"
}

item {
name: "chair"
id: 7
display_name: "chair"
}

item {
name: "bird"
id: 8
display_name: "bird"
}

item {
name: "bicycle"
id: 9
display_name: "bicycle"
}

item {
name: "bottle"
id: 10
display_name: "bottle"
}

item {
name: "sheep"
id: 11
display_name: "sheep"
}

item {
name: "diningtable"
id: 12
display_name: "diningtable"
}

item {
name: "horse"
id: 13
display_name: "horse"
}

item {
name: "motorbike"
id: 14
display_name: "motorbike"
}

item {
name: "sofa"
id: 15
display_name: "sofa"
}

item {
name: "cow"
id: 16
display_name: "cow"
}

item {
name: "car"
id: 17
display_name: "car"
}

item {
name: "cat"
id: 18
display_name: "cat"
}

item {
name: "bus"
id: 19
display_name: "bus"
}

item {
name: "pottedplant"
id: 20
display_name: "pottedplant"
}

一切数据准备OK,等待训练模型吧。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值