前期准备好了用于训练识别是否有火灾的数据集后就可以开始修改yolo相关文件来进行训练
数据集放到yolov5目录里
在data目录下新建yaml文件设置数据集信息如下
在model文件夹下新增新的model文件
开始训练
训练出错
确认后是对训练数据集文件夹里的文件名字有要求,原先
改为如下后
仍然出错如下,看log应该时转换lable时的问题
确认了时label没做归一化处理,新增归一化处理的转换脚本代码,
import os
import xml.etree.ElementTree as ET
def convert_xml_to_txt(xml_path, txt_path):
# 读取XML文件
tree = ET.parse(xml_path)
root = tree.getroot()
# 获取图像的宽度和高度
width = int(root.find('size/width').text)
height = int(root.find('size/height').text)
with open(txt_path, 'w') as f:
# 遍历所有的目标
for obj in root.findall('object'):
# 获取类别名称
class_name = obj.find('name').text
# 获取边界框坐标
xmin = int(obj.find('bndbox/xmin').text)
ymin = int(obj.find('bndbox/ymin').text)
xmax = int(obj.find('bndbox/xmax').text)
ymax = int(obj.find('bndbox/ymax').text)
# 归一化处理
x_center = (xmin + xmax) / (2 * width)
y_center = (ymin + ymax) / (2 * height)
box_width = (xmax - xmin) / width
box_height = (ymax - ymin) / height
# 写入到TXT文件
class_index = class_names.index(class_name)
f.write(f"{class_index} {x_center} {y_center} {box_width} {box_height}\n")
# 读取类别名称列表
class_names = ['fire']
# 遍历xml文件夹中的所有xml文件
xml_folder = 'D:/fire-dataset/fire-dataset/validation/annotations'
txt_folder = 'D:/fire-dataset/fire-dataset/validation/txtannotations'
for xml_file in os.listdir(xml_folder):
if xml_file.endswith('.xml'):
xml_path = os.path.join(xml_folder, xml_file)
txt_file = os.path.splitext(xml_file)[0] + '.txt'
txt_path = os.path.join(txt_folder, txt_file)
convert_xml_to_txt(xml_path, txt_path)
重新转换后重新训练
可以训练了,但是又因电脑性能问题出错如下
调整默认batchsize到8后重新训练–batch-size 8