☰
无人机热成像行人车辆检测:2755张VOC+YOLO数据集与YOLO训练实战
2026/10/17 11:10:42 网站建设 项目流程

开始拿到无人机拍的热成像数据时,我其实是有点头疼的。很多人以为做目标检测最难的是模型调参、训练卡怎么选,可等你真正坐下来把任务拆开,会发现最磨人的是数据:来源少、格式乱、标注不统一。尤其像“无人机视角热成像行人车辆检测”这种细分场景,网上公开资源原本就少,能直接拿过来训练、还同时给好VOC和YOLO两种格式的更是稀有。这套2755张、2类别的数据集,对我来说价值恰恰在于它把所有准备工作提前做完了,我可以把精力直接放在检测思路和调参本身。所以这篇想认真拆一下这套数据到底怎么用,也把从标注检查到训练部署的完整链路分享出来。

先说清楚适合谁看。如果你在做无人机巡检、应急搜救、园区安防、智慧交通这类项目,需要在红外俯拍图里定位行人和车辆,这份数据可以作为很靠谱的起点;如果你是学生或者刚转行做视觉算法,想找一份能直接喂给YOLO等常见框架练手的数据,这套VOC+YOLO双格式的样本也能帮你少踩很多格式转换的坑。

1. 这套数据为什么值得做一次完整拆解

1.1 无人机热成像场景的尴尬现状

把痛点讲清楚,你才能理解这份数据到底解决了什么。

普通可见光下的行人车辆检测,公开数据集非常多,想找类似COCO、VOC那种规模的数据不是难事。但无人机视角下情况完全不同。无人机飞行高度高、视角朝下,目标经常只占画面的一小块,还可能出现遮挡、旋转、密集排列这些麻烦。模型在平视视角的数据上训练得再好,换到高空俯拍场景,精度往往会肉眼可见地掉下来。

更棘手的是热成像本身。红外热像仪捕捉的是物体温度辐射,输出的是单通道灰度图。你乍一看会觉得它和黑白照片差不多,但图像信息差得多:没有颜色纹理,边缘模糊,对比度受环境温度影响特别大。行人因为体温恒定,多数情况下在画面里还算突出,可到了正午地面被晒得很热的时候,行人和背景的温差变小,目标几乎融进环境里。车辆更考验算法,停放久的车温度接近周边地面,只有刚开过的车轮胎和发动机盖还有明显热信号。这种背景下,靠可见光那套特征来做检测,效果自然不稳定。

偏偏这类数据的公开积累非常少。很多团队被迫自己飞无人机、自己采集、自己标注,一标就是几个月,中间还要不断统一标准。所以当看到一套2755张、两个类别数据都规整好的资源时,它的价值已经不只是“有图可训”,而是把无人机热成像场景里很多会踩的坑提前摆在了你面前。

1.2 2755张、2类别足够撑起一个什么量级的任务

先说一个直观结论:2755张图放在深度学习领域不算大,但放在无人机热成像这个小样本细分场景里,属于一个非常适合起步的规模。

为什么这么说?举几个数字就有概念了。用yolov8s这类中等体量的模型,输入分辨率设640,默认增强全开,训练100个epoch,一张主流显卡大概四到六个小时能跑完。迭代非常快,你可以一天内完成多轮实验,对比不同训练策略的效果。这个节奏对小团队或个人开发者来说很重要,因为实际项目里时间成本往往比算力成本更敏感。

两个类别的设计也很合理。行人和车辆基本覆盖了无人机管控、交通监测、救灾巡查中最常见的检测需求,类别少意味着标签冲突少,模型收敛更快,适合做最基础的baseline。你还可以在这个底子上继续扩展,比如增加骑行者、动物、火点这些类别,把数据集慢慢扩成更适合自己业务的样子。

当然也有局限性。2755张的样本量决定了它不能完全替代你在真实业务场景里采集的数据,它更像一个高质量的开胃菜,帮助你验证方案、训练流程、评估模型,而不是最终的生产级数据。换句话说,用它把整条链路跑通,再替换进自己的数据,是最合适的用法。

2. 拿到数据先看懂格式:VOC与YOLO标注的实际差异

2.1 目录结构怎么摆,训练脚本才不报错

这套数据集的一大卖点就是同时提供VOC和YOLO两种格式。这两个格式对同一张图的存储方式完全不同,理解它们的差异,才能避免很多低级报错。

一个典型的目录结构长这样:

dataset/ ├── images/ │ ├── train/ │ │ ├── uav_0001.jpg │ │ └── ... │ ├── val/ │ │ ├── uav_0002.jpg │ │ └── ... ├── labels/ │ ├── train/ │ │ ├── uav_0001.txt │ │ └── ... │ ├── val/ │ │ ├── uav_0002.txt │ │ └── ... ├── Annotations/ │ ├── uav_0001.xml │ └── ... └── classes.txt

images放图像,labels放YOLO格式的txt标注,Annotations放VOC格式的xml标注,classes.txt记录类别名。使用时最重要的规则是:同名的图片、xml、txt必须一一对应,否则训练时图片和标签会错位,模型学到的东西就是错的。

还要注意图片后缀名。如果数据里有的图是.jpg,有的是.png,训练前最好统一一下,或者确认YOLO框架里路径配置支持混合格式。我遇到过的坑是,某个框架在数据加载时默认只认jpg,png文件被跳过,结果一个epoch下来训练图少了一半还浑然不觉。

2.2 VOC转YOLO的坐标换算到底哪里容易出错

VOC格式把目标框保存为(xmin, ymin, xmax, ymax),是像素坐标,也就是框左上角和右下角的坐标;YOLO格式则要求归一化到0到1的(x_center, y_center, width, height)。转换公式不复杂:

x_center = (xmin + xmax) / 2.0 / img_width y_center = (ymin + ymax) / 2.0 / img_height w = (xmax - xmin) / img_width h = (ymax - ymin) / img_height

举个例子你就理解了。假设一张热成像图分辨率是640×512,框住一个行人的坐标是xmin=120, ymin=200, xmax=180, ymax=340,转换后得到:

  • x_center = (120 + 180) / 2 / 640 = 0.234
  • y_center = (200 + 340) / 2 / 512 = 0.527
  • w = (180 - 120) / 640 = 0.094
  • h = (340 - 200) / 512 = 0.273

对应YOLO文本行就是0 0.234 0.527 0.094 0.273,其中0表示person这个类别的编号。

实际操作中容易出错的有三个点。第一是图像尺寸取错,很多xml不记录图片宽高,需要从原图读取,你如果用resize后的尺寸去算,所有坐标全部偏移;第二是目标贴边时,计算出的中心点或宽高可能略微超出0到1,最好做一次clip操作把数值约束到合法区间;第三是类别编号必须按照classes.txt里的顺序来,而不是按照目标在xml里出现的先后顺序,否则类别语义就乱了。

下面是一段简单的VOC转YOLO脚本,读xml并输出txt:

import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, img_w, img_h, class_map): tree = ET.parse(xml_path) root = tree.getroot() lines = [] for obj in root.findall('object'): name = obj.find('name').text if name not in class_map: continue box = obj.find('bndbox') xmin = float(box.find('xmin').text) ymin = float(box.find('ymin').text) xmax = float(box.find('xmax').text) ymax = float(box.find('ymax').text) x_center = (xmin + xmax) / 2.0 / img_w y_center = (ymin + ymax) / 2.0 / img_h w = (xmax - xmin) / img_w h = (ymax - ymin) / img_h lines.append(f"{class_map[name]} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}") return "\n".join(lines) if __name__ == "__main__": class_map = {"person": 0, "car": 1} result = voc_to_yolo("uav_0001.xml", 640, 512, class_map) with open("uav_0001.txt", "w") as f: f.write(result)

这套数据既然已经提供了两种格式,日常训练不用重复转换。但如果你要往项目里补充自采数据,这个逻辑一定要熟练,因为实际项目中大部分时间都花在整理自有数据上。

2.3 数据划分与文件配对的几个检查点

拿到数据后别急着开训,先做一次快速体检,能省下后面好几个小时的排错时间。

我的习惯是抽五六张图,把标注框可视化出来,用OpenCV写在原图上,肉眼扫一遍。重点看三件事:框是否贴住目标、类别是否标错、有没有明显漏检。热成像图里小目标多,标注人员偶尔会把框画偏,如果偏差很大,训练出来模型也会学习这种偏差。

然后是训练集和验证集的划分。常见比例是8:1:1或者8:2,但这里有个特别容易中招的坑:如果数据是从无人机视频里抽帧得到的,相邻帧可能非常相似。划分时要是采用了随机抽样,同一段视频里高度相似的画面会同时出现在训练集和验证集中,验证集的mAP会虚高,等部署到真实场景时精度回落,落差会很明显。正确做法是以“拍摄片段”为单位做划分,一个连续拍摄序列的画面整体只进入训练集或只进入验证集,这样才能测出模型真实的泛化能力。

3. 热成像小目标检测的预处理与增强策略

3.1 先做一轮标注体检,别把脏数据喂给模型

数据集的标注不能拿到就全信,尤其热成像这种纹理信息弱的图像,标注质量更值得关注。

我第一轮检查的重点有三个。一是目标框的宽高是否异常,比如接近整张图大小的框、宽高比夸张的框,都要重点回看。二是单张图目标数是否极端,单张图上目标数量过多或过少,会影响batch采样的平衡。三是是否存在明显漏标和错标。

热成像场景里,远处行人往往只占十几乘二十几个像素,框稍微一歪,IoU损失就很大。如果你发现标注框和目标的贴合度普遍不理想,那就要权衡是人工修正还是训练时容忍噪声。人工修正的工作量大,但如果样本量只有两三千张,花半天把严重错误修掉,训练收益通常非常值。

还要留意类别的真实分布。很多热成像数据集里,车辆样本远多于行人,或者反过来。只看整体mAP时模型可能表现不错,但分到行人这一类,AP却惨不忍睹。所以评估阶段一定要分开看每个类别的指标,不要被总数字骗过去。

3.2 针对灰度热图的增强手段怎么选

热成像图本质是单通道灰度图,增强策略不能简单照搬可见光那套,有些增强操作做了反而没有意义。

先说没用的。随机颜色抖动、RGB通道分离调整这类针对彩色图像的增强,在灰度图上基本失效,纯属浪费算力。更该关注的是下面几类增强:

  • 几何增强:水平翻转、随机缩放、随机裁剪、轻微旋转。无人机视角下目标朝向多变,水平翻转不改变热图像语义,收益很稳定。
  • 光度增强:亮度对比度调整、高斯噪声、轻微模糊。热成像受环境温度影响大,不同天气下亮度和对比度差异明显,适当扰动可以提升模型场景适应性。但幅度要克制,别把目标热信号抹掉。
  • 结构增强:Mosaic、MixUp、Copy-Paste。在只有2755张样本的情况下,Mosaic能显著增加目标上下文多样性,相当于通过拼接产生更多新场景。不过热成像背景变化相对单调,拼接时偶尔会出现同一个目标被切到两块图里的情况,训练时要关注是否引入了标注错位。

我常用的组合是:水平翻转概率0.5、随机亮度扰动区间-0.2~0.2、随机对比度扰动0.8~1.2,再加概率0.5的Mosaic。前几个epoch增强拉满,训练后期逐渐关掉一部分,让模型收敛在更接近真实数据分布的状态。增强不是越猛越好,它只是让模型见过更多变化,而不是让模型看不清原本目标。

3.3 模型输入通道与预训练权重的一个隐蔽坑

热成像训练里最容易忽视的问题,就是单通道输入和预训练权重之间的匹配关系。

很多检测框架默认图片是三通道RGB。你把单通道热成像图直接喂进去,框架会报错。这时候你只有两种选择:把灰度图复制三份变成三通道,或者修改模型第一层卷积的输入通道数为1。

复制三份的做法对预训练权重非常友好。因为输入层维度仍然是3,你可以直接加载预训练权重,模型的初始特征提取能力得到保留。缺点是三个通道完全相同,第一层卷积实际提取到的特征冗余,需要靠训练来逐步适应。

修改第一层为1通道的做法,在参数量上更干净,但这一层的预训练权重会丢失,必须重新初始化,整个模型的前几层相当于从头学起。在小样本数据上,训练指标通常会比复制三通道的效果差。所以我的建议很明确:除非你对输入结构有特殊需求,否则直接用复制三通道的方式省心,收敛也稳。

4. 用YOLO在本地把训练流程完整跑通

4.1 环境准备与数据配置文件

实操部分,我用YOLO系常见的开源训练框架来演示,整套流程可以复用到大多数目标检测项目。

先建虚拟环境,避免依赖冲突:

conda create -n uav_thermal python=3.9 -y conda activate uav_thermal pip install torch torchvision opencv-python pyyaml

python版本建议3.9或3.10,太新的版本偶尔会遇到第三方库没跟上。torch版本根据自己显卡和CUDA版本选,不知道装哪个就去框架官网看对应命令。没有GPU也能训练,但2755张图跑100个epoch会比较慢,能上GPU还是尽量上。

接下来是数据配置文件。YOLO系框架一般用一个yaml文件把数据路径和类别信息准备好:

path: /home/xxx/dataset train: images/train val: images/val nc: 2 names: 0: person 1: car

path填数据集根目录的绝对路径,train和val填相对于根目录的子目录。如果你拿到手的目录里还没划分好,先自己划分一遍,再把这两个路径改对。

4.2 训练超参的设置思路

训练命令不复杂:

yolo detect train \ model=yolov8s.pt \ data=uav_thermal.yaml \ imgsz=640 \ epochs=100 \ batch=16 \ patience=20 \ device=0 \ workers=8

拆开讲讲每个参数怎么定的。模型我选了s而不是n或m,是因为在热成像小目标场景里,n模型参数太少,2755张样本下学不到足够特征;m模型参数多,小样本容易过拟合。s处在一个比较平衡的位置。

imgsz直接关系到小目标检测效果。如果数据里大量目标小于32×32像素,建议把imgsz调到768甚至1024,精度会明显提升。当然显存占用和训练时间也会跟着涨,要结合GPU显存来权衡。

batch size在显存允许的情况下尽量给大一点,梯度更稳定。epoch先设100,配合patience=20做早停,连续20个epoch验证集指标不涨就自动停止,既能防止过拟合,也能节省时间。

4.3 如何从结果反推问题:指标和可视化

训练结束不代表任务结束,关键是看懂结果并反推问题。

不要只盯着最后的mAP,我习惯先看每个类别的AP、PR曲线、混淆矩阵。如果行人AP明显低于车辆,大概率是目标太小或者行人样本太少;如果车辆AP也低,重点检查是不是正午高温场景下车辆目标轮廓不清晰导致漏检。

可视化结果同样关键。把验证集里的检测结果用框架自带的预测功能画出来,一张张看,比数值暴露的问题更直接。比如同一辆车在连续几帧里框忽大忽小,说明回归还不稳定;比如某个路段行人被树木遮挡成半截,这是热成像俯拍下的典型漏检。针对这些具体问题做数据补充或增强调整,比盲目调参有效得多。

另外建议保留best.pt和last.pt两份权重。best.pt是验证集表现最好的模型,用于最终推理;last.pt是最后一轮训练的结果,用于继续训练或者排查训练异常。两者用途不同,别搞混。

5. 无人机视角检测的常见问题与排查速查表

5.1 目标太小怎么办

无人机视角下,行人目标经常只有几十像素,在全图上直接检测,模型下采样到深层特征时目标信息已经大量丢失。遇到这个问题,我一般按顺序尝试四个方法:

  • 把imgsz从640提到768或1024,让目标在输入图上占更多像素。
  • 打开多尺度训练,或者在验证/推理阶段做多尺度。
  • 将原图切成多块分别推理,再合并检测结果,也就是切片辅助推理的思路,对极小目标特别有效。
  • 改检测网络结构,加入更高分辨率的特征层,专门增强小目标特征。

这些方法可以叠加,但计算开销也会上升。真实项目里必须在召回率和实时性之间做取舍,具体怎么选取决于部署设备,不能只图精度。

5.2 类别不平衡与标注不一致怎么处理

热成像数据里行人和车辆数量经常不均衡。训练前先统计每类目标框数量,如果发现失衡明显,就在loss里给少数类加权重,或者对少数类做过采样增强。要注意的是,单纯重复少数类样本容易过拟合,更好的做法是结合Mosaic、Copy-Paste这类能改变上下文场景的增强手段,在增多目标出现频次的同时保持背景多样性。

标注不一致也很常见。比如“行人”的定义边界到底在哪,骑电动车的人算不算行人?如果之前标注时没有统一规则,训练前最好明确类别定义,必要时修正一批边界样本。否则后续评估和复现时,两个人都说自己的结果是对的,实际上用的标注基准根本不同,无从比较。

5.3 从热成像特性出发的独家技巧

最后聊几个常规教程里不会写、但对热成像检测非常有效的经验。

第一,重视温差变化。热成像检测和可见光逻辑不同,正午地面温度高,行人目标对比度急剧下降,是全天最难检测的时段;夜间地面温度低,行人反而清晰。如果数据里正午样本偏少,专门补一批这个时段的难例,模型鲁棒性会提升很多。

第二,看元数据和温度信息。很多热像仪保存图像时会附带温度矩阵或调色信息,前期做数据筛选和难例挖掘时,可以利用温度范围来快速找出极端场景的样本。不过在常规YOLO训练流程里这些信息基本用不上,适合作为辅助工具,不要主次颠倒。

第三,别把验证集指标当成部署指标。无人机真实飞行中,高度、角度、抖动、相机型号都会和训练数据有偏差,即使是看起来类似的数据,模型性能也可能下滑。所以从这套数据集得出的结论,要当作基线参考,而不是最终答案。

下面是一张问题排查速查表,我平时训练中遇到问题会先对照一遍。

问题典型现象常用排查手段
小目标漏检行人AP明显偏低增大imgsz、切片推理、增强高分辨率特征层
过拟合验证集指标持续下降或波动加大增强力度、提前早停、减少模型容量
标注错位可视化框明显偏移人工抽查修正、清洗标注文件
类别不平衡某一类AP异常低loss类别权重、Copy-Paste增强、过采样
输入通道错误训练报错或加载权重失败复制单通道为三通道

写在最后

我自己拆完这套数据,最深的感受是:像这种格式和类别一次到位的资源,真正的价值不只是省去几小时格式转换,而是它把你推到无人机热成像场景绕不开的几道坎前面,小目标、温差、类别失衡,这些问题你早遇到一次,后面回到自己的数据上就多一分把握。先用它把训练流程跑通,把评估标准建立起来,再逐步换成自采数据迭代,是效率很高的做法。如果你也正要开始做无人机视角的热成像检测,希望这些拆解能帮你少走一段弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询