跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

无人机 RGBT 双模态小目标行人检测数据集及系统构建

无人机 RGBT 双模态小目标行人检测数据集及系统构建 数据集概览 模态与视角:无人机搭载 RGBT 双光相机,从 50–80 m 高度、45°–60° 俯视角采集,同步 RGB + 热红外图像对。 规模:6,125 对图像(4,900 train / 1,225 test),分辨率 640×512,共 70,880 个行人实例。 任务:专门面向 tiny person detection 的无人…

晚风叙旧发布于 2026/4/6更新于 2026/5/2786K 浏览
无人机 RGBT 双模态小目标行人检测数据集及系统构建

无人机 RGBT 双模态小目标行人检测数据集及系统构建

数据集概览

模态与视角:无人机搭载 RGBT 双光相机,从 50–80 m 高度、45°–60° 俯视角采集,同步 RGB + 热红外图像对。 规模:6,125 对图像(4,900 train / 1,225 test),分辨率 640×512,共 70,880 个行人实例。 任务:专门面向 tiny person detection 的无人机 RGBT 检测 benchmark。

无人机 RGBT 检测示例

以下是 无人机视角下 RGB+ 红外对齐行人小目标检测数据集 的详细信息整理成表格:

📊 无人机 RGBT 行人小目标检测数据集概览表
项目内容
数据集名称DroneRGBT-Pedestrian(或自定义命名)
任务类型小目标行人检测(Tiny Person Detection)
应用场景低空安防、应急搜救、智慧城市、边境巡检、夜间监控
采集平台无人机(UAV)搭载 RGB + 热红外(Thermal)双光相机
模态双模态同步图像对:可见光(RGB)、热红外(Infrared / Thermal)
采集高度50 – 80 米
俯视角45° – 60° 斜向俯拍
图像分辨率640 × 512 像素(RGB 与红外严格对齐)
图像对数量6,125 对(每对含 1 张 RGB + 1 张红外图)
数据划分训练集(train):4,900 对;测试集(test):1,225 对
标注格式支持 YOLO / COCO / VOC 等(通常提供边界框 .txt 或 .json)
目标类别1 类:行人(Person)
总实例数70,880 个行人标注框(平均每个图像约 11.6 个目标)
目标特点小目标为主(多数 < 32×32 像素);包含遮挡、密集、远距离、夜间/低照度场景;红外模态增强弱光/夜间检测能力
对齐方式像素级空间对齐(经标定与配准,RGB 与红外图一一对应)
适用模型单模态:YOLOv8(RGB 或 Thermal);多模态融合:Fusion-YOLO、CFT、MFFNet、GLAD 等 RGBT 检测模型
用途无人机小目标检测 benchmark;多模态特征融合研究;跨模态对齐与迁移学习

该数据集专为 挑战性极高的无人机小行人检测任务 设计,特别适合评估模型在 远距离、小尺度、复杂光照(含夜间) 条件下的鲁棒性。

以下是构建 基于无人机 RGB+ 红外(RGBT)双模态小目标行人检测系统 的完整代码方案,采用 YOLOv8 多模态融合架构(简化版),支持训练、推理与可视化。由于 Ultralytics YOLOv8 原生不直接支持双模态输入,我们将通过 早期融合(Early Fusion) 方式将 RGB 与红外图拼接为 4 通道输入,并微调模型。

💡 注:本方案适用于科研/工程落地,可作为 benchmark 系统基础。

📁 一、项目结构

DroneRGBT_Detection/
├── datasets/
│   ├── images/
│   │   ├── train/ # 存放融合后的 4 通道 .npy 或拼接图
│   │   └── val/
│   └── labels/
│       ├── train/
│       └── val/
├── models/
│   └── yolov8s-rgbt.yaml # 自定义 4 通道输入模型配置
├── tools/
│   ├── fuse_rgb_thermal.py # 将 RGB + 红外融合为 4 通道图像
│   └── create_labels.py # (若需从原始标注生成 YOLO 格式)
├── train.py # 训练脚本
├── detect.py # 推理脚本(支持单图/视频)
└── rgbt_drone.yaml # 数据集配置文件

🔧 二、1. 融合 RGB + 红外图像(fuse_rgb_thermal.py)

# tools/fuse_rgb_thermal.py
import os
import cv2
import numpy as np

def fuse_rgb_thermal(rgb_dir, thermal_dir, output_dir):
    os.makedirs(output_dir, exist_ok=True)
    rgb_files = sorted(os.listdir(rgb_dir))
    for rgb_file in rgb_files:
        if not rgb_file.lower().endswith(('.jpg', '.png')):
            continue
        thermal_file = rgb_file  # 假设文件名一致
        rgb_path = os.path.join(rgb_dir, rgb_file)
        thermal_path = os.path.join(thermal_dir, thermal_file)
        rgb = cv2.imread(rgb_path)  # (H, W, 3)
        thermal = cv2.imread(thermal_path, cv2.IMREAD_GRAYSCALE)  # (H, W)
        if rgb is None or thermal is None:
            print(f"Skip {rgb_file}")
            continue
        # 调整 thermal 到 3 通道(可选)或保留单通道
        thermal = np.expand_dims(thermal, axis=2)  # (H, W, 1)
        fused = np.concatenate([rgb, thermal], axis=2)  # (H, W, 4)
        # 保存为 .npy(推荐)或拼接图(如用 4 通道 TIFF)
        np.save(os.path.join(output_dir, rgb_file.replace('.jpg', '.npy')), fused)

if __name__ == '__main__':
    fuse_rgb_thermal(
        rgb_dir='raw_data/train/rgb',
        thermal_dir='raw_data/train/thermal',
        output_dir='datasets/images/train'
    )

✅ 输出为 .npy 文件(含 4 通道),便于后续加载。

🛠️ 三、2. 自定义 YOLOv8 模型(4 通道输入)

创建 models/yolov8s-rgbt.yaml:

# YOLOv8s for RGBT (4-channel input)
nc: 1  # number of classes
scales: [0.33, 0.50]  # model depth and width scaling
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2 (input must be 4-channel!)
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]]  # 9
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C2f, [512]]  # 12
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f, [256]]  # 15 (P3/8-small)
  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f, [512]]  # 18 (P4/16-medium)
  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 21 (P5/32-large)
  - [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)

⚠️ 关键修改:首层 Conv 输入通道自动适配 4 通道(无需改代码,PyTorch 自动推断)。

📂 四、3. 数据集配置(rgbt_drone.yaml)

# rgbt_drone.yaml
train: ./datasets/images/train  # 实际存放 .npy 路径
val: ./datasets/images/val
nc: 1
names: ['person']

❗ 注意:Ultralytics 默认读取图像文件(.jpg/.png),但我们需要加载 .npy。因此需自定义数据加载器。

🧩 五、4. 自定义数据加载器(关键!)

在 train.py 中重写 load_image 行为(简化版):

# train.py
from ultralytics import YOLO
import torch
import numpy as np
import os
from pathlib import Path

# 替换默认的图像加载方式
def custom_load_image(self, i):
    """Load 4-channel .npy image"""
    path = self.files[i]
    if path.endswith('.npy'):
        img = np.load(path)  # (H, W, 4)
        img = img.transpose(2, 0, 1)  # (4, H, W)
        img = torch.from_numpy(img).float()
        return img, img.shape[1], img.shape[2]
    else:
        # fallback
        return self._old_load_image(i)

# Monkey patch(仅用于训练)
from ultralytics.data.dataset import YOLODataset
YOLODataset._old_load_image = YOLODataset.load_image
YOLODataset.load_image = custom_load_image

# 修改标签加载(确保 .txt 对应 .npy)
def custom_get_label_file(self, img_path):
    return str(Path(img_path).with_suffix('.txt'))

YOLODataset.get_label_file = custom_get_label_file

▶️ 六、5. 完整训练脚本(train.py)

# train.py(完整版)
from ultralytics import YOLO
import torch
import numpy as np
from pathlib import Path

# === 自定义数据加载(支持 .npy)===
from ultralytics.data.dataset import YOLODataset

def load_image_npy(self, i):
    f = self.im_files[i]
    if f.endswith('.npy'):
        im = np.load(f)  # (H, W, 4)
        im = im.transpose(2, 0, 1)  # (4, H, W)
        im = torch.from_numpy(im).float()
        h, w = im.shape[1], im.shape[2]
        return im, h, w
    else:
        return self._orig_load_image(i)

def get_label_file_npy(self, img_path):
    return str(Path(img_path).with_suffix('.txt'))

# Patch
YOLODataset._orig_load_image = YOLODataset.load_image
YOLODataset.load_image = load_image_npy
YOLODataset.get_label_file = get_label_file_npy

# === 开始训练 ===
if __name__ == '__main__':
    model = YOLO('models/yolov8s-rgbt.yaml')  # 从头训练
    # 或加载预训练权重(需修改首层 conv1.weight)
    # model = YOLO('yolov8s.pt')
    # model.model.model[0].conv = torch.nn.Conv2d(4, 64, 3, 2, 1)  # 手动替换
    model.train(
        data='rgbt_drone.yaml',
        epochs=100,
        imgsz=512,
        batch=16,
        name='drone_rgbdet',
        project='runs',
        device=0,
        cache=False,
        workers=4
    )

🔍 七、6. 推理脚本(detect.py)

# detect.py
import torch
import numpy as np
import cv2
from ultralytics import YOLO

model = YOLO('runs/drone_rgbdet/weights/best.pt')

def detect_rgbd_pair(rgb_path, thermal_path):
    rgb = cv2.imread(rgb_path)  # (H, W, 3)
    thermal = cv2.imread(thermal_path, cv2.IMREAD_GRAYSCALE)  # (H, W)
    thermal = np.expand_dims(thermal, axis=2)
    fused = np.concatenate([rgb, thermal], axis=2)  # (H, W, 4)
    fused = fused.transpose(2, 0, 1)  # (4, H, W)
    fused = torch.from_numpy(fused).float().unsqueeze(0) / 255.0  # 归一化
    results = model(fused, augment=True)
    # 可视化:叠加在 RGB 图上
    annotated = results[0].plot()
    cv2.imshow('Detection', annotated)
    cv2.waitKey(0)

# 示例
# detect_rgbd_pair('test/rgb/001.jpg', 'test/thermal/001.jpg')

✅ 八、部署建议

方案说明
科研实验使用 .npy + 自定义 DataLoader
工程部署将 RGB + 红外拼接为 4 通道 TIFF / PNG(需扩展 OpenCV 支持)
加速推理导出 ONNX 后使用 TensorRT(需处理 4 通道输入)
替代融合策略中期融合(Two-Stream + 特征拼接)效果更佳,但需重写模型

目录

  1. 无人机 RGBT 双模态小目标行人检测数据集及系统构建
  2. 数据集概览
  3. 📊 无人机 RGBT 行人小目标检测数据集概览表
  4. 📁 一、项目结构
  5. 🔧 二、1. 融合 RGB + 红外图像(fusergbthermal.py)
  6. tools/fusergbthermal.py
  7. 🛠️ 三、2. 自定义 YOLOv8 模型(4 通道输入)
  8. YOLOv8s for RGBT (4-channel input)
  9. [from, repeats, module, args]
  10. 📂 四、3. 数据集配置(rgbt_drone.yaml)
  11. rgbt_drone.yaml
  12. 🧩 五、4. 自定义数据加载器(关键!)
  13. train.py
  14. 替换默认的图像加载方式
  15. Monkey patch(仅用于训练)
  16. 修改标签加载(确保 .txt 对应 .npy)
  17. ▶️ 六、5. 完整训练脚本(train.py)
  18. train.py(完整版)
  19. === 自定义数据加载(支持 .npy)===
  20. Patch
  21. === 开始训练 ===
  22. 🔍 七、6. 推理脚本(detect.py)
  23. detect.py
  24. 示例
  25. detectrgbdpair('test/rgb/001.jpg', 'test/thermal/001.jpg')
  26. ✅ 八、部署建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 数据容器详解:列表、元组、字符串、集合与字典
  • 基于 Python 与 Flask 的旅游景点推荐系统实现
  • 微信小程序 WebView 组件使用指南与常见应用场景
  • 机器人运动学解算与逆解算法详解
  • Stable-Diffusion-Videos 负向提示使用教程:精准控制 AI 生成内容
  • Xred 蠕虫行为分析及修复工具开发
  • DevEco Studio 配置构建:HarmonyOS Next 多目标产物定制
  • 未来操作系统演进:模型即系统架构与可行性分析
  • Linux 备份与还原
  • C++ 万能头文件 #include<bits/stdc++.h> 详解
  • C++ 运算符重载入门:分数类实现示例
  • LeetCode 221. 最大正方形
  • Python 开发 MongoDB 数据库 MCP Server 实战指南
  • 前端 API 设计最佳实践
  • AI 科学家系列论文阅读笔记:搜索推理与多智能体工作流
  • Python 基本语法:函数定义与使用详解
  • C++ 哈希表详解:开散列与闭散列
  • 华为 OD 机试:流水线调度问题
  • STEP3-VL-10B WebUI 启用历史会话与上下文记忆教程
  • Java 数据结构:八大排序算法

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online