参考博文:
YOLOv3训练KITTI数据集_kitti训练集-CSDN博客
数据集来源:
darknet yolov3 训练 kitti数据集_kitti数据集下载-CSDN博客
(这里需要下载4个压缩包,少了解压会出现报错)
xml_to_yolo_txt.py文件在将xml文件转换为txt文件时发生不一致报错,这是我修改后的代码:
import glob
import xml.etree.ElementTree as ET
# 这里的类名为我们 xml 里面的类名,顺序现在不需要考虑
class_names = ['Car', 'Cyclist', 'Pedestrian']
# xml 文件路径
path = '/xmls/'
# 转换一个 xml 文件为 txt
def single_xml_to_txt(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
# 保存的 txt 文件路径
txt_file = xml_file.split('.')[0] + '.txt'
with open(txt_file, 'w') as txt_file:
for member in root.findall('object'):
picture_width = int(root.find('size')[0].text)
picture_height = int(root.find('size')[1].text)
class_name = member[0].text
class_num = class_names.index(class_name)
# 修改元素访问方式
box_x_min = int(member.find('bndbox')[0].text) # 左上角横坐标
box_y_min = int(member.find('bndbox')[1].text) # 左上角纵坐标
box_x_max = int(member.find('bndbox')[2].text) # 右下角横坐标
box_y_max = int(member.find('bndbox')[3].text) # 右下角纵坐标
x_center = float(box_x_min + box_x_max) / (2 * picture_width)
y_center = float(box_y_min + box_y_max) / (2 * picture_height)
width = float(box_x_max - box_x_min) / picture_width
height = float(box_y_max - box_y_min) / picture_height
print(class_num, x_center, y_center, width, height)
txt_file.write(str(class_num) + ' ' + str(x_center) + ' ' + str(y_center) + ' ' + str(width) + ' ' + str(height) + '\n')
# 转换文件夹下的所有 xml 文件为 txt
def dir_xml_to_txt(path):
for xml_file in glob.glob(path + '*.xml'):
single_xml_to_txt(xml_file)
dir_xml_to_txt(path)
xml文件和txt文件现在存放在了一个目录之下,我习惯将txt文件存放在labels文件下:
import os
import shutil
def move_txt_files(source_dir, destination_dir):
# 确保目标目录存在,如果不存在则创建
if not os.path.exists(destination_dir):
os.makedirs(destination_dir)
# 遍历源目录下的所有文件
for root, dirs, files in os.walk(source_dir):
for file in files:
if file.endswith('.txt'):
source_file = os.path.join(root, file)
destination_file = os.path.join(destination_dir, file)
# 移动文件
shutil.move(source_file, destination_file)
if __name__ == "__main__":
source_dir = '/xmls/'
destination_dir = '/labels/'
move_txt_files(source_dir, destination_dir)
后面生成train和val的代码建议去深度学习环境中进行。