您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页[DIOR | DIOR-R]旋转目标检测数据集——基于YOLOv8obb,map50已达81.8%

[DIOR | DIOR-R]旋转目标检测数据集——基于YOLOv8obb,map50已达81.8%

来源:爱go旅游网

DIOR是一个用于光学遥感图像目标检测的大规模基准数据集。涵盖20个对象类。这20个对象类是飞机、机场、棒球场、篮球场、桥梁、烟囱、水坝、高速公路服务区、高速公路收费站、港口、高尔夫球场、地面田径场、天桥、船舶、体育场、储罐、网球场、火车站、车辆和风磨。

1. DIOR简介

1.1 数据说明

DIOR由23463张遥感图像和190288个目标实例组成,这些目标实例用轴向对齐的边界框手动标记,由192472个轴对齐的目标边界框注释组成。数据集中图像大小为800×800像素,空间分辨率为0.5m ~ 30m。该数据集分为训练验证集(11725张图像)和测试集(11738张图像)。

DIOR-R数据集是在DIOR数据集的基础上,对目标实例重新标注边框,采用旋转框标注,这样避免了水平框的重叠问题。

1.2 DIOR-R数据格式

解压后,标签内的Horizontal Bounding Boxes为水平框,Oriented Bounding Boxes为旋转框,如下所示为旋转框示例,可以看到相关的信息,如坐标、角度、标签等信息。

2.DIOR-R数据处理

2.1 处理成如下格式

133 237 684 237 684 672 133 672 golffield 0

处理代码如下:

import os
import xml.etree.ElementTree as ET
# 输入文件夹和输出文件夹路径
input_folder = 'xmls'
output_folder = 'labels'
# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有XML文件
for xml_file in os.listdir(input_folder):
    if xml_file.endswith(".xml"):
        xml_path = os.path.join(input_folder, xml_file)
        # 读取XML文件
        tree = ET.parse(xml_path)
        root = tree.getroot()
        # 构建输出txt文件路径
        txt_file = os.path.join(output_folder, os.path.splitext(xml_file)[0] + '.txt')
        # 打开txt文件进行写入
        with open(txt_file, 'w') as f:
            # 循环遍历每个object节点
            for obj in root.findall('.//object'):
                # 提取需要的信息
                x_left_top = obj.find('.//x_left_top').text
                y_left_top = obj.find('.//y_left_top').text
                x_right_top = obj.find('.//x_right_top').text
                y_right_top = obj.find('.//y_right_top').text
                x_right_bottom = obj.find('.//x_right_bottom').text
                y_right_bottom = obj.find('.//y_right_bottom').text
                x_left_bottom = obj.find('.//x_left_bottom').text
                y_left_bottom = obj.find('.//y_left_bottom').text
                name = obj.find('.//name').text
                angle = obj.find('.//angle').text
                # 写入到txt文件
                line = f"{x_left_top} {y_left_top} {x_right_top} {y_right_top} {x_right_bottom} {y_right_bottom} {x_left_bottom} {y_left_bottom} {name} {angle}\n"
                f.write(line)
print("批量转换完成。")

 2.2进行obb格式的转换

转换后的结果如下:

9 0.16625 0.29625 0.855 0.29625 0.855 0.84 0.16625 0.84

转换代码如下所示:

from ultralytics.data.converter import convert_dota_to_yolo_obb
convert_dota_to_yolo_obb('C:\myyolo\ultralytics-main\dataobb')
#关于dataobb文件下的目录可参考https:///qq_41301570/article/details/1350398

对应的convert_dota_to_yolo_obb函数下的class_mapping修改如下:

class_mapping = {
        "airplane": 0,
        "airport": 1,
        "baseballfield": 2,
        "basketballcourt": 3,
        "bridge": 4,
        "chimney": 5,
        "dam": 6,
        "Expressway-Service-area": 7,
        "Expressway-toll-station": 8,
        "golffield": 9,
        "groundtrackfield": 10,
        "harbor": 11,
        "overpass": 12,
        "ship": 13,
        "stadium": 14,
        "storagetank": 15,
        "tenniscourt": 16,
        "trainstation": 17,
        "vehicle": 18,
        "windmill": 19,
    }
9 0.16625 0.29625 0.855 0.29625 0.855 0.84 0.16625 0.84

2.3进行训练

如果你不想浪费时间进行数据的处理,可私戳!!!

from ultralytics import YOLO
import os
​
def main():
    model = YOLO('yolov8s-obb.yaml').load('yolov8s-obb.pt')  # build from YAML and transfer weights
    model.train(data='dior8-obb.yaml', epochs=300, imgsz=[1280, 659], batch=4, workers=4)
if __name__ == '__main__':
    main()

 2.4进行验证

from ultralytics import YOLO
def main():
    model = YOLO(r'runs/obb/train/weights/best.pt')
    model.val(data='dior8-obb.yaml', imgsz=1024, batch=4, workers=4)
if __name__ == '__main__':
    main()

 2.5测试集上的表现

最后:

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务