python:将 NWPU_VHR-10 遥感目标检测数据集转换成 YOLO 格式

news2024/11/16 15:25:35

作者:CSDN @ _养乐多_

本文将介绍将 NWPU_VHR-10 遥感目标检测数据集转换成 YOLO 格式的 python 脚本。

在这里插入图片描述


文章目录

      • 一、数据集介绍
          • 1.1 数据集下载
          • 1.2 数据集介绍
          • 1.3 数据格式
      • 二、格式转换
      • 三、完整代码


一、数据集介绍

1.1 数据集下载

https://opendatalab.com/OpenDataLab/NWPU_VHR-10

1.2 数据集介绍

NWPU VHR-10数据集是具有挑战性的十类地理空间对象检测数据集。该数据集总共包含800幅VHR光学遥感图像,其中715幅彩色图像是从谷歌地球获得的,空间分辨率从0.5到2米,从具有0.08 m的空间分辨率的Vaihingen数据获取85幅经锐化的彩色红外图像。

该数据集被分成两组:

  • a) 在图像中包含至少一个目标的正图像集包含650图像。
  • b) 负图像集包含150图像,并且它不包含任何目标。
    由此,正面图像集、757飞机、302船只、655储罐、390棒球钻石、524网球场、159篮球场、163地面田径场、224港口、124桥梁和477车辆被手动注释为边界框和用于地面真相的实例面具。

使用全部数据集或者部分数据的时候,需要引用以下论文:

  • Gong Cheng, Junwei Han, Peicheng Zhou, Lei Guo. Multi-class geospatial object detection and geographic image classification based on collection of part detectors. ISPRS Journal of Photogrammetry and Remote Sensing, 98: 119-132, 2014.
  • Gong Cheng, Junwei Han. A survey on object detection in optical remote sensing images. ISPRS Journal of Photogrammetry and Remote Sensing, 117: 11-28, 2016.
  • Gong Cheng, Peicheng Zhou, Junwei Han. Learning rotation-invariant convolutional neural networks for object detection in VHR optical remote sensing images. IEEE Transactions on Geoscience and Remote Sensing, 54(12): 7405-7415, 2016.
1.3 数据格式

文本文件的每一行定义了一个对象边界框,格式如下:

(x1,y1),(x2,y2),a

其中(x1,y1)表示边界框的左上角坐标,(x2,y2)表示边界框的右下角坐标,而a是对象类别(1-飞机,2-船只,3-储罐,4-棒球场,5-网球场,6-篮球场,7-田径场地,8-港口,9-桥梁,10-车辆)。

二、格式转换

我们需要将 NWPU_VHR-10 数据集转换成 YOLO 格式,以进行目标检测。

就是将

(x1,y1),(x2,y2),a

转换为 YOLO 格式

class, x_center, y_center, width, height

YOLO的标注格式非常简洁,对于每张图片中的每一个对象,都会有一行描述该对象的信息。每一行包含五个值:

  • 类别的索引(class index):表示该对象所属的类别,在类别列表中的索引(从0开始)。
  • 中心点的 x 坐标(x_center):对象边界框中心点相对于图像宽度的归一化位置(范围 0 到 1)。
  • 中心点的 y 坐标(y_center):对象边界框中心点相对于图像高度的归一化位置(范围 0 到 1)。
  • 边界框的宽度(width):边界框的宽度相对于图像宽度的归一化值(范围 0 到 1)。
  • 边界框的高度(height):边界框的高度相对于图像高度的归一化值(范围 0 到 1)。

举个例子,如果有一个图像,其中包含一个类别为“人”的对象,该对象的边界框中心点位于图像的 (0.4, 0.5),边界框的宽度为图像宽度的 0.1 倍,高度为图像高度的 0.2 倍,并且“人”这个类别的索引是 0,则对应的 YOLO 格式的标注文件中的一行可能如下所示:

0 0.4 0.5 0.1 0.2

三、完整代码

使用时,需要修改 class_map 和文件路径。

import os
from PIL import Image


def convert_to_yolo_format(x1, y1, x2, y2, img_width, img_height):
    dw = 1.0 / img_width
    dh = 1.0 / img_height
    center_x = (x1 + x2) / 2.0
    center_y = (y1 + y2) / 2.0
    width = x2 - x1
    height = y2 - y1
    center_x *= dw
    center_y *= dh
    width *= dw
    height *= dh
    return (center_x, center_y, width, height)


# 文件路径
annotations_dir = r'E:\DataSet\NWPUVHR10dataset\annotations'
images_dir = r'E:\DataSet\NWPUVHR10dataset\positive'
output_dir = r'E:\DataSet\NWPUVHR10dataset\yolo_labels'

# 确保输出目录存在
os.makedirs(output_dir, exist_ok=True)

# 类别映射
class_map = {
    '1': '0',  # 飞机
    '2': '1',  # 船只
    '3': '2',  # 储油罐
    '4': '3',  # 棒球场
    '5': '4',  # 网球场
    '6': '5',  # 篮球场
    '7': '6',  # 跑道场地
    '8': '7',  # 港口
    '9': '8',  # 桥梁
    '10': '9'  # 车辆
}


def get_image_size(image_path):
    # 打开图片文件
    with Image.open(image_path) as img:
        # 获取图片的宽度和高度
        width, height = img.size
        return width, height


def parse_bbox(line):
    try:
        # 去掉括号,并用逗号分割
        line = line.strip().replace('(', '').replace(')', '')
        parts = line.split(',')
        if len(parts) != 5:
            raise ValueError("Invalid line format")

        x1, y1, x2, y2 = map(int, parts[:4])
        class_id = parts[4]

        return x1, y1, x2, y2, class_id
    except ValueError as e:
        print(f"Error parsing line: {line}. Error: {e}")
        return None, None, None, None, None


# 遍历标注文件
for annotation_file in os.listdir(annotations_dir):
    if annotation_file.endswith('.txt'):
        # 读取对应的图像文件
        image_file = os.path.splitext(annotation_file)[0] + '.jpg'
        image_path = os.path.join(images_dir, image_file)

        # 打印调试信息
        print(f"Processing image: {image_path}")

        if not os.path.exists(image_path):
            print(f"Image file {image_path} does not exist, skipping.")
            continue

        # 获取图像大小
        img_width, img_height = get_image_size(image_path)

        # 读取标注文件
        annotation_path = os.path.join(annotations_dir, annotation_file)
        with open(annotation_path, 'r') as f:
            lines = f.readlines()

        # 输出文件路径
        output_path = os.path.join(output_dir, annotation_file)

        with open(output_path, 'w') as out_f:
            for line in lines:
                # 解析标注信息
                x1, y1, x2, y2, class_id = parse_bbox(line)
                if x1 is None:
                    continue

                class_id = class_map.get(class_id, None)
                if class_id is None:
                    print(f"Unknown class id: {class_id}")
                    continue

                # 转换为YOLO格式
                center_x, center_y, width, height = convert_to_yolo_format(x1, y1, x2, y2, img_width, img_height)

                # 写入输出文件
                out_f.write(f"{class_id} {center_x} {center_y} {width} {height}\n")

print("Conversion completed.")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GRU门控循环单元【数学+图解】

文章目录 1、简介2、门控机制3、公式4、图解GRU4.1、重置门和更新门4.2、候选隐藏状态和隐藏状态⭐ 5、LSTM与GRU的对比6、应用7、训练技巧 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习&#xff…

MATLAB车道线检测系统

研究了汽车辅助驾驶系统中的计算机视觉问题 . 一方面 , 用小波变换对高速公路上的道路边缘进行检测 ; 另一方面 , 利用灰度以及几何特征实时跟踪和检测车道边缘 , 通过建立道路边缘模型 , 采用数据拟合的方法确定边界轨迹方程 , 从而估算出公路的延伸方向 , 实现汽车的自动防偏…

信号链直流误差

1 简介 在信号链中,可能会累积的误差有两类:直流和交流误差。直流或静态误差(如增益和失调误差)有助于了解信号链的精度或灵敏度。交流类误差也称为噪声和失真,限制着系统的性能和动态范围。这两类误差都需要了解&…

js中的ajax【Axios,XMLHttpRequest,Promise,async】回调函数地狱等问题

目录 前置知识 1.什么是异步请求? 2.什么是回调函数 3.如何查看网页的异步请求(XHR)? 4.什么是ajax jquery的ajax,xhr,axios关系 正文---几种请求之间的关系 axios Axios的诞生 Axios的介绍 定义…

同城交易小程序的设计

管理员账户功能包括:系统首页,个人中心,商家管理,用户管理,商品分类管理,商品信息管理,订单管理,系统管理 微信端账号功能包括:系统首页,商品信息&#xff0…

2024年“华数杯”数学建模竞赛C题完整解析 | 代码与论文分享

C题 技术文档(论文)数据预处理问题一问题二问题三问题四 数据与代码问题一问题二问题三问题四 技术文档(论文) 29页,1w字,完整论文请看文章最后~ 数据预处理 (1)利用python对数据文件…

【安当产品应用案例100集】005-安当ASP实现Exchange双因素登录认证

Exchange双因素登录通过增加额外的安全验证层,可以有效提高企业邮箱系统的安全性,减少了数据泄露和账号被盗的风险,同时也符合了日益严格的安全合规要求。 其必要性主要体现在以下几个方面: 提高安全性:传统的用户名…

未授权访问漏洞系列详解⑤!

Kubernetes Api Server未授权访问漏洞 Kubernetes 的服务在正常启动后会开启两个端口:Localhost Port(默认8080)Secure Port(默认6443)。这两个端口都是提供 Api Server 服务的,一个可以直接通过Web 访问,另一个可以通过 kubectl 客户端进行调用。如果运…

html+css 实现hover上下边框生长

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…

平安城市行业无人机解决方案(夜间作业场景应用)

夜间作业场景痛点: 夜间隐蔽作业需要权衡看清楚和隐蔽性 可见光相机夜间无法使用 “五合一”混合夜视传感器-H20N 夜间侦察巡逻 H20N星光级相机提升夜间作业覆盖效率 Zenmuse H20N变焦镜头夜景模式效果 Zenmuse H20N变焦镜头夜景模式效果 Zenmuse H20T变焦镜头夜…

【Android】四大组件(Activity、Service、Broadcast Receiver、Content Provider)、结构目录

文章目录 Android系统架构Android四大组件ActivityServiceBroadcast ReceiverContent Provider 两大视图主要结构目录 Android系统架构 https://blog.csdn.net/xzzteach/article/details/140904613 Android四大组件 Activity 一个 Activity 包含了用户能够看到的界面&#xff0…

判断Windows设备是否为翻新

网购设备难免踩坑,一定要学会查验,及时保存证据并投诉商家。 1、查验包装信息,是否有拆封痕迹 商家翻新处理的第一道工序就是换个完整的包装,一般不会把拆过的包装打包卖给买家,除非声明是二手。 2、查验序列号&#x…

干货-并发编程提高——线程的唤醒(七)

没有参数的wait()方法等价于wait(0),等价于永远等下去。虚假唤醒:一个线程也能在没有被通知,中断,或超时的情况下被唤醒。也即所谓的“虚假唤醒”。解决虚假唤醒的办法就是通过while循环来判断条件。 何为虚假唤醒 简单讲,要避免使…

磷酸铁锂与三元锂:谁会取得压倒性的胜利?

在电动车市场中,磷酸铁锂(LFP)和三元锂(NCM/NCA)电池是两种主要的锂离子电池技术。近年来,关于这两种电池的讨论愈发热烈。本文将深入探讨磷酸铁锂与三元锂的真正区别,以及它们在未来电动车市场…

AI8-文本检测

文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要 解决目标分类问题。 文本在图像中的表现形式可以视为一种‘目标‘,通用的目标检测的方法也适用于文本检测,从任务本身上来 看: • 目标检测:给定图像或者视频,找出目…

什么是SQL注入?基于实例讲解

一、SQL注入的含义: SQL注入是一种常见的网络攻击,由于程序对输入数据的判断或者检验不严格,导致攻击者查询到了授权范围之外的数据,甚至还可以修改数据库中的数据,对数据库执行一些管理操作等,所以它的危…

【Material-UI】Button 中的点击事件处理(Handling clicks)详解

文章目录 一、点击事件处理基础1. 基本用法2. 事件处理器的传递 二、实际应用中的注意事项1. 事件处理逻辑的优化2. 避免过多的状态更新3. 使用合适的事件类型 三、关于文档中未提及的原生属性四、最佳实践1. 无障碍性2. 视觉反馈3. 防止重复点击 五、总结 在现代前端开发中&am…

测试TLP 使用外部 50Ω 电缆和非 50Ω 电缆影响

测试目的 实验有 SMA 母头连接器与没有SMA母头连接器 I/V 曲线的影响实验 50Ω 电缆和非 50Ω 电缆应用条件下的 I/V 曲线研究初始启动和 16A DUT(被测器件)应用条件下的脉冲电压和脉冲电流影响 开始测试前先做短路/开路校正 短路校正 开路校正 TLP取样方式与为框黄色70ns~90…

详解线程池的使用

一、线程池基础 1.1、线程池的思想 我们首先理解什么是池化技术: 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 池化技术的优点主要有两个:提前准备和重复利用。 下面是池化技术常见的应用场景: …

SpringBoot+Redis 发布与订阅

两个应用都引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artif…