KITTI车辆检测数据集转VOC格式(亲测成功,附KITTI云盘连接以及完整格式转换代码)- KITTI车辆检测数据集看着一篇就够了!

软件环境

使用环境:python3.8
平台:Windows10
IDE:PyCharm

一、准备数据集

1.1下载链接

此步适用于未获取KITTI数据集的同学,若已经获取KITTI数据集可跳过此步。

KITTI数据集官网咱们内网能进去,网址如下:http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark
在这里插入图片描述
但是博主尝试了很多次下载没成功,后来在网上找到了提供百度网盘链接的文章:
https://blog.csdn.net/u013086672/article/details/103910266
大家可以进入这位博主提供链接下载,为了避免连接失效我在此也上传一个百度云的链接,与上面文章不同的是,这个链接下除了有完整的KITTI数据还有博主准换后的VOC格式的xml文件,链接如下:

链接:
https://pan.baidu.com/s/1unzhXoVcQK4POmZMptWrFg 
提取码:
s1lb 

网盘内容截图如下:
在这里插入图片描述

1.2数据集使用方法

下载完成后,进入下载目录,解压这data_object_image_2.zipdata_object_label_2.zip两个文件,便可得到上面两个文件夹。

需要注意的是,使用百度云下载时所有文件都要下载下来,尤其是data_object_image_2.z01data_object_image_2.z01两个文件,这两个文件是data_object_image_2.zip文件的分压缩卷,需要存在才能完整解压
在这里插入图片描述
完成以上操作便完成数据集准备阶段了。

二、txt标注文件准换为VOC格式

2.1目前准换代码存在的问题

转换成xml不会换行,导致读取不了
在这里插入图片描述

2.2博主提供的方法

话不多说先看一下效果:
在这里插入图片描述

在labelImg中可视化效果:
在这里插入图片描述

2.3转换代码

# author:Hurricane
# date:  2021/4/10
# E-mail:hurri_cane@qq.com

# 将KIITI数据中的txt标注文件转换为xml格式

import os
from xml.dom.minidom import Document
from tqdm import tqdm
import cv2


def generate_xml(name, split_lines, img_size, class_ind, tar_dir):
	doc = Document()
	# owner
	annotation = doc.createElement('annotation')
	doc.appendChild(annotation)
	# owner
	folder = doc.createElement('folder')
	annotation.appendChild(folder)
	folder_txt = doc.createTextNode("VOC2007")
	folder.appendChild(folder_txt)

	filename = doc.createElement('filename')
	annotation.appendChild(filename)
	filename_txt = doc.createTextNode(name + '.png')
	filename.appendChild(filename_txt)
	# ones#
	source = doc.createElement('source')
	annotation.appendChild(source)

	database = doc.createElement('database')
	source.appendChild(database)
	database_txt = doc.createTextNode("The VOC2007 Database")
	database.appendChild(database_txt)

	annotation_new = doc.createElement('annotation')
	source.appendChild(annotation_new)
	annotation_new_txt = doc.createTextNode("PASCAL VOC2007")
	annotation_new.appendChild(annotation_new_txt)

	image = doc.createElement('image')
	source.appendChild(image)
	image_txt = doc.createTextNode("flickr")
	image.appendChild(image_txt)
	# onee#
	# twos#
	size = doc.createElement('size')
	annotation.appendChild(size)

	width = doc.createElement('width')
	size.appendChild(width)
	width_txt = doc.createTextNode(str(img_size[1]))
	width.appendChild(width_txt)

	height = doc.createElement('height')
	size.appendChild(height)
	height_txt = doc.createTextNode(str(img_size[0]))
	height.appendChild(height_txt)

	depth = doc.createElement('depth')
	size.appendChild(depth)
	depth_txt = doc.createTextNode(str(img_size[2]))
	depth.appendChild(depth_txt)
	# twoe#
	segmented = doc.createElement('segmented')
	annotation.appendChild(segmented)
	segmented_txt = doc.createTextNode("0")
	segmented.appendChild(segmented_txt)

	for split_line in split_lines:
		line = split_line.strip().split()
		if line[0] in class_ind:
			object_new = doc.createElement("object")
			annotation.appendChild(object_new)

			name_ = doc.createElement('name')
			object_new.appendChild(name_)
			name_txt = doc.createTextNode(line[0])
			name_.appendChild(name_txt)

			pose = doc.createElement('pose')
			object_new.appendChild(pose)
			pose_txt = doc.createTextNode("Unspecified")
			pose.appendChild(pose_txt)

			truncated = doc.createElement('truncated')
			object_new.appendChild(truncated)
			truncated_txt = doc.createTextNode("0")
			truncated.appendChild(truncated_txt)

			difficult = doc.createElement('difficult')
			object_new.appendChild(difficult)
			difficult_txt = doc.createTextNode("0")
			difficult.appendChild(difficult_txt)
			# threes-1#
			bndbox = doc.createElement('bndbox')
			object_new.appendChild(bndbox)

			xmin = doc.createElement('xmin')
			bndbox.appendChild(xmin)
			xmin_txt = doc.createTextNode(str(int(float(line[4]))))
			xmin.appendChild(xmin_txt)

			ymin = doc.createElement('ymin')
			bndbox.appendChild(ymin)
			ymin_txt = doc.createTextNode(str(int(float(line[5]))))
			ymin.appendChild(ymin_txt)

			xmax = doc.createElement('xmax')
			bndbox.appendChild(xmax)
			xmax_txt = doc.createTextNode(str(int(float(line[6]))))
			xmax.appendChild(xmax_txt)

			ymax = doc.createElement('ymax')
			bndbox.appendChild(ymax)
			ymax_txt = doc.createTextNode(str(int(float(line[7]))))
			ymax.appendChild(ymax_txt)

	# 将DOM对象doc写入文件
	with open(tar_dir + name + '.xml', "wb") as f:
		f.write(doc.toprettyxml(indent='\t', encoding='utf-8'))

	f.close()


if __name__ == '__main__':
	# 指定获取的类别
	class_ind = ('Pedestrian', 'Car', 'Truck', 'DontCare', 'Cyclist')
	# labels_dir    指定KIITI数据集中TXT文件路径
	# img_dir       指定KIITI数据集中图片文件路径
	# tar_dir       指定KIITI数据集标注转换为xml文件的路径
	labels_dir = r'D:\Program\Datasets\KITTI\training\label_2\\'
	img_dir = r'D:\Program\Datasets\KITTI\data_object_image_2\training\image_2\\'
	tar_dir = r'D:\Program\Datasets\KITTI\data_object_image_2\training\Annotations\\'

	for parent, dirnames, filenames in os.walk(labels_dir):  # 分别得到根目录,子目录和根目录下文件
		for file_name in tqdm(filenames):
			full_path = os.path.join(parent, file_name)  # 获取文件全路径
			f = open(full_path)
			split_lines = f.readlines()
			name = file_name[:-4]  # 后四位是扩展名.txt,只取前面的文件名
			img_path = os.path.join(img_dir, name + '.png')  # 路径需要自行修改
			# print(img_path)
			img_size = cv2.imread(img_path).shape
			generate_xml(name, split_lines, img_size, class_ind, tar_dir)
print('ALL Done!')

2.4代码使用方法

修改这三个路径为自己的路径即可

	# labels_dir    指定KIITI数据集中TXT文件路径
	# img_dir       指定KIITI数据集中图片文件路径
	# tar_dir       指定KIITI数据集标注转换为xml文件的路径
	labels_dir = r'D:\Program\Datasets\KITTI\training\label_2\\'
	img_dir = r'D:\Program\Datasets\KITTI\data_object_image_2\training\image_2\\'
	tar_dir = r'D:\Program\Datasets\KITTI\data_object_image_2\training\Annotations\\'

然后再运行2.3节提供的完整代码,便可以得到准换来的xml结果了
在这里插入图片描述

在这里插入图片描述
当提示ALL Done!则转换完成
在这里插入图片描述

2.5转换结果可视化

在这里插入图片描述

三、结束语

如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。◕ᴗᴗ◕。)づ
在这里插入图片描述

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hurri_cane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值