yzqxy / Yolov8_obb_Prune_Track

GNU General Public License v3.0
181 stars 14 forks source link

为什么训练结果全是错位的,训练精度也要比水平框的差很多 #16

Open shangshan2023 opened 1 year ago

shangshan2023 commented 1 year ago

fc7dea6baa6ebb330fbe3adc13ab0e9 02da263398b2ac1e5c17bbc16eafb78

yzqxy commented 1 year ago

fc7dea6baa6ebb330fbe3adc13ab0e9 02da263398b2ac1e5c17bbc16eafb78

理论上应该不会出现这种情况,网络训练到收敛了么

shangshan2023 commented 1 year ago

收敛了,训练了300轮,200轮的时候精度基本都不变了

yzqxy commented 1 year ago

收敛了,训练了300轮,200轮的时候精度基本都不变了

精度指标很低?你是拿detect测试的图片?还是直接看的训练完的val_pred图片,val_pred图片缩放没改有点问题,建议测试直接用detect

shangshan2023 commented 1 year ago

这是用val.py测试得到的图片,试了下detect.py检测的没有错位。但是源码水平框的验证集map是0.8多,测试集的map是0.74。拿这个训练最后验证集的map只有0.7多,用val.py测试的测试集map在0.6。训练的F1_curve长这样,好像也不太对 F1_curve

yzqxy commented 1 year ago

这是用val.py测试得到的图片,试了下detect.py检测的没有错位。但是源码水平框的验证集map是0.8多,测试集的map是0.74。拿这个训练最后验证集的map只有0.7多,用val.py测试的测试集map在0.6。训练的F1_curve长这样,好像也不太对 F1_curve

水平测试和旋转测试肯定是不能比的,原版水平框测试水分太大了,测试的时候你得注意dota原版测试的尺寸是1024,不是640

shangshan2023 commented 1 year ago

我跑的是dior数据集,测试的时候改了图像尺寸了。改成旋转目标检测不是为了使检测的精度更高吗?但是我跑了几个yolo改成obb的代码,好像精度都不如水平框的,您代码改后的旋转框精度有比水平框的提高吗?

yzqxy commented 1 year ago

我跑的是dior数据集,测试的时候改了图像尺寸了。改成旋转目标检测不是为了使检测的精度更高吗?但是我跑了几个yolo改成obb的代码,好像精度都不如水平框的,您代码改后的旋转框精度有比水平框的提高吗?

这个数据集我没跑过,是旋转的数据集么?检测精度跟评估标准相关,如果你训的是旋转框,你做评估是以旋转框的最大外接矩形来做水平框的iou计算来作为评估标准,那精度肯定是更高的(原版yolov5_obb的评估策略),如果你直接计算旋转框的iou来作为评估标准那肯定要求更高,也会导致精度可能更低,因为旋转框可能有一点偏移,iou就会急速下降,特别是小目标。

shangshan2023 commented 1 year ago

DIOR也是个旋转的遥感数据集。我明白了,我回头跑下yolov5_obb的代码试试精度是不是提高的。您发布的代码里的评估标准是第二种的吗?

945943307 commented 9 months ago

DIOR也是个旋转的遥感数据集。我明白了,我回头跑下yolov5_obb的代码试试精度是不是提高的。您发布的代码里的评估标准是第二种的吗?

你好,我想问下,dior里面那个旋转标签要怎么转换成YOLO能用的格式,请问你的代码在哪找的?

shangshan2023 commented 9 months ago

``> > DIOR也是个旋转的遥感数据集。我明白了,我回头跑下yolov5_obb的代码试试精度是不是提高的。您发布的代码里的评估标准是第二种的吗?

你好,我想问下,dior里面那个旋转标签要怎么转换成YOLO能用的格式,请问你的代码在哪找的?

网上没找到,让gtp写的,应该是这个 ` import os import xml.etree.ElementTree as ET

输入XML文件夹路径

xml_folder = '/root/autodl-tmp/datasets/dior/Annotations/Oriented Bounding Boxes'

输出TXT文件夹路径

output_folder = 'DIORTXTAnnotations-c' os.makedirs(output_folder, exist_ok=True)

a = 0

遍历XML文件夹中的每个XML文件

for xml_file in os.listdir(xml_folder): if xml_file.endswith('.xml'): xml_path = os.path.join(xml_folder, xml_file)

    # 解析XML文件
    tree = ET.parse(xml_path)
    root = tree.getroot()

    # 获取.txt文件的输出路径
    txt_file = os.path.splitext(xml_file)[0] + '.txt'
    txt_path = os.path.join(output_folder, txt_file)

    # 打开输出.txt文件以写入转换后的标注信息
    with open(txt_path, 'w') as output_file:
        # 遍历每个<object>元素
        for obj in root.findall('object'):
            category = obj.find('name').text
            robndbox = obj.find('robndbox')

            # 提取四个角点的坐标
            x1 = float(robndbox.find('x_left_top').text)
            y1 = float(robndbox.find('y_left_top').text)
            x2 = float(robndbox.find('x_right_top').text)
            y2 = float(robndbox.find('y_right_top').text)
            x3 = float(robndbox.find('x_right_bottom').text)
            y3 = float(robndbox.find('y_right_bottom').text)
            x4 = float(robndbox.find('x_left_bottom').text)
            y4 = float(robndbox.find('y_left_bottom').text)

            # 检查坐标是否为负数,如果是负数则跳过写入操作
            if x1 < 0 or y1 < 0 or x2 < 0 or y2 < 0 or x3 < 0 or y3 < 0 or x4 < 0 or y4 < 0:
                continue

            # 将标注信息写入输出.txt文件
            output_file.write(f'{x1} {y1} {x2} {y2} {x3} {y3} {x4} {y4} {category} 0\n')

print(f"已将标注信息保存到 {output_folder} 文件夹中") `