Faster用的是PASCAL VOC数据集,所以将kitti数据改为PASCAL VOC的形式是最高效的办法。
1. 准备工作
- 下载kitti数据集:
数据集:Download left color images of object data set (12 GB)
标注文件:Download training labels of object data set (5 MB)) - 创建VOC2007文件夹,在文件夹下创建三个文件夹,命名如下:
JPEGImages文件夹用来存放所有数据集,Annotations文件夹用于放标注信息,在ImageSets文件夹内再创建三个文件夹,如下:
- 将下载的数据解压放在VOC2007下,图片放入JPEGImages里,标注信息解压后的label_2文件夹在VOC2007下,与Annotations等平行。
这就是所有的准备工作,接下来将kitti转换为pascal形式。
2. 转换数据集
2.1 kitti标注信息说明
kitti数据集中标注信息是存放在txt文本中的,包含如下信息:
Car 0.00 0 -1.67 642.24 178.50 680.14 208.68 1.38 1.49 3.32 2.41 1.66 34.98 -1.60
Car 0.00 0 -1.75 685.77 178.12 767.02 235.21 1.50 1.62 3.89 3.27 1.67 21.18 -1.60
根据上图,需要使用的只有类别‘Car’和物体外框的坐标‘387.63 181.54 423.81 203.12’,其余的字段都可以忽略。
我们分三步转换数据:
2.2 转换kitti类别
我忽略了’DontCare’和’Misc’类,也忽略了’Cyclist’类,因为图片中这一类过于小,标注信息也不准确,肉眼都难以分辨。我还合并’Person_sitting’和’Pedestrian’统一为’Pedestrian’。你可以根据自己需求修改。修改后可以看到txt文件里的内容已经变化。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# modify_annotations_txt.py
import glob
import string
txt_list = glob.glob('./label_2/*.txt') # 存储Labels文件夹所有txt文件路径
def show_category(txt_list):
category_list= []
for item in txt_list:
try:
with open(item) as tdf:
for each_line in tdf:
labeldata = each_line.strip().split(' ') # 去掉前后多余的字符并把其分开
category_list.append(labeldata[0]) # 只要第一个字段,即类别
except IOError as ioerr:
print('File error:'+str(ioerr))
print(set(category_list)) # 输出集合
def merge(line):
each_line=''
for i in range(len(line)):
if i!= (len(line)-1):
each_line=each_line+line[i]+' '
else:
each_line=each_line+line[i] # 最后一条字段后面不加空格
each_line=each_line+'\n'
return (each_line)
print('before modify categories are:\n')
show_category(txt_list)
for item in txt_list:
new_txt=[]
try:
with open(item, 'r') as r_tdf:
for each_line in r_tdf:
labeldata = each_line.strip().split(' ')