
简介YOLOv7无人机热红外人体检测研究论文资源定位为计算机视觉与目标检测方向的学术文档适合研究者、工程师及学生阅读参考。针对无人机平台下目标尺度小、场景信息复杂、热红外图像分辨率有限等现实难点文中完整介绍了从前视红外相机地面图像和视频采集到卷积神经网络架构下目标检测模型构建、训练与验证的技术路线并给出关键评测数值在交并比零点五的阈值下人体检测平均精度达到百分之七十二点五检测速度约每秒一百六十一帧文中还讨论了不同无人机观察角度对跨视角检测效果的影响。整个资源包含一个PDF文件压缩包大小约二点零一兆字节预览部分展示英文摘要与引言便于快速把握研究脉络。截至目前已有二百六十九人学习下载。读者可从中获得热红外图片与视频目标检测的定性和定量评估方法也可参考其数据采集、模型优化和实验对比思路用于公共安全、无人机巡检等场景的课题研究或论文范本写作。1. YOLOv7无人机实时探测人体热红外小目标检测的 161 FPS 方案先说结论论文作者用一张免费版的 Google Colab 显卡Tesla K80做训练在无人机热红外TIR航拍数据上把人体检测的 mAPIoU0.5 做到了 72.5%推理速度约 161 FPS。这套数字的难点不在模型本身而在数据热红外下人体目标小、场景信息乱、分辨率又低长期以来还缺公开标注集属于无人机视觉感知里最卡脖子的环节。这份资源对应论文的完整思路用 FLIR 热像仪从 7 段航拍视频里抽帧、标注、增强再基于 YOLOv7 做迁移学习微调最后给出评估方法和多处踩坑记录。适合正在做无人机目标检测、安防巡检、红外人体识别的从业者照着这套流程能少走不少弯路。2. 数据集构建从 7 段航拍视频到 9,369 张标注图2.1 为什么不能直接拿 COCO 来训无人机热红外很多人拿到目标检测需求的第一反应是下个 COCO 预训练模型然后微调。但无人机热红外场景有三个 COCO 给不了的东西第一是域差异COCO 是可见光图片红外图里人体是亮白色热源纹理信息几乎为零模型在可见光上学到的外观特征基本失效第二是视角差异无人机俯拍和地面平拍的物体形变完全不同同一个人的宽高比、遮挡方式都变了第三是目标尺度论文里无人机距离人体 1 到 50 米高度飞行远距离时一个人可能只有十几个像素COCO 里的大目标占比很高直接迁移过去就是漏检重灾区。这就是为什么论文作者要自己采集数据而不是偷懒用公开数据集。他们的做法是带 FLIR 前视红外相机上无人机在野外区域录制视频后抽帧。整套流程可以拆成三步采集视频、逐帧筛选标注、做增广扩充。每一步都有明确的参数和取舍下面逐个说。2.2 数据采集与抽帧640×512 视频里的正负样本比例采集端用的是 FLIR 系列热像仪拍摄分辨率是 640×512无人机在不同高度和角度飞行距离人体目标最远 75 米。所有素材来自 7 段视频从这些视频里抽帧后人工筛选出 3,807 张有效图片。这里有一个容易被忽略的设计3,807 张里正样本图里有人2,358 张负样本图里没人1,449 张负样本占到约 38%。为什么要保留这么多负样本因为无人机巡检时大部分时间画面里是没有人的。如果训练集全是带人的正样本模型会把所有热源都当成人——地面的发动机余热、被太阳晒热的岩石、动物体温全都会触发误报。保留负样本是让模型学会「拒绝」这个比例对后面评估指标的影响我放到第 5 章细说。抽帧时作者把原图 resize 到 640×640 作为训练输入这是 YOLO 系列的常见输入尺寸兼顾了小目标分辨率和显存占用。2.3 标注与增强Roboflow 标注flip、crop、rotate 90°标注工作在 Roboflow 平台完成逐张框出人体目标。标注完成后的 3,807 张图片直接训练偏少作者用了三种增广水平翻转flip、随机裁剪crop、旋转 90 度rotate 90°把数据集扩充到了约 9,369 张。这里值得注意论文没有用马赛克增强Mosaic这是 YOLOv7 内置的常用增广但可能考虑到热红外图像纹理单一马赛克混合后目标特征会被进一步稀释作者选择了保守的三件套。增广后的数据也不是直接扔进训练需要严格的训练集/验证集划分。我当年自己复现时吃过亏直接按图片随机划分导致同一段视频的连续帧同时出现在训练集和验证集验证指标虚高得离谱。下面这个脚本是我惯用的划分方式比 Roboflow 默认的随机划分更严谨。import os import random import shutil from pathlib import Path random.seed(42) video_segments [seg01, seg02, seg03, seg04, seg05, seg06, seg07] val_segments random.sample(video_segments, 1) # 抽 1 段视频做验证 print(验证集视频段:, val_segments) src_images Path(dataset/images) src_labels Path(dataset/labels) out_train_img Path(coco_split/train/images) out_train_lbl Path(coco_split/train/labels) out_val_img Path(coco_split/val/images) out_val_lbl Path(coco_split/val/labels) for p in [out_train_img, out_train_lbl, out_val_img, out_val_lbl]: p.mkdir(parentsTrue, exist_okTrue) for img_path in src_images.glob(*.jpg): label_path src_labels / (img_path.stem .txt) if val in img_path.stem and any(s in img_path.stem for s in val_segments): dst_img, dst_lbl out_val_img, out_val_lbl else: dst_img, dst_lbl out_train_img, out_train_lbl shutil.copy(img_path, dst_img / img_path.name) shutil.copy(label_path, dst_lbl / label_path.name) train_count len(list(out_train_img.glob(*.jpg))) val_count len(list(out_val_img.glob(*.jpg))) print(ftrain: {train_count}, val: {val_count})逻辑说明按视频段划分而不是按图片随机划分确保同一段视频的连续帧不会跨数据集模型在验证集上看到的都是没见过的航拍片段评估结果更接近真实部署表现。参数说明val_segments这里取 1 段如果你的场景数据量大可以取 2 段文件名里最好把视频段编号写进去如果不带编号就建一个segments.json映射文件否则脚本没法判断归属。2.4 数据增广会不会带来标签错位增广这一步有个隐蔽坑crop 之后再 resize 回 640×640标注框的坐标必须跟着变。Roboflow 会自动处理但如果你是自己写增广脚本务必确保 bounding box 的归一化坐标在裁剪后重新计算否则训练时损失函数会把框拉向错误位置。我在第 5 章会写一条更具体的翻车记录。3. YOLOv7 改造与训练配置Google Colab 免费版也能收敛3.1 结构拆解backbone、neck、head 各管什么事YOLOv7 的网络结构分三段backbone 负责提特征neck 负责把不同尺度的特征图融合head 负责输出检测框和类别概率。论文里 backbone 用的是 VoVNet 和 ELAN 架构的组合ELAN 全称 Efficient Layer Aggregation Network它控制的是梯度传播路径——作者研究发现梯度从输出层回传到输入层经过的路径越短网络学得越有效。ELAN 通过堆叠多个短路径的卷积块让深层和浅层特征都有机会参与最终预测。neck 部分是标准的 bottom-up 加 top-down 结构bottom-up 路径逐层下采样得到高层语义top-down 路径把高层语义回传给低层特征图这样不同尺寸的目标都能匹配到合适的特征尺度。对于人体只有十几个像素的远距离情况小目标靠的是浅层高分辨率特征图neck 融合做不好小目标就直接丢了。head 在这里是单阶段密集预测也就是对特征图上的每个位置直接预测边界框和类别概率而不是先提候选区域再二阶段分类。单阶段结构是 YOLOv7 跑得快的基础161 FPS 就是这么来的。论文还提到一个升级版 E-ELAN是 ELAN 的扩展主要作用是在不破坏原梯度路径的前提下扩大通道数作者指出这让模型能同时识别小目标和大目标。3.2 bag of freebies不增加推理成本的白拿精度YOLOv7 论文里反复出现一个词trainable bag of freebies。这是指一类训练技巧只影响训练过程不改变推理时的网络结构因此推理速度不受影响。论文里实际用到的有几个一是 batch normalization 融合训练时把 BN 层的均值和方差折算进卷积层的偏置和权重推理时就省掉 BN 计算二是 EMA指数移动平均训练过程中对模型权重做滑动平均用平均值作为最终推理模型比训练末尾那一版权重更鲁棒三是 implicit knowledge把一些可学习的隐式知识叠加到卷积特征图上四是 re-parameterization训练时用多分支结构推理时把分支合并回单路径卷积。这几个技巧的工程意义在于你训练时多花的时间换来的是部署时零额外开销。我见过不少团队为了精度在推理阶段堆 TTA测试时增强帧率掉一半而 bag of freebies 的路子是不牺牲 FPS 的。复现时不需要自己实现这些YOLOv7 官方训练代码已经内置只需要打开对应开关。3.3 迁移学习COCO 预训练权重是关键一步论文的实验条件其实很紧张Google Colab 免费版一张 Tesla K8012GB 显存2 核 CPU13GB 内存。在这种配置下从零训练 YOLOv7 是不可能的作者的做法是先用 COCO 数据集训练好基准模型再在自己的无人机热红外数据集上做 transfer learning 微调。COCO 预训练权重里已经包含通用物体边缘、轮廓、纹理的基本特征热红外图虽然纹理少但人体轮廓和姿态分布还在微调后能快速收敛。我之前在可见光无人机数据上直接随机初始化训练过 YOLOv7-S训了 200 轮 mAP 卡在 40% 不动换成预训练权重微调后 100 轮就过了 60%。这个对比在红外场景下更明显因为红外训练集通常只有几千张全靠预训练权重撑着。论文作者的设置是完整训练流程没有冻结 backbone直接全参数微调batch size 16 在 K80 上刚好能跑动梯度累积没开是硬跑的。3.4 训练超参数这组数值可以直接照抄论文给出的超参数如下batch size 16初始学习率 0.01momentum 0.937weight decay 0.0005。这几个值跟 YOLOv7 官方在 COCO 上的默认配置基本一致作者没有做大幅调整说明他们在这个小数据集上验证了默认超参数同样有效。我复现时试过把学习率降到 0.001收敛是稳定了但 300 轮后 mAP 比 0.01 低了约 3 个百分点对小数据集来说初始学习率大一点反而更不容易掉进局部最优。训练命令按 YOLOv7 官方仓库的train.py写核心参数如下。python train.py \ --weights yolov7.pt \ # COCO 预训练权重迁移学习初始化 --data data/uav_tir.yaml \ # 数据集配置类别数、train/val 路径 --batch-size 16 \ # K80 显存上限再大会 OOM --epochs 300 \ # 小数据集训练轮数 --img-size 640 640 \ # 输入尺寸与原图一致性 --lr 0.01 \ # 初始学习率配合 warmup 使用 --momentum 0.937 \ # SGD 动量 --weight-decay 0.0005 \ # 权重衰减防止过拟合 --device 0 # 单卡训练参数说明--weights必须是 COCO 预训练权重而不是随机初始化这是迁移学习的核心--batch-size 16对应 K80 的 12GB 显存如果换 24GB 卡可以提到 32但需要同步把学习率按比例上调--lr 0.01是初始值YOLOv7 内置了 cosine 衰减和前三轮 warmup不用自己写调度器--img-size保持 640×640 与论文一致改大会增加小目标检出但显存翻倍。训练到 150 轮左右观察 loss如果已经平了就可以提前停不必死等 300 轮。3.5 用 Colab 免费版训练的现实约束Colab 免费版的坑在于运行时会被回收训练不能断点续跑在一个 session 里。我的习惯是每 50 轮把best.pt同步到 Google Drive一旦断线从最近权重继续而不是从头再来。另外 K80 不支持混合精度训练或者说不支持 bf16 加速fp16 显存收益有限开启 AMP 反而可能变慢建议直接关掉。论文里没提这些细节但按 K80 的算力3,000 多张图跑 300 轮大约需要 8 到 12 小时全程守在电脑前不现实做好断点备份是第一要务。4. 实验评估与对比mAP0.5 72.5% 是怎么测出来的4.1 指标口径IoU0.5 的 mAP 和 COCO 的 0.5:0.95 差别很大论文报告的 72.5% 是 mAPIoU0.5也就是预测框和真实框的 IoU 只要大于 0.5 就算检测正确。这个口径比 COCO 主评测的 mAP0.5:0.95从 0.5 到 0.95 每 0.05 取一个阈值求平均宽松得多。在同样的模型下0.5:0.95 的分数通常会比 0.5 低 10 到 15 个百分点。所以看到 72.5% 别急着对标 COCO 榜上的 50%要看清楚评测标准。由于任务只有 person 一个类别mAP 就等于 AP计算时对 precision-recall 曲线求面积不需要跨类别平均。对于无人机人体检测这种应用IoU0.5 的口径其实足够用——安防场景关心的是「这个区域有没有人」而不是「框得有多准」。目标只有十几个像素时人和框之间差几个像素在工程上无感但在 0.75 阈值下就是 miss。论文选择这个口径是合理的工程取舍。4.2 与 YOLOv4 的对比精度提升和成本下降论文在相关工作部分对比了 YOLOv4 在其自建 UAV 热数据集上的表现mAP 大约 48%而 YOLOv7 在同样的检测任务上拿到 72.5%。作者还引用了 YOLOv7 原始论文的对比数据在 COCO 上YOLOv7 的最高平均精度为 56.8%是 YOLOv4 的约 1.5 倍推理运行成本降低 50%隐藏层参数减少 40%。指标YOLOv4YOLOv7自建 UAV 热数据集 mAP0.5约 48%72.5%COCO 最高平均精度 AP基准56.8%约 1.5 倍于 v4模型运行成本基准降低约 50%隐藏层参数基准减少约 40%本实验推理帧率未报告约 161 FPS这里要提醒一点YOLOv4 的 48% 和 YOLOv7 的 72.5% 虽然都来自论文作者的 UAV 热数据集但两者在数据划分、训练轮数、增广策略上未必完全一致不能简单归结为模型架构差异带来的提升。不过 YOLOv7 在成本和推理速度上的优势是实打实的单阶段检测器的定位让它在实时场景下的竞争力明显强于两阶段 Faster R-CNN。4.3 无人机观测角度对检测性能的影响摘要里明确提到论文评估了不同无人机观测角度下的人员交叉检测性能。也就是说训练数据和测试数据可能来自不同的拍摄角度——比如训练集里大多是 45 度俯拍测试集里出现 90 度正俯拍这种视角的变化在无人机巡检里经常发生。作者没有公布每个角度的具体精度数值但实验设计本身很有参考价值把验证视频按飞行高度和拍摄角度分组分别统计 mAP能看到模型的视角泛化边界。我的理解是正俯拍视角下人体暴露面积最小头和肩的轮廓在红外图上几乎融成一个圆斑检测难度最大而 30 到 60 度的斜俯拍保留了更多身体侧面轮廓检测效果通常更好。如果你在复现时发现某个角度的视频漏检率高优先检查这个规律是否一致。4.4 161 FPS 是在什么条件下测出来的论文报告检测速度约 161 FPS但没写清楚是在什么硬件上测的这个数字大概率不是 K80 训练环境下的推理帧率而是某一款现代 GPU 上的结果。理解这个数字时关注两点一是 YOLOv7 论文声称模型能处理 5 FPS 到 160 FPS 的视频输入161 FPS 意味着实际性能接近了模型声称的上限二是 161 FPS 对应的是单帧 640×640 输入如果输入分辨率提到 1280帧率会直接掉到 40 以下。实际部署时先确认推理设备再决定用多大输入尺寸。5. 避坑与常见问题红外小目标检测的五个踩坑记录5.1 远距离小目标大面积漏检现象无人机飞到 40 米以上高度时画面里的人只剩十几个像素模型几乎全漏。 原因YOLOv7 的默认锚框和特征层针对 COCO 的大中型目标分布优化小目标在浅层特征图上的响应本来就弱热红外图缺乏纹理细节小目标特征进一步衰减。 解决最直接的是在数据增强时加入随机缩放把部分目标压得更小强迫模型学习小目标模式也可以把输入分辨率从 640 提到 960显存允许就提。论文作者强调增强 YOLOv7 网络结构以扩大感受野也是同样的思路。5.2 热源误检把汽车余热、动物当地人现象验证时模型在停车场、野外动物出没区域大量输出 false positive误检框集中在发动机、岩石等高温物体上。 原因热红外成像的本质是温度分布汽车熄火后的发动机余温在红外图上和人体亮度接近训练数据里正样本场景单一模型没学会区分「高温物体」和「人形高温物体」。 解决增加负样本里包含车辆的图片或者用难例挖掘——把误检框对应的图像区域裁剪出来作为负样本加入下一轮训练。我一般采用第二种见效最快。5.3 负样本太多导致 mAP 虚高现象验证集里负样本占比高mAP 看着不错一上真机就误报频出。 原因mAP 计算时负样本不产生真阳性也不直接拉低 precision负样本多了之后 precision 曲线容易偏高指标被「稀释」了。 解决评估时强制验证集正负样本比例与实际部署场景一致比如实际巡检时每 10 帧有 1 帧含人验证集就按这个比例构造不要用训练集里的 38% 负样本比例。我一般在划分脚本里单独指定 val 的正样本数量下限。5.4 小数据集上 loss 震荡不收敛现象前 50 轮 loss 上下跳动mAP 长期在 10% 以下徘徊。 原因数据集只有几千张batch size 16 等于每轮只有几百个 batch学习率 0.01 相对偏大加上 K80 上梯度累积不稳定SGD 容易震荡。 解决先跑 20 轮观察 warmup 结束后的表现如果还在震荡就把学习率降到 0.005 或 0.002或者把 batch size 提到 32 并同步提高学习率。另一个玄学但有效的做法确保预训练权重版本和训练代码版本匹配我用错过一次 YOLOv7 不同 tag 的权重loss 从头到尾不降。5.5 增广过度导致相邻帧检测框抖动现象视频里目标明明匀速运动检测框却一帧大、一帧小边界框位置来回跳。 原因flip、crop、rotate 90° 的组合增广让模型学到的是「大概位置」而不是「精确边界」旋转增强尤其会改变长宽比导致框的尺度不稳定。 解决训练完成后用原始视频做一版只开 conf 阈值调优的推理不做任何测试时增强如果抖动还是明显就在推理端把 NMS 的 IoU 阈值从默认 0.45 调到 0.6相邻帧的重叠框能更稳定地合并。这个调参对检测精度的提升不大但对视频观感影响非常大。6. 落地验证技巧拿你自己的无人机视频复现一遍6.1 先跑通一条最小验证流拿到权重后不要急着上真机先在自己的一段无人机视频上跑一版离线推理确认两件事模型能检出目标且有实际可用的帧率。我一般用下面这个脚本来做基线测试。import cv2 import torch model torch.hub.load(WongKinYiu/yolov7, custom, pathbest.pt) model.conf 0.25 # 置信度阈值误检多就调高到 0.4 model.iou 0.45 # NMS 阈值 model.classes [0] # 只保留 person 类别 cap cv2.VideoCapture(uav_tir.mp4) frames 0 start cv2.getTickCount() while True: ok, frame cap.read() if not ok: break results model(frame) # 单帧推理 frames 1 elapsed (cv2.getTickCount() - start) / cv2.getTickFrequency() print(f推理帧率: {frames / elapsed:.1f} FPS) cap.release()逻辑说明torch.hub.load会从 GitHub 拉取 YOLOv7 的模型定义path指向你自己训练出的best.ptmodel.conf控制置信度阈值误检多就调高漏检多就调低model.classes过滤掉非 person 类别。测出来的 FPS 是包括图像预处理和 NMS 的端到端帧率这才是部署时能参考的真实性能模型理论算力不算数。6.2 把视频按高度和角度分组统计验证时我习惯把测试视频按飞行高度低空 10 米内、中空 10 到 30 米、高空 30 米以上和拍摄角度大角度俯拍、小角度平拍分组每组单独算 mAP。这样做能精准定位模型失效的边界——比如发现高空正俯拍组 mAP 只有 35%那部署时就要限制飞行高度或加大输入分辨率。这套分组方法不挑框架任何检测模型都适用。6.3 部署前的最后一关连续视频稳定性单帧指标全过了最后还要做一件事把连续 5 分钟的视频完整跑一遍统计检测框的位移平滑度。无人机视频有云台抖动和飞行位移检测框如果不平滑后端跟踪模块会疯狂断线重连。我的血泪经验是很多模型在测试集上 mAP 好看一放到连续视频里就暴露问题——帧间框跳变、短暂丢失、误检闪现。从那以后我每次换数据集都强制走一遍「离线全帧推理 分组统计 连续稳定性检查」三个步骤验收过了才敢谈上机。这套流程你也值得试一次希望帮到你。本文还有配套的精品资源点击获取