最近半年,我接连做了两个红外相关的项目,一个是夜间无人机巡检,另一个是工业设备热成像故障诊断。共同的痛点就是:目标又小、对比度又低,模型动不动就“视而不见”。
网上很多教程讲得天花乱坠,但真到自己数据集上跑,mAP还是惨不忍睹。今天这篇,不玩虚的,就把我踩过的坑和验证有效的改进方法,手把手分享出来。核心思路就三点:针对性数据增强、锚框重校准、浅层特征强化。实测下来,验证集mAP@0.5从0.61直接干到了0.89。
一、前期准备:环境与数据
1. 环境搭建 别整那些花里胡哨的,稳定压倒一切。我的环境配置如下:
- Python 3.9
- PyTorch 1.13 + CUDA 11.7
- Ultralytics YOLOv8 (pip install ultralytics)
2. 数据集特点 我们的红外数据集有两大难点:
- 小目标:大部分目标在图像中仅占10×10到20×20像素。
- 低对比度:目标与背景温差小,边界模糊,信噪比低。
拿到手的数据是VOC格式(XML标注),需要先转换成YOLO要求的TXT格式。这里有个小技巧,转换脚本里可以顺便统计一下目标尺寸分布,为后续锚框调整做准备。
# 核心转换逻辑示例
def convert_voc_to_yolo(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0 – 1
y = (box[2] + box[3]) / 2.0 – 1
w = box[1] – box[0]
h = box[3] – box[2]
return (x * dw, y * dh, w * dw, h * dh)
二、分步实操:三大核心改进
1. 第一招:针对性数据增强,让小目标“显形”
YOLOv8默认的增强策略(如Mosaic、HSV调整)对普通RGB图很有效,但对红外图有点“水土不服”。我们需要更精细的控制。
我在dataset.yaml里自定义了增强策略,重点加强了以下几点:
- CLAHE(限制对比度自适应直方图均衡化):这是关键!能有效提升局部对比度,让模糊的小目标轮廓变得清晰。
- 高斯噪声注入:模拟红外传感器的真实噪声,提升模型鲁棒性。
- 谨慎使用亮度/饱和度调整:红外图没有颜色信息,饱和度调整无效,亮度调整幅度要小,避免失真。
# dataset.yaml 中的增强配置片段
augment:
hsv_h: 0.015 # 色调(红外图影响小)
hsv_s: 0.0 # 饱和度(设为0)
hsv_v: 0.2 # 亮度(适度调整)
degrees: 5.0 # 旋转角度
translate: 0.1
scale: 0.1
shear: 0.0
perspective: 0.0
flipud: 0.0
fliplr: 0.5
mosaic: 0.5
mixup: 0.0
copy_paste: 0.0
# 关键:在训练代码中手动加入CLAHE
2. 第二招:锚框(Anchor)重校准,告别“尺寸错配”
YOLOv8虽然号称无锚框(Anchor-free),但其检测头的设计依然隐式地依赖于目标尺寸的先验。默认的锚框是基于COCO数据集(目标普遍较大)生成的,用在我们的小目标上简直是灾难。
解决方案很简单:用K-means在自己的数据集上重新聚类生成锚框。
from sklearn.cluster import KMeans
import numpy as np
# 假设 wh 是一个 Nx2 的数组,包含了所有GT框的宽高
wh = np.array([[w1, h1], [w2, h2], ...])
kmeans = KMeans(n_clusters=9, random_state=0).fit(wh)
new_anchors = kmeans.cluster_centers_
print("New anchors:", new_anchors)
把生成的新锚框填入模型配置文件,这一步能让召回率(Recall)立竿见影地提升。
3. 第三招:强化浅层特征,抓住微弱信号
小目标的信息主要存在于网络的浅层特征图中,但YOLOv8的FPN(特征金字塔网络)在向高层传递时会不断下采样,导致小目标特征被稀释。
我的做法是在Backbone和Neck之间,增加一个专门处理浅层特征的分支。具体来说,在P2(分辨率最高的特征图)后面接一个小的卷积块,然后将其上采样后与P3特征融合。这样能有效保留小目标的细节信息。
这个改动需要修改模型的.yaml文件,对网络结构有一定要求,但如果追求极致性能,这一步非常值得。
三、问题排查:训练过程中的“坑”
- Loss不下降? 检查学习率!小目标检测通常需要更小的学习率(比如1e-4),配合更长的训练周期。
- 过拟合严重? 我们的红外数据集通常不大,一定要用好早停(Early Stopping)和Dropout。
- 推理速度慢? 如果部署在边缘设备,建议使用YOLOv8n/s版本,并开启TensorRT加速。
四、总结
红外小目标检测确实是个硬骨头,但只要方法得当,效果提升是实实在在的。回顾整个流程:
这套方案已经在我负责的两个项目中稳定运行,如果你也在为类似问题头疼,不妨照着试试。欢迎在评论区交流你的经验!


