KIITI数据集转VOC格式
软件环境
使用环境: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.zip
、data_object_label_2.zip
两个文件,便可得到上面两个文件夹。
需要注意的是,使用百度云下载时所有文件都要下载下来,尤其是data_object_image_2.z01
、data_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转换结果可视化
三、结束语
如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。◕ᴗᴗ◕。)づ