小样本目标检测实战:100张标注+400张未标注数据如何高效训练模型
1. 项目概述与可行性分析
“目标检测,500张图,100张有标签,两类,可以做吗?”——这几乎是每一个刚踏入计算机视觉领域,特别是想用深度学习解决实际问题的朋友,都会遇到的第一个灵魂拷问。我见过太多人卡在这一步,面对有限的标注数据望而却步,或者盲目投入大量人力去标注,最后发现事倍功半。今天,我就以一个过来人的身份,结合我处理过的大量类似项目经验,来彻底拆解这个问题。答案是:完全可以做,而且有不止一条清晰的路径可以走,关键在于策略和方法。
首先,我们得直面现实:100张有标签的图片,对于训练一个鲁棒性强的通用目标检测模型来说,确实是杯水车薪。传统的监督学习范式下,数据量不足极易导致模型过拟合,即模型“死记硬背”了训练集中的少数样本,无法泛化到新的、未见过的图像上。但是,“可以做”的核心逻辑在于,我们并非要训练一个能识别世间万物的通用模型,而是要解决一个特定的、定义明确的、两类目标的检测问题。这为我们利用小样本学习、数据增强、迁移学习乃至半监督学习等技术打开了大门。
这500张图(其中100张有标签,400张无标签)本身就是一笔宝贵的财富。它意味着你已经有了一个与目标场景高度相关的图像库。我们的目标不是从零开始“创造”知识,而是如何最大限度地“榨取”这100张标注图片中的信息,并巧妙地利用那400张无标签图片,让模型学会举一反三。这就像一位老师,只有100道标准例题,却要教会学生解500道同类题型。聪明的老师会讲解例题的通用解法(迁移学习)、会变化题干条件(数据增强)、甚至会让学生互相批改作业(自训练/半监督学习)。接下来,我们就来扮演这位“聪明的老师”。
2. 核心思路与方案选型
面对100张标注+400张未标注的数据格局,我们不能一头扎进YOLO的代码里就开始训练。正确的做法是先进行顶层设计,选择最适合当前资源(数据、算力、时间)和技术栈的技术路线。这里我为你梳理出三条主流且经过实战检验的路径,并分析其优劣。
2.1 路径一:强数据增强 + 预训练模型微调(最直接、最快速)
这是入门首选,也是基线方案。其核心思想是:利用在大规模数据集(如ImageNet、COCO)上预训练好的模型权重作为起点,它们已经具备了强大的通用特征提取能力(如识别边缘、纹理、形状)。我们只需要让模型“微调”一下,适应我们特定的两个类别。
- 为什么可行?预训练模型好比一个见过世间千万种物体的“博物学家”。你现在要教他认识两种特定的新植物。他已有的植物学知识(特征提取能力)能让他快速抓住重点,你只需要提供一些新植物的样本(你的100张图),并告诉他“注意看这种叶脉”、“那种花瓣是五瓣的”,他就能很快学会。这比教一个毫无常识的人要快得多。
- 如何应对数据少?答案是“暴力”但有效的数据增强。我们不是只有100张图,而是可以通过一系列变换,从每张图“生成”几十甚至上百张“新”图。这不仅仅是简单的旋转、翻转。对于目标检测,我们需要使用能同时变换图像和其对应边界框标签的增强策略,例如:
- 几何变换:随机水平/垂直翻转、随机旋转(小角度)、随机缩放裁剪。
- 色彩变换:调整亮度、对比度、饱和度、色调,添加高斯噪声。
- 高级增强:MixUp(将两张图按比例混合)、CutMix(将一张图的部分区域裁剪并粘贴到另一张图上)、Mosaic(将四张图拼成一张)。这些方法能极大增加数据的多样性,模拟真实世界中的复杂场景,有效防止过拟合。
- 方案流程:
- 选择一款成熟的检测框架(如YOLOv8, Ultralytics版,因其易用性和社区活跃度首选)。
- 加载其官方在COCO等大数据集上预训练好的模型(如
yolov8n.pt)。 - 将你的100张标注数据,按照8:1:1或类似比例划分为训练集、验证集和测试集。
- 配置一个激进的数据增强管线(pipeline)。
- 冻结模型的主干网络(Backbone)的前面大部分层,只微调最后的检测头(Head)和主干网络的深层。初期可以冻结更多层,后期视情况解冻。
- 使用较小的学习率(通常比从头训练小1-2个数量级)进行训练。
- 优点:实现简单,速度快,对新手友好,通常能快速得到一个可用的基线模型。
- 缺点:性能天花板受限于100张标注图片的信息总量。如果目标物体本身变异很大(如不同光照、姿态、遮挡下的同一类物体),增强后的数据可能仍无法覆盖所有情况。
2.2 路径二:半监督学习(潜力最大,能利用400张无标签图)
这是最能体现本项目数据特点(大量无标签数据)的方案,也是当前学术界和工业界在小样本检测上的研究热点。其核心思想是:让模型在训练过程中,自己为那400张无标签数据“生成”伪标签(Pseudo-label),然后用这些伪标签反过来训练模型自己,形成自我提升的循环。
- 为什么可行?这就像“学生自学”。老师(有标签数据)先教一些基础知识。然后给学生(模型)一批习题(无标签数据)让他自己做。学生做完后,老师(或学生自己)对照答案(模型自身的预测)进行批改,把那些做得很有把握(高置信度)的题当作新的“标准答案”(伪标签),加入题库。下一轮学习时,题库就变大了。如此迭代,学生的能力(模型性能)会逐步提升。
- 经典方法:自训练(Self-training)
- 第一步:用100张有标签数据,按照“路径一”的方法,训练一个初始教师模型(Teacher Model)。这个模型可能不强,但足够为简单样本打标签。
- 第二步:用这个教师模型对400张无标签图片进行推理预测。只保留那些置信度分数非常高(例如,大于0.9)的预测框,作为伪标签。这一步的质量控制至关重要,宁缺毋滥。引入低质量的伪标签会污染训练集,导致模型性能下降,俗称“认知崩溃”。
- 第三步:将100张真实标签和筛选出的高质量伪标签数据混合,构成一个新的、更大的训练集,用来训练一个新的学生模型(Student Model)。
- 第四步(可选):可以将训练好的学生模型作为新的教师模型,重复第二步和第三步,进行多轮迭代。
- 更先进的方法:一致性正则化(Consistency Regularization)这类方法(如FixMatch, 应用于检测的Unbiased Teacher等)不直接生成伪标签,而是要求模型对同一张无标签图像的不同增强版本(例如,一次弱增强,一次强增强)做出“一致”的预测。模型在迫使自己学习到更本质、更不变的特征。这类方法通常比简单的自训练更鲁棒。
- 优点:能充分利用未标注数据,理论上可以突破仅有标签数据的信息瓶颈,获得比路径一更好的性能。
- 缺点:实现复杂度高,需要仔细调整伪标签的阈值和训练策略,训练过程不稳定,容易因错误的伪标签而恶化。
2.3 路径三:小样本/少样本目标检测(最“正统”的学术方案)
这是一类专门为解决“标注数据极少”而设计的算法。它们通常在训练阶段会接触大量的“基础类”数据,学习一个通用的物体表示和比较能力。在测试或适应新任务时,只需要每个新类别提供极少量的样本(如1-5张,称为支持集),模型就能快速检测出该类别。
- 为什么可行?这类似于“类比学习”。模型先学习了一个庞大的“视觉概念字典”和“比较规则”。当遇到一个新物体时,你只需要给它看一两张例子(支持集),它就能根据已有的字典和规则,在图像中找出所有和这个例子“相似”的区域。
- 经典范式:
- 元学习(Meta-Learning):训练模型学会“如何快速学习新任务”。在训练时,模型会经历大量模拟的“小样本任务”,每个任务都有自己的少量支持集和查询集。通过这种方式,模型掌握了从少量样本中提取关键特征并泛化的能力。
- 基于度量学习(Metric-Based):将检测问题转化为区域特征匹配问题。模型学习一个特征嵌入空间,使得同一类物体的特征彼此靠近,不同类物体的特征彼此远离。对于新类别,计算查询图像中各个区域与支持集图像特征的距离,距离近的即判定为该类别。
- 优点:是解决小样本问题的根本性思路,对于未来快速适配新类别非常有吸引力。
- 缺点:实现最为复杂,需要特定的框架和训练方式(如 episodic training),且很多SOTA方法尚未集成到YOLO等易用框架中,复现难度大。对于固定的两类任务,其最终效果可能不如针对该任务精心微调的模型(路径一或二)。
我的实战建议:对于大多数工程实践和入门者,我强烈推荐采用“路径一为主,路径二为辅”的混合策略。即,首先通过强数据增强和微调,快速建立一个坚实的基线模型。然后,用这个基线模型去尝试生成伪标签,谨慎地将其加入到训练中,观察验证集指标是否有稳定提升。这既能保证项目快速启动看到效果,又为性能提升留下了空间。
3. 数据准备与处理实操要点
无论选择哪条路径,高质量的数据准备是成功的基石。这部分工作繁琐但至关重要,直接决定了模型性能的上限。
3.1 标注格式统一与检查
你的100张标注数据很可能已经是某种格式(如PASCAL VOC的XML, 或COCO的JSON, 或YOLO格式的txt)。第一步是统一格式。YOLO系列训练通常使用其专用的TXT格式(每个图像对应一个TXT, 每行内容为:class_id x_center y_center width height, 坐标均为相对于图像宽高的归一化值)。
- 格式转换工具:可以使用
labelimg查看和编辑, 或使用Roboflow这样的在线平台进行格式转换和管理。这里给出一个简单的Python脚本思路,将VOC XML转为YOLO格式:import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_path, img_width, img_height, class_map): tree = ET.parse(xml_path) root = tree.getroot() yolo_lines = [] for obj in root.findall('object'): cls_name = obj.find('name').text if cls_name not in class_map: continue cls_id = class_map[cls_name] bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) ymin = float(bbox.find('ymin').text) xmax = float(bbox.find('xmax').text) ymax = float(bbox.find('ymax').text) # Convert to YOLO format x_center = (xmin + xmax) / 2.0 / img_width y_center = (ymin + ymax) / 2.0 / img_height width = (xmax - xmin) / img_width height = (ymax - ymin) / img_height yolo_lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}") return yolo_lines # 使用示例:遍历所有XML文件,读取对应图像尺寸,转换并保存为TXT - 数据检查清单:
- 标签与图像对应:确保每张标注图片都有对应的图像文件,且文件名一致。
- 标注框是否出界:检查所有边界框的坐标(归一化后)是否在[0, 1]区间内。偶尔会有标注工具导出错误导致坐标略大于1或小于0,需要修正或剔除。
- 类别ID是否正确:确认你的两类目标对应的class_id是连续的,通常从0开始(0和1)。
- 标注质量抽查:随机打开10-20张图片和对应的标签,用可视化工具(如OpenCV)画出边界框,检查标注是否准确、完整。是否存在漏标、错标、框过大或过小的问题。
3.2 数据集划分策略
100张数据,划分需要格外小心。绝对不能随机打乱后简单划分,因为随机可能导致某些特定场景或难例全部集中在某一子集,造成评估失真。
- 推荐方法:分层抽样(Stratified Split)确保训练集、验证集、测试集中,每个类别的样本数量比例大致相同。例如,如果“类别A”有60张,“类别B”有40张,那么划分时也应保持这个比例。可以使用
scikit-learn的StratifiedShuffleSplit,但需要根据你的标注文件统计每个图像的类别分布来构造标签。 - 划分比例:对于小数据集,验证集和测试集不宜过大,否则训练集就太少了。建议采用80-10-10或70-15-15的比例。即80张训练,10张验证,10张测试。
- 训练集:用于模型参数更新。
- 验证集:用于在训练过程中监控模型表现,调整超参数(如学习率),以及进行早停(Early Stopping),防止过拟合。这是你最重要的“方向盘”。
- 测试集:在全部训练和调参完成后,用于最终评估模型性能。在整个训练和调参过程中,绝对不能以任何形式使用测试集,它应该是完全“看不见”的数据。
- 实操命令(以YOLOv8为例):你需要准备一个
dataset.yaml配置文件,其中指定了路径和类别。
然后使用脚本将图片和标签文件移动到# dataset.yaml path: /path/to/your/dataset train: images/train # 训练集图片路径 val: images/val # 验证集图片路径 # test: images/test # 可选,测试集路径 nc: 2 # 类别数量 names: ['class_A', 'class_B'] # 类别名称列表train,val,test文件夹中。
3.3 数据增强策略配置
这是小样本学习的生命线。以YOLOv8为例,其增强配置非常丰富。
- 基础增强(推荐开启):
# 在训练命令中通过参数传递,或修改默认的args.yaml hsv_h: 0.015 # 色调增强幅度 hsv_s: 0.7 # 饱和度增强幅度 hsv_v: 0.4 # 明度增强幅度 degrees: 0.0 # 旋转角度,目标检测建议设为0或很小,否则框的标注会不准确 translate: 0.1 # 平移 scale: 0.5 # 缩放 shear: 0.0 # 剪切 perspective: 0.0 # 透视,小数据集慎用,计算开销大且可能引入不真实形变 flipud: 0.0 # 上下翻转,根据你的目标特性决定(如空中目标可能不需要) fliplr: 0.5 # 水平翻转概率,0.5是常用值 mosaic: 1.0 # Mosaic增强概率,小样本强烈建议设为1.0 mixup: 0.0 # MixUp概率,初期可设为0,后期可尝试0.1-0.2 copy_paste: 0.0 # 复制粘贴增强,小样本可尝试,但需注意逻辑合理性 - 我的经验与调整:
mosaic增强对于小样本目标检测是神器。它把四张图拼成一张,极大地增加了单张训练图片的背景复杂性和目标密度,相当于扩大了batch size,对模型泛化能力提升显著。hsv增强模拟光照变化,对模型鲁棒性很重要。fliplr水平翻转对于大多数非对称性不强的目标都是有效的。- 对于
degrees(旋转)和shear(剪切),如果目标在真实场景中不会发生大角度旋转或剪切变形(例如,固定的交通标志),建议设为0或很小的值,避免模型学习到不真实的模式。 - 初期训练可以只开启
hsv,fliplr,mosaic。在模型收敛后,如果想进一步提升,可以尝试引入mixup或copy_paste,但要密切观察验证集指标,防止性能下降。
4. 模型选择、训练与调优实战
数据准备好后,就到了模型环节。我们将以最流行的YOLOv8为例,因为它生态好,文档全,从训练到部署的链路非常顺畅。
4.1 模型尺寸选择与预训练权重
YOLOv8提供了从Nano到XLarge不同尺寸的模型,在精度和速度上做了权衡。
| 模型 | 参数量 (约) | 特点 | 适用场景建议 |
|---|---|---|---|
| YOLOv8n | 3.2M | 极快,体积小 | 移动端/边缘设备,对精度要求不高,快速原型验证 |
| YOLOv8s | 11.2M | 速度快,精度平衡 | 本项目首选,在有限数据下较容易训练,速度和精度兼顾 |
| YOLOv8m | 25.9M | 中等 | 如果算力充足,且目标较复杂,可以尝试 |
| YOLOv8l | 43.7M | 大 | 数据量少时容易过拟合,需谨慎使用 |
| YOLOv8x | 68.2M | 极大 | 不适用于本项目,极易过拟合 |
我的建议:从YOLOv8s开始。它既有足够的容量来学习你的两类目标特征,又不像更大模型那样“贪婪”地需要大量数据。使用其官方在COCO上预训练的权重(yolov8s.pt)进行初始化。
4.2 训练关键参数解析与设置
训练命令看似简单,但每个参数都关乎成败。
yolo task=detect mode=train model=yolov8s.pt data=dataset.yaml epochs=100 imgsz=640 batch=16 patience=20 lr0=0.01 cos_lr=True amp=True我们来拆解关键参数:
epochs=100: 迭代轮数。对于小数据,可能需要更多轮才能收敛,但也要配合早停。可以先设100-150。imgsz=640: 输入图像尺寸。更大的尺寸(如640)通常能带来更好的精度,尤其是对小目标,但会增加显存消耗和训练时间。如果你的原始图像很大且目标很小,可以尝试768甚至1024。保持一致:训练、验证、预测时最好使用相同尺寸。batch=16: 批次大小。受限于你的GPU显存(如NVIDIA GTX 1660 6G可能只能跑batch=8)。在能放下的前提下,较大的batch有助于训练稳定。如果显存不足,可以减小batch,同时适当增加epochs作为补偿。patience=20: 早停耐心值。如果验证集指标在连续20个epoch内没有提升,则自动停止训练,并回滚到最优的模型权重。这是防止过拟合的关键保险丝。lr0=0.01: 初始学习率。对于微调任务,这个值通常太大了。微调预训练模型建议使用更小的学习率,例如1e-3到1e-4。可以从lr0=0.001开始。cos_lr=True: 启用余弦退火学习率调度器。它让学习率随着训练过程像余弦曲线一样平滑下降,有助于模型在后期更精细地收敛到最优解。推荐开启。amp=True: 自动混合精度训练。能显著减少显存占用并加快训练速度,且通常不会损失精度。只要你的GPU支持(Volta架构及以后),务必开启。
一份针对本项目的推荐启动配置:
yolo task=detect mode=train model=yolov8s.pt data=dataset.yaml epochs=150 imgsz=640 batch=8 patience=30 lr0=0.001 cos_lr=True amp=True workers=4注意:
workers是数据加载的进程数,根据你的CPU核心数设置,可以加快数据读取。如果训练时出现内存错误,可以尝试减小batch或imgsz。
4.3 训练过程监控与调试
训练启动后,不要放任不管。Ultralytics会启动一个本地Web服务器(默认http://localhost:xxxx),提供实时监控面板。
核心监控指标:
train/box_loss,train/cls_loss,train/dfl_loss: 训练损失。应总体呈下降趋势,后期可能波动。val/box_loss,val/cls_loss,val/dfl_loss: 验证损失。这是更重要的指标,应随训练下降并最终趋于平稳。如果验证损失开始持续上升,而训练损失继续下降,这是典型的过拟合信号。metrics/mAP50-95: 平均精度均值(IoU阈值从0.5到0.95的平均值)。这是衡量检测性能的核心指标,我们希望它稳步上升。metrics/mAP50: IoU阈值为0.5时的平均精度。更宽松,数值通常更高。metrics/precision,metrics/recall: 精确率和召回率。需要根据你的业务需求权衡。例如,安全检测可能要求高召回(宁可错杀,不可放过),而内容过滤可能要求高精度(宁可放过,不可错杀)。
如何应对过拟合?如果发现严重过拟合(验证集指标早早就变差):
- 增强数据增强:增加
hsv、translate、scale的幅度,确保mosaic开启。 - 增加正则化:尝试加入权重衰减(
weight_decay参数,默认是5e-4,可以尝试增加到1e-3),或者在模型中增加Dropout层(YOLOv8本身结构已包含正则化)。 - 减少模型容量:换用更小的模型,如从YOLOv8s降到YOLOv8n。
- 更早的早停:减小
patience值。 - 减少训练轮数:可能模型在50轮就已经学好了,后面都在记忆噪声。
- 增强数据增强:增加
如何应对欠拟合(指标一直很低)?
- 检查数据:标签是否正确?数据划分是否合理?训练集和验证集分布是否差异过大?
- 调整学习率:可能初始学习率
lr0太小了,尝试增加到0.01(从头训练的标准值)看看初期loss是否快速下降。 - 解冻更多层:如果一开始冻结了太多层,可以尝试解冻整个主干网络甚至全部网络进行微调。
- 简化问题:你的目标是否定义清晰?两类物体是否差异足够大?是否混入了非常模糊或难以定义的样本?
5. 性能评估、优化与伪标签迭代
训练完成后,我们会在测试集上得到最终模型。但工作还没结束。
5.1 模型评估与错误分析
使用训练好的最佳模型(保存在runs/detect/train/weights/best.pt)在测试集上进行评估:
yolo task=detect mode=val model=runs/detect/train/weights/best.pt data=dataset.yaml查看输出的mAP等指标。但数字只是表象,可视化分析错误案例更重要。
- 使用验证/测试集进行预测并可视化:
yolo task=detect mode=predict model=best.pt source=path/to/test/images save=True save_txt=True - 分析预测结果:
- 打开保存的预测图片和标签,与真实标签对比。
- 常见错误类型:
- 误检(False Positive, FP):模型把背景或其它物体当成了目标。这说明模型对目标的特征学习不够准确,或者背景太复杂。需要增加包含此类困难背景的负样本(无目标图片)到训练集,或加强数据增强。
- 漏检(False Negative, FN):模型没有检测出真实存在的目标。这可能是目标太小、太模糊、遮挡严重,或者在训练集中这类样本太少。需要针对性补充此类难例的图片,或使用更小的锚框(Anchor)或更高的输入分辨率(
imgsz)。 - 定位不准(Localization Error):框的位置或大小不准。可能是数据增强中的几何变换太强,或者模型回归头训练不足。可以微调数据增强参数,或增加回归损失的权重(这通常需要修改模型代码,较复杂)。
5.2 伪标签生成与迭代(路径二的实践)
假设我们通过路径一得到了一个还不错的基线模型best.pt,现在尝试利用400张无标签数据。
生成预测:用这个模型对所有无标签图片进行预测,并保存高置信度的结果。
yolo task=detect mode=predict model=best.pt source=path/to/unlabeled_images save=False save_txt=True save_conf=True conf=0.7conf=0.7表示只保存置信度大于0.7的预测框。初始阈值可以设高一些(如0.8-0.9),确保伪标签质量。伪标签后处理:
- 生成的TXT文件就是伪标签。你需要将它们与对应的图片配对,组织成和训练集一样的格式。
- 关键步骤:人工抽样审核!随机抽取5%-10%的伪标签图片,可视化检查。如果发现大量错误,说明模型本身不可靠,伪标签质量差,需要调高
conf阈值,或者先回去提升基线模型的性能。
构建混合数据集:
- 新建一个文件夹
mixed_dataset。 - 将原始的100张有标签数据(图片+标签)复制进去。
- 将筛选后的高质量伪标签数据(图片+伪标签TXT)复制进去。
- 更新
dataset.yaml文件,指向这个新的混合数据集。
- 新建一个文件夹
第二轮训练:
- 使用混合数据集,从零开始训练一个新的模型,或者用
best.pt作为预训练权重继续微调。学习率可以设得更小一些(如lr0=1e-4)。 - 密切监控验证集指标。理想情况下,验证集精度(mAP)应该比第一轮有提升。如果下降,说明伪标签噪声太大,需要清理。
- 使用混合数据集,从零开始训练一个新的模型,或者用
5.3 模型优化与轻量化(可选)
如果对速度有要求,可以考虑:
- 模型剪枝(Pruning):移除网络中不重要的连接或通道。
- 知识蒸馏(Knowledge Distillation):用一个大模型(教师)指导一个小模型(学生)训练,让小模型获得接近大模型的性能。
- 量化(Quantization):将模型权重从浮点数转换为低精度整数(如INT8),大幅减少模型体积和加速推理。YOLOv8官方支持导出为ONNX并进行INT8量化。
这些属于进阶优化,在项目初期,一个性能良好的YOLOv8s模型已经能满足很多部署需求(在GPU上可达每秒几十甚至上百帧)。
6. 常见问题与避坑指南
根据我处理大量小样本项目的经验,以下是一些高频“坑点”和解决方案:
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 训练Loss不下降或下降很慢 | 1. 学习率设置不当(太大或太小) 2. 数据标注有严重错误 3. 模型初始化权重有问题 4. 数据路径配置错误,模型根本没读到数据 | 1. 尝试一个经典学习率(如0.01从头训,0.001微调) 2. 可视化检查训练集前几张图的标签是否正确 3. 确保使用了正确的预训练权重 4. 检查 dataset.yaml中的路径,确保图片和标签文件能被找到 |
| 验证Loss先降后升,mAP停滞或下降 | 过拟合 | 1. 增强数据增强(mosaic, hsv, flip) 2. 增加早停 patience3. 减少模型大小(换更小模型) 4. 收集更多数据(或使用伪标签) |
| mAP始终很低(<0.5) | 1. 任务定义不清或目标太难 2. 数据量严重不足且增强无效 3. 训练集和验证/测试集分布不一致 4. 评估指标或流程有误 | 1. 重新审视任务,两类目标是否视觉上可区分? 2. 尝试更激进的增强,或采用半监督方法 3. 检查数据划分,确保随机化且分层 4. 手动在验证集上运行预测,看定性效果是否真的差 |
| 推理时漏检严重 | 1. 训练时使用的imgsz与推理时不一致2. 置信度阈值 conf设置过高3. 目标在训练集中样本太少或太难 | 1. 训练和推理使用相同的imgsz2. 降低 conf阈值(如从0.25降到0.1)3. 针对性补充难例数据,或使用更小尺度的检测头 |
| 同一个目标被重复检测多个框 | NMS(非极大值抑制)参数设置不当 | 调整推理时的iou阈值(默认0.7)和conf阈值 |
最后的心得:处理小样本目标检测项目,心态要稳。它更像一个“数据工程”和“实验科学”的结合体,而不是简单的调包。第一个模型版本效果不理想是常态。核心在于建立“训练-评估-分析-改进”的快速迭代循环。从100张标注数据出发,通过严谨的数据处理、合理的增强、聪明的算法策略(半监督),完全有可能训练出一个在特定场景下表现优异的专用检测模型。记住,你的目标是解决一个具体问题,而不是在COCO数据集上刷榜。只要模型在你的测试集和真实场景中达到了可接受的精度和召回率,这个项目就是成功的。开始动手吧,遇到具体问题,欢迎带着你的数据和错误日志再来探讨。
