简介:目标检测是计算机视觉的核心任务之一,但在红外成像场景下,图像分辨率低、对比度差、噪声干扰强,飞机等目标往往仅占几十个像素,构成典型的小目标检测难题。针对这一挑战,高质量的数据集比模型调参更为关键。一个包含5000张红外飞机图像的数据集,提供了VOC、COCO、YOLO三种主流标注格式,并附有数据集划分脚本和完整的YOLO训练教程,能够支撑从数据准备、格式转换到模型训练与评估的完整流程。无论是入门目标检测的开发者,还是从事红外探测、无人机反制、安防监控的工程师,都能借助这套资源快速构建检测基线,避免标注与格式转换的重复劳动,从而更专注于模型优化与业务落地。 红外检测这个领域,做小目标检测的人应该都有体会:可见光下效果不错的YOLO模型,一到红外图像上就性能大跌。原因不难理解,红外图像分辨率低、目标对比度差、背景噪声大,再加上飞机这种目标在几百米到上千米的距离上往往只占几十个像素,属于典型的“小目标检测”难题。要想让模型在红外场景下真正可用,除了调模型结构,最关键的还是要有合适的数据集。这篇文章要聊的就是一个包含5000张红外飞机小目标检测图片的完整数据集,它同时提供了VOC、COCO、YOLO三种格式的标签文件,还附带划分脚本和训练教程,基本上一份资源就能把“数据准备—数据集划分—模型训练”整条链路跑通。不管你是刚开始接触目标检测的入门玩家,还是正在做红外探测、无人机反制、安防监控相关项目的工程师,这份材料都值得仔细研究。
1. 项目概述与数据集核心价值
1.1 红外场景下小目标检测到底难在哪里
先聊一个大家可能忽略的问题:红外图像里的目标检测,和平时玩的自然图像检测完全是两个难度级别。
红外成像靠的是目标和背景之间的温度差,所以图像呈现的是热辐射分布图,而不是我们习惯的彩色纹理。这就带来三个明显影响:第一,红外图像通常是单通道灰度图,没有颜色信息可以依赖,模型只能从形状、边缘和亮度分布中提取特征;第二,受限于红外探测器的物理分辨率,画面整体清晰度不如可见光相机,尤其是远距离目标,很容易融入背景;第三,大气衰减和探测器噪声会影响目标边缘的锐利度,让目标轮廓变得模糊。
而飞机目标在红外图像中又是一个特殊存在。当飞机距离探测系统几公里甚至十几公里时,投影到焦平面上可能只有几个到几十个像素,这种尺寸在COCO数据集标准下连“小目标”的定义都不一定满足——要知道,COCO里小于32x32像素的框才算小目标,而红外飞机目标经常就是这个量级。在这种尺寸下,目标没有明显的纹理和结构信息,常规的特征提取网络很容易把目标当成背景噪声直接滤掉。
所以,红外飞机小目标检测本质上是在“低分辨率、低对比度、高噪声”的三重夹击下做检测,这也是为什么这个方向的研究一直有热度但一直没有特别通用的解决方案。模型的网络结构需要针对性调整,训练策略需要特殊设计,而这一切的前提,是有一份真正贴合这个场景的数据集。
1.2 5000张图片+三种格式标签,这套数据解决了什么问题
我拿到这套资源的第一感受是:它把目标检测项目中“最不想花时间但最不能省”的环节全部处理好了。
先看图片部分,5000张红外图像,这个规模放在小目标检测领域不算小。很多人可能觉得5000张不够用,但你要知道红外图像本身就比较难获取,尤其是带精确框标注的红外飞机数据,很多课题组攒一年也就几千张。而且红外图像的类内差异相对可见光要小,同样的模型在相同数据量下往往能比可见光任务收敛得更好。
更关键的是标签部分。同一份数据,同时提供了VOC、COCO、YOLO三种格式的标注文件。这么做的好处非常直接:不管你平时用的是哪个检测框架,拿到手都不用做格式转换。用YOLOv5/v8的就直接用YOLO格式的txt文件,用MMDetection或者老项目就选COCO的json或者VOC的xml,减少了一个容易出错的环节。
说句实话,自己做数据标注的人都有体会:标注几百张图还行,标到几千张的时候,不仅费时间,还容易出现框的位置不统一、漏标、错标的问题。这套数据直接给了成品标签,等于把整个项目里最枯燥的环节省掉了。
最后是配套的划分脚本和训练教程。划分脚本解决的是训练集、验证集、测试集怎么分的问题,训练教程则带着你把YOLO的完整训练流程过一遍。这两个东西看似不起眼,但对新手来说,往往是“卡脖子”的环节。脚本和教程的存在,让这套数据可以直接拿来跑通一个完整的检测项目,而不是只拿到一堆图片和标注。
2. 三种标注格式深度解析:VOC、COCO、YOLO的核心差异
2.1 VOC格式:XML标注的组织方式
VOC格式源自PASCAL VOC挑战赛,是最经典的目标检测标注格式之一。它的核心是一个XML文件,每个文件对应一张图片,存放在Annotations目录下。
一个典型的VOC XML文件长这样:
<annotation> <folder>VOC2007</folder> <filename>img_0001.jpg</filename> <source> <database>Infrared Aircraft Dataset</database> </source> <size> <width>640</width> <height>512</height> <depth>1</depth> </size> <object> <name>aircraft</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>150</xmin> <ymin>120</ymin> <xmax>175</xmax> <ymax>145</ymax> </bndbox> </object> </annotation>这里面最关键的是bndbox节点,它记录了目标左上角和右下角的绝对像素坐标。xmin、ymin、xmax、ymax这四个值必须是整数,单位是像素,不能出现小数。
VOC格式的优点是人眼可读性好,打开XML文件就能看明白每个目标的位置信息,出了问题也方便排查。缺点是文件体积大,一张图片如果有多个目标,XML的体积会明显膨胀;而且解析XML需要额外的代码开销,训练时读取速度不如YOLO格式的txt文件快。
另外一个容易踩坑的地方是difficult这个字段。它的含义是“这个目标是否难以辨认”,如果标记为1,在训练时通常会被忽略,只作为背景参与训练。很多初学者拿到标注文件后没注意这个字段,导致模型训练结果和自己预期不一致,排查半天才发现是difficult目标的问题。如果用的是这套数据集,建议先检查一下标签里difficult字段的设置情况,再做后续处理。
2.2 COCO格式:JSON标注的组织方式
COCO格式是微软COCO数据集定义的标注规范,现在几乎所有主流检测框架都支持这种格式。它用一个JSON文件组织所有图片的标注信息,结构比VOC格式紧凑得多。
COCO JSON的整体结构可以拆成五大部分:
{ "info": { "description": "Infrared Aircraft Detection Dataset", "version": "1.0", "year": 2024 }, "images": [ { "id": 1, "file_name": "img_0001.jpg", "width": 640, "height": 512 } ], "annotations": [ { "id": 1, "image_id": 1, "category_id": 1, "bbox": [150, 120, 25, 25], "area": 625, "segmentation": [], "iscrowd": 0 } ], "categories": [ { "id": 1, "name": "aircraft" } ] }这里需要特别注意bbox字段的定义方式。COCO格式里的bbox是[x, y, width, height],其中x、y是目标左上角的坐标,width和height是目标框的宽和高,这四个值可以是浮点数。这和VOC里的xmin、ymin、xmax、ymax(左上角+右下角)不同,很多人第一次转换格式时最容易在这个地方出错。
另外,area字段表示目标的面积,如果是从VOC格式转换过来的,area = (xmax - xmin) * (ymax - ymin),也可以用bbox计算:area = width * height。
还有iscrowd字段,表示这个目标是不是一堆密集目标组成的群体,通常是0。但如果原标注里有些目标非常密集、无法单独区分,这个字段就会被置为1,训练时框架会特殊处理。
COCO格式的好处是信息的结构化程度高,一个JSON文件就能搞定整个数据集的标注,读取效率和传输效率都比一堆XML高。缺点是JSON文件体积较大——5000张图片的标注全放一起,文件可能达到几十MB,打开和编辑都不太方便。实际操作中,常用json.load()配合索引方式读取,不建议直接用文本编辑器打开。
2.3 YOLO格式:TXT标注的组织方式
YOLO格式是这几种格式里最“轻量”的一种。每个标注文件是一个txt文件,文件名和图片名保持一致,放在labels目录下。文件里的每一行对应一个目标,格式如下:
class_id x_center y_center width height注意,这里面的所有值都是归一化到0到1之间的浮点数,不是像素坐标。归一化的分母是图片的宽度和高度。
举个例子,如果图片是640x512,某个目标是aircraft,类别id是0,目标框左上角是(150, 120),右下角是(175, 145),那么:
- x_center = (150 + 175) / 2 / 640 = 162.5 / 640 = 0.2539
- y_center = (120 + 145) / 2 / 512 = 132.5 / 512 = 0.2588
- width = (175 - 150) / 640 = 25 / 640 = 0.0391
- height = (145 - 120) / 512 = 25 / 512 = 0.0488
所以txt文件里这一行应该是:
0 0.2539 0.2588 0.0391 0.0488YOLO格式最大的优点是效率高。txt文件体积非常小,读取速度快,而且YOLO系列框架原生支持这种格式,拿过来就能直接训练。还有一个隐含的好处:归一化后的坐标和图片大小无关,换个分辨率训练不需要重新标注。
缺点也很明显:可读性差。你看着一行“0 0.2539 0.2588 0.0391 0.0488”,完全想象不出这个框在图片的什么位置,除非你用可视化工具画出来。而且一旦格式错误——比如宽度或高度是负数、x_center超出0到1范围——训练时会直接报错或者静默跳过目标,排查起来比较麻烦。
2.4 三种格式的转换关系
三种格式之间的转换逻辑其实很清晰,核心就是坐标系的转换。VOC是绝对坐标的左上角+右下角,COCO是绝对坐标的左上角+宽高,YOLO是归一化坐标的中心点+宽高。
从VOC转YOLO的转换公式:
x_center = ((xmin + xmax) / 2) / width y_center = ((ymin + ymax) / 2) / height w = (xmax - xmin) / width h = (ymax - ymin) / height从COCO转YOLO的转换公式:
x_center = (x + width / 2) / image_width y_center = (y + height / 2) / image_height w = width / image_width h = height / image_height这个转换过程看起来简单,但有几处细节值得注意。第一,VOC的坐标是整数,转成浮点数后精度会有细微误差,但这对检测任务基本没有影响。第二,COCO的bbox可能带有小数,转成YOLO格式后需要检查归一化后的值是否在0到1范围内,偶尔会有超出边界的框,需要截断或过滤。第三,类别id必须保持一致,如果VOC里的类别名是“aircraft”,而YOLO格式里它对应类别id 0,那所有标注行的第一列都必须是0,不能混淆。
这套数据集之所以好用,就是因为它把三种格式全部备齐了,省去了手动转换的麻烦。但了解转换原理仍然很重要,因为你以后自己采集数据、打标注时,几乎一定会遇到“只有一种格式、需要转成另一种格式”的情况。理解了坐标转换的本质,写转换脚本只是十几分钟的事。
3. 数据集划分脚本:设计思路与实操指南
3.1 为什么一定要划分训练集、验证集、测试集
很多新手拿到数据后第一件事就是把所有图片都丢进去训练,然后发现模型在训练集上表现很好,一到真实场景就崩了。这就是典型的“过拟合”问题——模型把训练数据背下来了,而不是学会了检测规律。
划分数据集的核心目的,就是模拟“在没见过的数据上做检测”这个真实场景。通常按比例分成三份:
- 训练集:用于模型学习权重,占比最大,一般70%到80%
- 验证集:用于训练过程中实时评估模型表现,帮助调整超参数和选择最优模型,占比一般10%到15%
- 测试集:用于最终评估模型的泛化能力,占比一般10%到15%
测试集和验证集的区别需要特意强调一下。验证集是参与训练过程的,模型每训练几个epoch就要在验证集上测试一下,根据验证集的表现决定是否调整学习率、是否早停、哪一版权重最好。测试集则完全独立,只在训练全部结束后用一次,用来评估模型的真实水平。如果测试集也被反复拿来调参,那它就失去了“未知数据”的意义,评估结果会偏乐观。
有一个常见的错误是把同一批数据既当验证集又当测试集。如果你发现自己两个指标差不多,但真实场景表现差很多,多半就是这个原因。
3.2 划分脚本的实现逻辑
这个数据集附带的划分脚本,核心逻辑并不复杂,但很多细节值得学习。一个标准的划分脚本要做这几件事:
- 读取全部图片文件名
- 随机打乱顺序
- 按比例切分成训练、验证、测试三份
- 生成对应的标注文件路径列表
- 输出划分结果,通常是一份txt文件或多个文件夹的软链接
如果用的是YOLO格式,划分脚本的输出通常是train.txt、val.txt、test.txt三个文件,每个文件里一行一个图片的绝对路径或相对路径。
这里有一个关键的实现细节:划分之后,要保证图片和对应的标签文件始终在一起。比如图片train/img_0001.jpg必须对应labels/train/img_0001.txt,如果图片和标签不在同一个路径层级下,就需要在脚本里手动建立对应关系。
从工程角度来说,更推荐的做法是直接按照训练、验证、测试三个目录重新整理文件,或者保持所有文件不动、只生成三个包含路径的txt文件。前者查找和可视化比较方便,后者不复制大文件、节省磁盘空间。针对5000张图片的规模,两种方案都可行,但如果你后续要频繁增加数据,建议用txt索引的方式,因为改动最小。
脚本里还应该加入一个随机种子设置。这个细节很多人会忽略,但它的作用很大。随机种子固定下来后,每次执行脚本得到的划分结果一致,这样你复现实验时,代码和数据都是确定性的,不会因为重新划分导致训练结果对不上。
3.3 使用划分脚本时要注意的坑
我自己在做数据集划分时踩过几个坑,这里一起说一下。
第一个坑是类别分布不均衡。如果整个数据集中某个类别的样本数量很少,而且恰好全部被分到了训练集,那么验证集和测试集中这个类别的检测能力就无法被评估。针对这种情况,应该使用“分层采样”而不是纯随机划分。简单说,就是先按类别分组,再在每个组内按比例随机抽取,确保每个类别在训练、验证、测试中的比例保持一致。虽然这套红外飞机数据集大概率只有一个类别,但如果你以后自己扩展数据集,这个方法必须掌握。
第二个坑是图片和标签的对应关系在划分过程中被破坏。尤其当图片文件名有重复或者编号不连续时,容易出现“图片在训练集,标签在验证集”的问题。划分完成后一定要做一次校验,最简单的办法是统计三个集合中的图片数量是否等于5000,再随机抽几对图片-标签检查内容是否匹配。
第三个坑是数据集泄露。如果你在划分之前对图片做了预处理,比如统一缩放、增强、去噪,而这些预处理使用了整个数据集的统计信息(例如全局均值和方差),那么验证集和测试集就不再是“纯未知数据”,评估结果会偏乐观。正确的做法是先划分、后预处理,或者预处理时只使用训练集的统计信息。
4. YOLO模型训练全流程教程
4.1 训练环境准备
YOLO系列框架的安装已经非常成熟了,这里给出我实测过的稳定方案。
首先创建独立的Python环境,推荐用conda管理:
conda create -n yolo python=3.9 conda activate yolo然后是安装PyTorch。这一步要特别注意版本匹配,建议去PyTorch官网用自动生成的命令安装,根据自己的CUDA版本选择对应的安装指令。以CUDA 11.8为例:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果电脑没有NVIDIA显卡或者显存不够(红外图片分辨率一般不高,但训练仍建议显存不小于6GB),可以选择CPU版,但训练速度会慢很多,适合先跑通流程,不适合实际迭代。
接着安装YOLO框架,现在的主流选择是ultralytics,它统一支持YOLOv5到YOLOv8的模型架构,API很简洁:
pip install ultralytics装完之后可以顺手验证一下环境是否正常:
import torch import ultralytics print(ultralytics.__version__) print(torch.cuda.is_available())如果输出True,说明CUDA环境正常可以开始训练。
4.2 数据集配置与目录结构
使用YOLO框架训练前,需要把数据集整理成框架要求的目录结构。虽然这套数据集的标签是三种格式都有的,但YOLO系列框架默认读取的是YOLO格式的txt标注,所以按下述方式组织:
infrared_aircraft/ ├── images/ │ ├── train/ │ │ ├── img_0001.jpg │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── img_0001.txt │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... └── data.yaml这里需要注意,images目录下放的是红外图像原图,labels目录下放的是同名的txt标注文件。两个目录的train/val/test子目录结构必须一致,否则框架会报找不到标签的错误。
data.yaml是整个训练配置的核心文件,内容如下:
path: /path/to/infrared_aircraft # 数据集根目录 train: images/train # 训练集图片目录 val: images/val # 验证集图片目录 test: images/test # 测试集图片目录 nc: 1 # 类别总数 names: ['aircraft'] # 类别名称列表这里有一个容易出错的细节:path字段是数据集根目录的绝对路径,train和val字段是相对path的相对路径。如果你把path写错,框架加载数据时就会找不到图片,报FileNotFoundError。
4.3 训练命令与关键参数调优
环境配置好、数据集文件就位后,训练命令实际上很简洁。以YOLOv8为例:
yolo detect train \ data=data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ device=0训练开始后,终端会输出每个epoch的损失值和指标变化。训练结束之后,最好的权重默认保存在runs/detect/train/weights/best.pt。
针对红外飞机小目标检测这个场景,有几个关键参数值得特别调整。
首先是imgz(输入图片尺寸)。如果你的红外原图分辨率是640x512,那imgsz=640是合理的。但如果你使用的是较高分辨率如1024x768,建议把imgsz调成640或832,而不是直接设为1024。原因有两个:一是大图显存占用高,容易OOM;二是对于小目标检测,过度缩放反而会让本来就只有十几个像素的目标变得更小,丢失信息。实际调试时,可以从imgsz=640开始,用验证集表现来对比不同尺寸的效果。
其次是epochs(训练轮数)。对于5000张图片的数据集,100轮通常是足够的。如果你发现验证集loss还在持续下降,可以加大到150轮或200轮。我个人的经验是,红外小目标数据集的收敛速度通常比自然图像数据集更快,因为图像内容相对单调,目标类别单一。一般到50轮左右就已经能看到不错的检测效果了。
再看batch size(批次大小)。这是一个受显存约束的参数。如果显存是8GB,imgsz=640的情况下,YOLOv8n的batch可以设到16;如果用YOLOv8s或更大的模型,batch要相应减小。batch size过小时,Batch Normalization层的统计量会不稳定,导致训练震荡,所以尽量不要小于8。
最后是model的选择。YOLO系列在模型大小上分为n/s/m/l/x几档,n是最小的,x是最大的。对于小目标检测,并不是模型越大效果越好。大模型参数量多,在数据量不够充足时反而容易过拟合。针对5000张图的数据量,我建议从yolov8n或yolov8s开始,先把基础性能跑出来,再考虑用更大的模型上线。
4.4 训练结果评估与指标解读
训练完成后,需要在独立的测试集上做最终评估。YOLO框架提供了现成的评估命令:
yolo detect val \ data=data.yaml \ model=runs/detect/train/weights/best.pt \ split=test最核心的评估指标是mAP@0.5和mAP@0.5:0.95。mAP@0.5是IoU阈值在0.5时的平均精度,mAP@0.5:0.95是对0.5到0.95各个IoU阈值取平均,后者更严格、更全面。
对于红外飞机小目标检测任务,mAP@0.5在0.8以上算是不错的水平,mAP@0.5:0.95如果能达到0.5以上,说明模型已经具备比较好的定位精度。如果你发现mAP@0.5还挺高,但mAP@0.5:0.95很低,说明模型能大概找到目标位置,但框的定位不够精确,这时候可以考虑调整回归损失的权重,或者使用CIoU损失函数。
还有一个容易被忽略但非常重要的指标是单类别的recall。从检测场景来看,红外飞机检测更关注的是“不漏检”——宁可多报几个误检,也不能漏掉真实目标。所以训练结束后建议看一下PR曲线在低置信度区域的表现,如果召回率比较低,后续推理时可以把置信度阈值从默认的0.25降低到0.15左右,牺牲部分精度换取更高的检出率。
5. 红外小目标检测的实战经验与避坑指南
5.1 小目标漏检问题分析与对策
在实际使用这套数据集训练模型时,最常见的反馈就是“小目标漏检”。具体表现是:远处的小飞机检测不到,或者有时候能检测到但框的位置偏移比较大。
出现这个问题的根源有三个方面。
第一是特征提取层对小目标的响应太弱。YOLO的主干网络做多次下采样后,小目标在深层特征图上的信息可能只剩一两个像素,模型很难从这个像素里判断目标是否存在。解决思路是使用更大的输入尺寸、在特征融合阶段增加高分辨率特征层的权重,或者用专门针对小目标的检测头。
第二是锚框设计和目标尺寸不匹配。YOLOv8是anchor-free的,但YOLOv5是anchor-based的,后者的锚框尺寸如果和目标实际尺寸差异过大,回归起来就很困难。红外飞机目标的框通常只有20到40像素,和默认的锚框尺寸匹配度不高,这也是为什么建议直接用YOLOv8来训练小目标,anchor-free设计天生对小目标更友好。
第三是训练数据中目标太小导致梯度信号不强。这种情况下,切片操作或切分推理是有效的补救手段。把原图切分成几个区域,每个区域等比放大后再送入模型检测,最后合并结果。这套数据中的红外图如果存在很多特别小的目标,训练时可以配合随机裁切增强,让模型看到更多“放大后”的目标结构。
5.2 数据增强的边界:过犹不及
很多人拿到新数据集后第一反应是把所有数据增强手段全部打开。但红外图像有其特殊性,数据增强的强度要谨慎控制。
Mosaic是YOLO系列里非常有效的增强手段,它把4张图拼接成一张,让模型同时看到多个场景,显著提升鲁棒性。但在小目标检测场景下,Mosaic有一个副作用:拼接后单张图被缩放,目标变得更小,原有信息更容易丢失。所以可以适当降低Mosaic的启用概率,或者在Mosaic基础上配合一个高的copy-paste增强,把目标复制到其他图上,增加小目标的样本数量。
色域增强在红外图中作用有限。因为红外图本来就是单通道灰度图,HSV色域扰动只会轻微改变亮度和对比度,效果不如可见光场景明显。但有一个增强手段很有效:随机加减一个灰度偏移量。红外图像的整体亮度受环境和探测器增益影响很大,通过随机偏移亮度,可以提升模型对不同热辐射强度的适应能力。
旋转增强需要小心。飞机目标有比较明确的方向性,如果做90度翻转,模型可能学到错误的方向特征。对于这种任务,建议只做小角度旋转(±15度以内)和水平翻转,避免垂直翻转。
5.3 训练中显存不足和崩溃问题排查
训练过程中报错是常事,这里把最常遇到的三个问题集中说明一下。
第一个是CUDA out of memory。这通常发生在验证或测试阶段,因为验证时框架会把整批图片一次性送入显卡计算。解决办法:降低batch size、降低imgsz,或者设置val的batch为1。如果训练本身都能稳定跑,只是验证时爆显存,那多半是你总batch太大,可以把训练batch调小到8或4。
第二个是标签文件格式错误。最常见的问题是txt文件里某个值超出范围,比如x_center大于1或者width为0。检查方法很简单,用一个Python脚本遍历所有标签文件,检查每一行的数据是否在合法范围内。YOLO训练时如果遇到非法标签,通常会打印警告并跳过该目标,如果你的训练输出里出现很多ignore相关的警告,大概率就是标签有问题。
第三个是类别不匹配。data.yaml里写了nc: 2,但标签文件里的类别id写的是0和1,而类别名称列表却对不上,训练时会报错或者类别错位。检查方法是在训练前加载一个标签文件,打印里面的类别id,然后和data.yaml里的names字段逐一核对。
5.4 推理部署时的后处理技巧
模型训练完,真正部署到实际系统时,还有几个环节直接影响最终效果。
置信度阈值的选择是第一个需要细化的问题。YOLO框架默认的置信度阈值是0.25,但这个值对红外小目标检测不一定是合适的。小目标天然置信度偏低,如果你想追求高召回率,可以把阈值降到0.1到0.15;如果你更在乎准确率,可以提到0.4以上。建议在测试集上扫一遍阈值,画出PR曲线,找到平衡点。
NMS(非极大值抑制)的IoU阈值也需要调整。默认值是0.45,对于密集的小目标场景,如果多个目标靠得很近,NMS可能会把不同目标的框合并成一个,导致漏检。可以把IoU阈值适当降低到0.3,让NMS更保守一些,减少相邻目标被错误合并的概率。
最后预热和图像归一化的细节容易被忽略。红外图像如果以16bit的raw格式存储,必须先做线性拉伸或直方图均衡化,转成8bit图像再送入模型,否则检测效果会大打折扣。把“图像预处理”这一步也纳入整体流程,在推理时保持和训练时一致的预处理方式,这是模型效果稳定的基础。
写在最后
这套红外飞机小目标检测数据集的完整度确实超出预期,5000张图片、三种格式标签、划分脚本、训练教程,把一个目标检测项目从数据到模型的常用环节都覆盖了。我个人的建议是,拿到数据后不要急着直接开跑,先把三种标签格式的差异读懂,再用训练脚本把基线跑通,最后才考虑模型结构改进和数据增强策略。
有一点需要提醒:即使有了这份数据集,红外小目标检测在实际项目中还会遇到很多新问题。比如不同红外设备的成像风格差异非常大,训练集里是A设备拍的图,部署到B设备上效果可能会有明显下降。解决思路是数据积累阶段就尽量覆盖多种设备、多种天气、多种距离下的红外图像,模型才能学到更泛化的特征。把这个基础打牢,后面做部署、做产品,路会顺很多。
本文还有配套的精品资源,点击获取