无人机挂红外相机做巡检和安防这几年越来越常见,夜间搜救、火情监测、违规捕捞取证这些场景里,可见光经常帮不上忙,热成像才是真正的主力。真正做这类项目的时候你会发现,最卡脖子的不是算法结构,而是缺一份像样的红外航拍数据。可见光人车检测数据集一抓一大把,可可见光模型往红外图上一扔,指标掉得离谱——原因是红外图像本质是单通道热辐射分布图,纹理少、对比度低、图层关系也和普通照片差异很大,模型特征分布完全对不上。
所以看到这份“无人机红外视角人车数据集(含YOLOv5/v8模型)”的时候,我的第一反应是:终于来了份对口的。这份数据集以无人机红外航拍视角为主,检测目标锁定人为划定的人与车两类,并且随包给了YOLOv5和YOLOv8两套已经训练好的模型,下载完就能直接做推理复现,也能拿来当底座Micro调自己的数据。我花了两周时间把这套资源完整跑了一遍,从数据解压、标注规范检查、训练参数复现,到实际推理和误检排查都踩过一遍。这篇不聊大道理,纯粹把跑通它的实操链路和关键细节记录下来。
1. 红外视角和可见光视角的差异:为什么人车检测不能直接套用
1.1 单通道热辐射图像到底丢了哪些信息
先把一个容易忽略的基础问题讲透。普通可见光相机拍的是物体表面反射的光线,拿到的是RGB三通道彩色图,里面有颜色、纹理、边缘、阴影层次这些丰富信息。红外热成像相机接收的是物体表面温度差异,输出的是一个单通道灰度图,把热辐射强度映射成亮度值。这个过程至少丢掉了三类信息:
第一,色彩信息完全消失。可见光检测里很依赖的颜色特征(比如红色车尾灯、蓝色衣服),在红外图里全都没了,只以灰度呈现。
第二,纹理细节大幅弱化。热成像的成像原理决定它对物体表面纹路不敏感,同一温度区间的物体会融成一大片,很多在可见光里清晰可辨的边缘轮廓会变得模糊。
第三,亮度与物体材质、反射率无关,只和温度有关。这就带来一个很有意思的问题——一辆刚熄火的汽车,如果发动机温度降到和环境接近,它在红外图上就是一团和柏油路面亮度几乎一样的区域,肉眼都难分辨,更别说直接套用可见光模型去提特征了。
这也是为什么很多从可见光目标检测直接平移过来的预训练权重,在红外数据上表现差劲。模型前几层卷积已经学会了从颜色组合里找特征,放到单通道图上,那些滤波器几乎全部失效。
1.2 可见光模型迁移到红外场景会掉几个点
我自己拿YOLOv5的COCO预训练权重直接在红外航拍帧上跑过一次,不经过任何微调的情况下mAP50大概只有0.3上下,漏检非常严重。行人部分几乎只能用“随缘”形容,车相对好一些但误检也不少。
这不是YOLO本身的问题,而是源域和目标域的分布差异太大。可见光图像里,一个人和背景的区分主要靠颜色、纹理、边缘梯度组合;红外图里,一个人通常只是一个高亮的暖色团块(因为人体体温高于环境),背景反而是大面积灰暗区域。两个域的图像在像素分布上完全不同,模型也就没法直接复用。
所以要做无人机红外视角的人车检测,比较靠谱的路子就是两条:要么用足够多的红外数据从头训练,要么拿一份已经用红外数据训练好的权重做迁移学习。这份数据集附带模型的思路属于后者,相当于帮你跨过了“从零凑红外训练数据”这道坎。
2. 数据集的构成、标注规范与目录结构说明
2.1 数据来源与涵盖的飞行场景
从标题“无人机红外视角”就能看出,这份数据不是普通地面监控摄像头的画面,而是从空中往下看的视角,数据帧大多来自无人机搭载红外云台拍摄的航拍片段。
从文件内容和常见实践来看,这类数据集的构成一般包括几类:一是无人机红外视频的抽帧结果,连续画面每隔几帧取一张,保证时间连续性;二是从公开红外测试片段里整理出的代表性图像;三是少数地面手持热像仪拍摄但视角接近无人机俯视的场景图,用来补充角度多样性。
场景覆盖比较完整:白天强光下的城市道路、夜间完全黑暗的郊区小路、晨昏温度交替时段、停车场、林区空地都有涉及。飞行高度从几十米到一百多米不等,俯仰角也有变化。这点很关键,因为无人机检测遇到的主要困难之一就是“目标尺度剧烈变化”——同样一个人,在50米高度可能占据50个像素,在120米高度可能只剩20个像素,模型必须对尺度变化有足够的容忍度。
2.2 标注类别的取舍:为什么只有person和vehicle
数据集的标注只有两类:person(人)和vehicle(车)。类目不多,但对无人机红外巡检来说已经覆盖了绝大部分需求。
只保留两类的好处很明显。第一,类别间差异足够大,人是一个紧凑的高温热源形状,车是面积更大的块状热源,二者在红外特征上几乎不会混淆;第二,简化了标注标准和训练难度,尤其数据量有限的情况下,类别太多会导致单类样本太少,模型学不充分;第三,下游任务通常只需要区分“有人、有车、没人没车”,多分类反而增加误报概率。
标注格式用的是YOLO标准的txt格式,每行依次是:类别id、目标中心点x坐标(归一化)、目标中心点y坐标(归一化)、目标宽度w(归一化)、目标高度h(归一化)。所有坐标都除以图像宽高做了归一化,直接喂给YOLO训练不用额外转换。
有一点需要留意:红外图像里“车”的边界并不总是清晰。车辆在熄火后引擎盖和轮胎附近温度偏高,车身中间则温度偏低,整个车的热轮廓可能出现断裂。标注时通常以整车的完整外接框为准,中间即使有“冷区”也不另拆目标。如果标注者按热区域分别框出几个框,模型训练时就会出现一个车多个框的混乱问题,推理阶段NMS很容易把重叠的检测框滤成错漏。拿到数据后建议先抽检一部分标注,重点确认这类情况有没有处理干净。
2.3 文件结构与自带模型的位置
数据包解压后目录结构通常是这样的:
dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── yoloV5/ │ ├── weights/ │ │ ├── best.pt │ │ └── last.pt │ ├── results.png │ └── opt.yaml └── yoloV8/ ├── weights/ │ ├── best.pt │ └── last.pt ├── results.png └── args.yamlimages里是红外图像原图,labels里是每张图对应的标注txt文件,文件名和图像文件名一一对应。yoloV5和yoloV8目录下则是两套已经训练好的模型权重。这块我建议拿到后先做一次完整性检查,每张训练图对应的txt都要存在,且txt里的类别id不能超出0和1两个值。之前我遇到过有些数据集标注文件缺行或者类别id写错,训练时Loss直接Nan,查了半天才定位到是标注问题。
3. 红外数据预处理与增强:和可见光完全不同的玩法
3.1 红外图像特有的噪声和对比度问题
拿到红外图和普通照片有一个很直观的区别:噪点特别明显。热像仪成像时受探测器温度、环境杂散辐射影响,画面上常出现两种典型噪声——随机颗粒噪点和局部条纹状噪点。航拍场景里还会因为地面热辐射不均出现大面积亮斑,比如白天被太阳晒热的铁皮房顶在红外图里几乎变成一片白色,人物和车辆反而暗到看不清。
处理这种问题,我一般不会在训练集上直接做强烈的滤波,而是分两步走。第一步,训练前把图像统一缩放到模型输入尺寸,缩放的插值算法建议用普通双线性插值,别用带锐化的插值方法,否则容易把噪点边缘也放大成特征。第二步,推理部署时在预处理环节加入对比度增强,最常用的是CLAHE(限制对比度自适应直方图均衡),它对红外图的效果远比全局直方图均衡好,因为航拍红外图经常是“整体偏暗+局部高亮”,全局拉伸会把暗部噪点全部抬起来,而CLAHE是按局部区域做对比度均衡,既能提亮人物区域又不会让噪点爆发。
不过要特别提醒:如果模型训练时用的是原始红外灰度图,那么推理时就直接用相同流程处理,不要临时新增CLAHE。训练和推理的预处理不一致,结果往往比不增强还要差。这也是很多同学复现模型时指标一直上不去的隐形原因。
3.2 对YOLO增强策略的调整:关闭无效项,增加有效项
用YOLOv5或YOLOv8训练时,默认开启的增强策略包括HSV色域变换、随机翻转、Mosaic拼接、MixUp混合等。但到了红外单通道图像上,这些策略要重新审视一遍。
HSV色域变换在红外图上基本等于无效操作,因为只有一个通道,最多就是亮度和对比度微微变化,对增加样本多样性帮助非常有限。如果你的训练代码里默认开启hsv_h、hsv_s、hsv_v,建议把幅度都调低或者直接关闭,省下一点计算资源。
随机翻转可以保留。无人机俯视视角下,左右翻转不会改变“人”或“车”的语义,而且能有效增加样本量。但上下翻转要谨慎,因为无人机红外图通常有明确的地面方向,把图竖直翻转后,房屋阴影和烈日亮斑的分布会变得异常,模型容易学到错误的位置先验。
Mosaic(四图拼接)是我在红外场景里比较推荐的增强方式,因为单张红外图目标数量往往不多,尤其夜间场景一帧可能只有一两个人,Mosaic把四张图拼在一起,让模型在一个训练步里看到更多目标,对小样本类别尤其有效。MixUp可以保留但不要开太大,默认0.1左右就好。
另外可以手动增加两项红外场景特有的增强:随机亮度扰动和随机对比度扰动。因为热像仪在不同环境温度下的自动增益不同,同一场景白天和夜间成像亮度差异很大,模型必须对这些变化鲁棒。这个没有直接超参对应,可以在数据加载环节自定义实现,建议亮度扰动范围设在±30、对比度扰动设在0.8到1.2之间。
3.3 训练集划分的隐藏陷阱:同源视频帧的数据泄漏
这个问题一定要单独拿出来说,它是整个复现过程中最容易导致指标虚高、实战拉垮的元凶。
很多航拍数据集是从一段段连续视频抽帧得到的,如果划分训练集和验证集时按“随机抽取每一帧”的方式分,那么同一段视频的前后帧极有可能一部分进了训练集、一部分进了验证集。这些帧之间非常相似,模型相当于提前见过了验证集的“邻居帧”,验证集评估出来的mAP会异常好看,但一到部署现场表现就没那么好了。
正确做法是按视频片段划分。拿到有视频来源信息的数据时,把所有来自同一条视频的帧放进同一个集合,再做训练集/验证集切分。这份数据集如果划分已经固定了,建议自己重新洗一次数据,按文件名前缀或视频序号分组后再划分。我重新划分后mAP比原来降了大约5个百分点,但这个指标才是真实可信的。
4. YOLOv5 vs YOLOv8:两套模型的训练配置与参数调整
4.1 怎么根据显存选型号和输入分辨率
两套模型跑同一份数据,结论会有明显差异。我两套都实际跑过,如果显卡显存只有8G左右,建议优先用YOLOv5s或者YOLOv8s,输入分辨率设在640即可。如果显存有12G以上,可以尝试YOLOv8m配1280输入分辨率,小目标检测能力会有明显提升。
为什么输入分辨率对无人机红外检测影响这么大?因为航拍视角下人车目标的尺寸普遍偏小。640分辨率下,一个高度100米的行人往往只占20到30个像素,正好落在小目标检测的困难区间。把输入分辨率提到1280,等于把目标的像素面积放大了4倍,检测头能获取的特征信息量完全不同。代价是训练和推理耗时增加,部署时帧率下降。具体取舍要看你的实际飞行高度,如果巡航高度在80米以上,我倾向于直接上1280;如果只有二三十米,640完全够用。
还有一个很容易踩的坑:用YOLOv5训练时默认打开的autoanchor=True会根据你的数据集重新聚类anchor,这一步建议保留。但要注意,如果标注框尺寸分布跨度太大(既有憋在画面角落的小目标,也有占据半屏的大目标),重新聚类的结果可能会过分偏向大目标,导致小目标漏检。此时可以手动看一下聚类结果,必要时把anchor数量从默认的9个加到12个,或者调整cls_pi等参数,让anchor分布更均匀一点。
4.2 训练超参数:从一组能用的配置说起
下面这份是实测跑通的基础配置,环境是单卡(显存16G),数据量大约几千帧。你完全可以直接照抄:
# 基础训练配置 task: detect mode: train model: yolov8s.yaml # 或 yolov5s.yaml data: infrared_person_vehicle.yaml epochs: 200 patience: 30 # 早停,验证集连续30轮不提升就停 batch: 16 imgsz: 640 # 显存充足可试1280 save_period: 10 device: 0 workers: 8 project: runs/train_infrared name: exp1 optimizer: SGD # v5默认SGD;v8可用AdamW lr0: 0.01 # v8默认0.01,v5默认0.01 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1 box: 7.5 # 默认 cls: 0.5 dfl: 1.5 # v8默认 hsv_h: 0.0 # 红外单通道,关闭或调极低 hsv_s: 0.0 hsv_v: 0.1 # 亮度扰动保留一点点 degrees: 0.0 # 航拍图不建议旋转 translate: 0.1 scale: 0.5 fliplr: 0.5 mosaic: 1.0 mixup: 0.1几个参数的选择逻辑说一下:
- optimizer:AdamW收敛速度更快,适合数据量小的情况;SGD最终精度通常更高但需要更多轮数。数据在几千帧量级时我推荐用SGD,因为可以配合cosine学习率衰减,后期精调更稳。
- lr0=0.01是YOLO系默认值,数据量小的时候不要上来就调大,很容易震荡。如果Loss前10轮完全不动,优先检查标注而不是调学习率。
- patience=30配合epochs=200,实际训练基本在80到120轮之间就早停了,很少真的跑满200。早停不丢人,模型已经收敛还继续跑反而过拟合。
- weight_decay=0.0005是常规值,如果你的数据集较小时,可以降到0.0003左右,减少正则化对少量样本的压制。
4.3 训练过程要盯哪些指标
训练时不要只盯着Loss曲线,至少同时看这些指标:
mAP50和mAP50-95的差值很说明问题。如果mAP50已经到0.82而mAP50-95只有0.35,说明模型对目标的定位精度不够。目标框的不确定性大,主要原因是红外图边缘模糊导致回归头难以精确定位边界。这种情况优先考虑提高输入分辨率,或者增加标注框质量——检查一下是否存在大量“标注框偏大”的情况,框比目标实际轮廓大一圈的标注会压制IoU精度。
P(精确率)和R(召回率)的balance要根据场景调整。做无人机巡检一般更看重召回率,漏掉一个目标可能比误报一个代价高得多。可以适当把置信度阈值调低到0.2再结合后续跟踪算法滤除误报,而不是让模型强行把置信度拉到0.5。
训练结束后看一下confusion_matrix.png,如果person和vehicle之间存在明显互检(人框经常框住半辆车,或者车的检测框框住一群人),优先怀疑Mosaic增强带来的大目标截断问题,可以适当降低mosaic开启概率,或者在Mosaic时增加对完整框的保留策略。
5. 实际部署与推理中的误检漏检排查
5.1 先跑通自带模型的推理流程
拿到模型后的第一步,建议先直接用附带的best.pt跑一遍推理,把所有结果可视化出来逐个检查,而不是只看指标。
YOLOv5的推理命令:
python detect.py --weights yoloV5/weights/best.pt --source dataset/images/test --img 640 --conf-thres 0.25 --iou-thres 0.45 --save-txtYOLOv8的推理命令:
yolo predict model=yoloV8/weights/best.pt source=dataset/images/test imgsz=640 conf=0.25跑完之后把runs/detect/exp下的可视化结果翻一遍。重点看两类:一类是标注了但模型没检出来的(漏检),另一类是模型检了但没有对应标注的(误检)。逐个截图记录下来,它们会告诉你模型的短板到底在哪。
我这次跑下来,典型的漏检场景是夜间低对比度下的人体半蹲姿态,人体和地面温差小于1.5度时几乎融进背景;典型的误检场景是白天被太阳晒热的圆形井盖、铁皮屋顶边缘、大型工程车辆的排气管热区。这些不是模型没训练好,而是红外成像原理本身带来的物理限制,需要靠算法策略去补。
5.2 无人机平台上的部署要点
如果你要把模型部署到无人机机载平台(比如某些带GPU的机载电脑、手机SoC或边缘计算盒子),有两点建议:
第一,导出格式优先选TensorRT或ONNX。YOLOv5和YOLOv8都支持一键导出ONNX,再用TensorRT转成engine格式。INT8量化对红外小目标很不友好,精度掉得厉害,建议至少用FP16。如果必须INT8,务必要用红外验证集做校准集,不能用COCO通用校准集。
第二,稠密小目标场景要考虑切图推理。一张4K红外航拍图直接全图送进模型,小目标经过多次下采样后特征可能被压没了,漏检增多。可以先把原图切成四块或九块重叠的patch分别推理,再用NMS合并结果。推理耗时增加但召回率提升明显。无人机巡航场景如果不是实时要求,切图是性价比很高的操作。
5.3 置信度阈值和NMS阈值怎么调
这组参数看着简单,实际影响很大。自带模型默认阈值通常是conf=0.25、iou=0.45。但这个组合在红外场景下我建议分开调:
置信度阈值,无人机巡检建议设0.2到0.3之间。红外目标本身对比度低于可见光,模型输出的置信度普遍偏低,正常目标可能只有0.3到0.4,如果和可见光场景一样设0.5,大量真实目标会被滤掉。宁可多放几个候选框进来,后续用跟踪算法把连续帧的误报滤掉。
NMS阈值,建议从0.45提高到0.5甚至0.6。红外目标边缘不清,同一个目标上模型可能产生两个重叠度不高的候选框(一个框住躯干、一个框住四肢),NMS阈值太低会把其中一个误删。对于密集人群场景,NMS阈值太高又容易把不同目标的框合并,所以这个参数需要在实测后折中选择。
6. 我复现时踩过的坑和后续扩展方向
6.1 红外灰度图转RGB三通道再训练的常见误区
很多同学拿到数据集后,看到模型输入要三通道,就把红外灰度图用cv2.cvtColor转成三通道,或者直接np.stack三份。其实这是个误区。
YOLO系列模型内部对输入的通道数没有硬性限制为三通道,数据加载时只要YAML里对应的ch参数改了,单通道图也能正常训练。转成三通道并不会给模型带来更多特征信息,只是把同样的灰度值复制三遍,白白增加计算量。更重要的是,如果你在训练时强行转了RGB,推理时就必须做完全相同的转换,否则检测结果会漂移。这种“图省事”的转换常常是训练和推理指标不一致的根源。
正确做法是:训练和推理保持同一套图像读取流程,要么都用灰度模式读图,要么都用灰度图转三通道后喂给模型。我是直接按灰度模式读图训练,推理时也用相同预处理,效果没有任何损失。
6.2 标注边界模糊怎么处理
红外场景下标注的质量直接决定了模型的上限。这块有几个经验:
不要在夜间低对比度图像上做粗糙的“凭感觉框”。先把图像做CLAHE增强再看,能显著提高标注边界准确性。对车这种目标,以热辐射轮廓的最外沿为框边界;对人则以头部和躯干的热区域为准,不要把四肢产生的微弱热辐射都包进去,否则框会过大。数据集原始标注整体质量尚可,但仍建议抽20%左右的图复查一遍,重点检查高度较高的小目标框是否偏移,因为这类框在缩放后误差会被放大。
6.3 从这份数据集出发还能做哪些扩展
这份数据集和模型可以当成一个可靠的“红外检测底座”,往多个方向扩展都合适。
做实时部署。模型已经过训练,直接匹配机载推理平台,用TensorRT FP16导出后跑实时无人机巡检,再接入一个简单的跟踪器(如ByteTrack)做多目标跟踪,就可以统计画面里人流和车流的轨迹。
做双光融合。很多无人机同时挂载可见光和红外相机。把这份红外模型输出的检测框投影到可见光图像上做标签,再用可见光模型做二次精修,能大幅提高检测置信度和分类准确性。尤其是白天场景,可见光的色彩信息可以弥补红外图对人和车类别判断的不足。
做小目标专项优化。如果实际巡航高度偏高,小目标漏检还是比较明显,可以尝试给YOLO加P2检测层(v5/v8都有对应修改方案),或者在数据层面用SAHI切图推理框架。这两种方法我都试过,SAHI在工程部署上更省事,P2层训练更彻底但显存占用增加。
最后分享一个实际操作中的体会:红外检测和可见光检测最不一样的地方,在于很多“视觉上很明显”的目标在红外图里可能完全不可见,反过来也是。不要指望模型能检测出热像仪都看不见的目标,做好对比度增强和合理的阈值调节,把成像质量吃满,往往比折腾网络结构更有效。这套数据集的价值在于帮你把“红外数据准备+训练+附带模型”这些最费时间的环节一次搞定,剩下的就要靠你在自己的场景里反复调试这些细节了。