简介:输电线路异物检测数据集,面向电力巡检、目标检测研究与工程落地人员。数据约800张真实场景图像,采用YOLO标注格式,包含垃圾、气球、风筝等4个类别,每个类别均有明确的txt标签与对应jpg原图,类别定义可参考包内classes文件。包内共1603个文件,以800张jpg图像、801个txt标注文件为主,另附Python可视化脚本与类别示意图,7z压缩包约287MB;数据集已划分训练集与测试集,运行show脚本即可快速预览标注效果,便于直接接入YOLOv5等模型进行训练与评估。已有232人学习下载,适合需要输电线路异物检测数据集及相关方向毕业设计、算法改进的开发者使用。压缩包内目录与命名规则清晰,图片和标注一一对应,能显著节省数据整理时间,即使刚接触YOLO格式数据集的读者也可通过show脚本快速核对标注,从而把精力集中在模型训练与效果验证上。
1. 输电线上异物检测:为什么 800 张已标注数据就能训练出能用的模型
输电线路巡检里最常见的诉求之一,就是把风筝线、塑料薄膜、防尘网这类挂线异物从巡线图像里找出来。很多人第一反应是「图像目标检测要喂几千上万张图」,所以看到这份约 800 张、YOLO 标注格式的数据集时,第一反应是怀疑:这么少,能训出能用的模型吗?我的回答是:能,而且 800 张聚焦单场景的标注图,配合迁移学习和正确的训练策略,足够撑起一个预研级甚至工程试用级的异物检测器。它适合三类人:刚入门检测想跑通全流程的初学者、需要快速产出电力场景 baseline 的算法工程师、以及做毕业设计或项目预研的同学。数据集的价值不在「大」,而在「标签干净、格式统一、场景聚焦」,这恰恰是训练不翻车的前提。
2. 读懂 YOLO 标注格式:目录结构、坐标归一化与 800 张数据的真实构成
拿到资源后第一件事不是急着训练,而是先搞懂里面装的到底是什么。YOLO 格式的标注「长什么样」、目录「怎么摆」、数据「能不能直接喂进训练框架」,这三件事决定了你后面是省心还是返工。
2.1 YOLO 标注格式的本质:一个 txt 文件描述一张图里的所有目标
YOLO 标注格式的核心就是:每张图片对应一个同名.txt文件,文件名相同、后缀不同,文件放在labels目录下。每一行代表一个目标框,共五个数字,从左到右分别是:
- 类别 id(从 0 开始)
- 归一化后的中心点 x 坐标
- 归一化后的中心点 y 坐标
- 归一化后的框宽度 w
- 归一化后的框高度 h
这就是常说的class_id x_center y_center width height。注意,坐标全部是 0 到 1 之间的小数,除以图片宽高得到的相对值,而不是像素绝对值。这样做的好处是训练时无论输入尺寸怎么缩放,标注都不用重新算。
一个典型的标注文件内容长这样:
0 0.5104 0.3425 0.1250 0.2062 0 0.7321 0.4456 0.0812 0.1543逻辑说明:第一行表示图中第一个异物目标,类别 id 为 0,目标中心位于图片宽度的 51.04% 处、高度的 34.25% 处,框的宽度约占全图宽 12.5%、高度约占全图高 20.6%。如果一张图里有 5 个异物,文件里就有 5 行;如果没有目标,txt 文件为空。参数说明:类别 id 必须在data.yaml里nc(类别数)范围内,越界会导致训练报错或类别静默错乱,这是最常见的低级翻车点。
2.2 数据集目录怎么摆:images、labels 与 train/val 划分
拿到资源后先看目录结构。一份规范的 YOLO 数据集应该长这样:
dataset/ ├── images/ │ ├── train/ │ │ ├── img_0001.jpg │ │ └── ... │ ├── val/ │ │ ├── img_0201.jpg │ │ └── ... │ └── test/ │ ├── img_0251.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── img_0001.txt │ │ └── ... │ ├── val/ │ │ ├── img_0201.txt │ │ └── ... │ └── test/ │ ├── img_0251.txt │ └── ... └── data.yaml对应地,data.yaml里至少要有这几项:
path: /path/to/dataset train: images/train val: images/val test: images/test nc: 1 names: 0: foreign_object逻辑说明:path是数据集根目录的绝对路径或相对于 YAML 文件的路径;train、val、test是相对于path的图片目录,Ultralytics 框架会自动去同名labels目录找标注。参数说明:nc必须和标注文件里出现的最大类别 id + 1 一致,names列表的下标顺序也要对齐。如果这份数据集的异物种类不止一类,比如还区分了塑料薄膜、鸟巢、风筝线,那nc就要写成对应类别数,names依次列出类别名,而不是笼统的foreign_object。
关于 800 张的划分,我的习惯是按 8:2 切训练集和验证集,测试集单独留一小部分或者从验证集里匀。如果原始资源已经给了 train/val/test 划分,那就直接用,不要自己重切,因为别人可能已经按拍摄杆塔、时间、天气做了分层,避免同源图像串到两个集合里导致验证指标虚高。
2.3 拿到资源后第一步:用脚本检查标注质量
我拿到任何标注数据,第一件事都是先跑一遍质量检查,而不是直接开训。这一步能挡住 50% 以上的训练翻车。检查项包括:图片和 txt 是否一一对应、坐标是否越界(大于 1 或小于 0)、是否有空标注文件、类别 id 是否合法。
import os from collections import Counter image_root = "images" label_root = "labels" nc = 1 # 根据 data.yaml 修改 for split in ["train", "val", "test"]: img_dir = os.path.join(image_root, split) lbl_dir = os.path.join(label_root, split) if not os.path.exists(img_dir) or not os.path.exists(lbl_dir): print(f"[跳过] {split} 目录缺失") continue img_names = {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(".jpg")} lbl_names = {os.path.splitext(f)[0] for f in os.listdir(lbl_dir) if f.endswith(".txt")} print(f"[{split}] 图片 {len(img_names)} 张, 标注 {len(lbl_names)} 个") # 1. 无标注的图片 orphan = img_names - lbl_names if orphan: print(f" [!] {len(orphan)} 张图片没有对应标注: {list(orphan)[:5]}") # 2. 坐标越界与类别检查 bad_files = [] cls_counter = Counter() for lbl in lbl_names: path = os.path.join(lbl_dir, lbl + ".txt") with open(path) as f: for line in f: parts = line.strip().split() if len(parts) != 5: bad_files.append((lbl, "字段数不为5")) continue cls_id = int(parts[0]) coords = [float(x) for x in parts[1:]] if cls_id >= nc: bad_files.append((lbl, f"类别id越界: {cls_id}")) if any(c < 0 or c > 1 for c in coords): bad_files.append((lbl, f"坐标越界: {coords}")) cls_counter[cls_id] += 1 # 3. 空标注文件 if os.path.getsize(path) == 0: bad_files.append((lbl, "空txt")) if bad_files: print(f" [!] {len(bad_files)} 个标注存在问题, 前几个: {bad_files[:5]}") else: print(f" [OK] 标注未发现越界/空文件问题") print(f" 类别分布: {dict(cls_counter)}")逻辑说明:这个脚本按 train/val/test 三个分区分别核对图片与标注文件的数量与命名是否对齐;对每个 txt 逐行解析,检查字段数、类别 id、坐标范围,顺带统计各类别目标数量。参数说明:nc要改成你自己data.yaml里的类别数;文件后缀建议统一用小写.jpg,如果资源里是.jpeg或.png,把endswith(".jpg")换成对应后缀或者改为endswith((".jpg", ".jpeg", ".png"))。
这一步跑完,你基本就知道这份数据集的「下限」了。坐标越界的标注可以写个小脚本把所有框 clamp 到 [0, 1] 区间再存回去,这是最稳妥的做法,因为训练时 Ultralytics 虽然也会做容错,但越界框在增强阶段可能产生负数坐标导致 loss 异常。空标注文件建议用网上的负样本图替代,或者干脆把对应图片从训练集里挪走,不要让空图片带着全零标签进训练队列。
3. 训练自己的异物检测模型:环境配置、超参设置与可复现命令
数据检查完毕,接下来进入动手环节。这一步的核心就三个问题:用什么框架、超参怎么定、迁移学习怎么做。很多新手一上来就把 batch 拉满、epoch 干到 300,结果 loss 爆炸、mAP 为零,然后开始怀疑数据集。实际上 800 张图有自己的节奏,照着下面的参数走能少走一大半弯路。
3.1 环境配置:Ultralytics 开源训练框架与依赖安装
当前训练 YOLO 系列最省心的方式就是用 Ultralytics 提供的开源框架,它把数据加载、增强、训练、验证、导出串成了一条命令。环境配置这一步不复杂,但有几个细节决定你后面是否顺手。
pip install ultralytics逻辑说明:这一行会把训练框架连同 PyTorch、OpenCV 等核心依赖一起装进当前 Python 环境。参数说明:建议用 Python 3.10 或 3.11 的干净虚拟环境;如果你有 NVIDIA GPU,先按官方方式装好 CUDA 版 PyTorch 再装 ultralytics,否则会自动装上 CPU 版,训练速度差出几十倍。框架装好后可以验证一下:
yolo --help看到命令列表,说明环境配置完成。验证时注意看输出的版本号,不同小版本在参数名上会有细微差异,老版本写img,新版本写imgsz,现在的写法两个都兼容,但以你实际装到的版本帮助信息为准。
3.2 训练命令与超参:imgsz、batch、epochs 怎么设才不翻车
对 800 张的聚焦场景,我推荐用 YOLOv8n 或 YOLOv8s 这类轻量模型起步,而不是一上来就上 x 系列。理由很简单:异构数据量小,大模型的参数量吃不满,还更容易过拟合。训练命令我习惯写成下面这样:
yolo detect train \ data=data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ workers=4 \ optimizer=auto逻辑说明:model=yolov8n.pt表示加载预训练权重作为初始参数,而不是从随机初始化开始,这一步是本场景能训好的关键;imgsz=640是输入分辨率,训练时框架会自动将任意尺寸的图 letterbox 到统一尺寸;batch=16是显存允许下的经验值;optimizer=auto让框架替你选优化器。参数说明:如果你显存紧张,batch 降到 8,学习率一般不需要手动调,框架会按 batch 自动缩放;workers在 Windows 上容易报 DataLoader 错误,可以降到 2。epochs 100 对 800 张图足够,跑完看 mAP 曲线还稳定上涨就续训 50 轮,不要一上来就 300。
说到损失函数,训练日志里每轮末尾会打印三个 loss:box_loss衡量预测框和真实框的位置偏差,cls_loss衡量类别预测错误,dfl_loss是分布焦点损失,负责回归框边界的精细程度。新手只需要盯一件事:这三个 loss 整体趋势是下降的,mAP 在涨,就不用管单个值的大小。
3.3 迁移学习:预训练权重选型与主干冻结策略
800 张图跟 ImageNet 或 COCO 上训练的预训练权重差距巨大,所以迁移学习的正确姿势是「先冻结主干,再解冻微调」。主干网络负责提取纹理、边缘、形状这些通用特征,这些特征是跨场景通用的;解冻太早,小数据集会把预训练学到的好特征冲掉。
yolo detect train \ data=data.yaml \ model=yolov8n.pt \ epochs=50 \ imgsz=640 \ batch=16 \ freeze=10 \ device=0逻辑说明:freeze=10表示冻结前 10 层网络参数,这些层大多在主干 backbone 里,冻结它们让训练阶段只更新检测头和部分特征层的权重,相当于在预训练特征基础上做适配,而不是重新学习。参数说明:冻结轮数跑完后,如果 mAP 增长变缓,去掉freeze参数再做 50 轮解冻微调,这时学习率建议比冻结阶段低,Ultralytics 默认会自动衰减,一般不用手动干预。对于 v8n 这种小模型,freeze=10 是保守做法;换成 s 或 m 模型可以冻结前 12 到 15 层,效果类似,但训练时间会变长。
3.4 训练过程怎么监控:日志、曲线与止损线
训练不是把命令丢出去等结果就完了。训练日志长这样:
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 3.8G 1.124 0.892 1.217 35 640 2/100 3.8G 1.018 0.774 1.132 42 640 ... 50/100 3.8G 0.623 0.341 0.748 38 640如果前 5 轮所有 loss 不降反升,基本都是超参或标注问题,而不是「模型还在预热」。验证阶段如果 mAP@0.5 在 10 轮后还是 0,先查标注而不是加 epoch。框架会在训练目录下实时落盘results.csv,你可以用任何工具画曲线,也可以用tensorboard看。
tensorboard --logdir runs/detect/train逻辑说明:TensorBoard 会把每个 epoch 的 loss、精度、召回率、mAP 都画出来。参数说明:runs/detect/train是训练输出目录,每跑一次新训练,框架会自动在这个目录下递增生成train2、train3,访问曲线时注意路径,别拿上一次训练的图骗自己。看到 loss 降、mAP 涨,说明模型在学;看到 loss 降但 mAP 从某轮开始横盘,说明该提前止损收敛了。
4. 模型效果怎么验收:mAP、混淆矩阵与误检案例分析
训练完不是看一眼训练日志里的 mAP 就说「搞定了」。电力巡检场景对误检和漏检的容忍度都很低,你需要在验证集上把模型的「黑匣子」打开,看它到底错在哪。这一章讲清楚三个事:指标怎么定、混淆矩阵怎么读、验证结果文件怎么用。
4.1 验收指标:mAP@0.5、mAP@0.5:0.95 与精确率召回率
模型跑完,Ultralytics 会在验证阶段输出一串指标,初学者经常分不清主次。针对输电异物检测这类场景,我按优先级排一张表:
| 指标 | 含义 | 在异物检测里的用法 |
|---|---|---|
| mAP@0.5 | IoU 阈值为 0.5 时的平均精度均值 | 工程验收最常用,AP 越高越实用 |
| mAP@0.5:0.95 | IoU 从 0.5 到 0.95 取平均步长计算 | 学术论文和精细定位场景看这个 |
| Precision | 预测为异物的框中真正是异物的比例 | 误检多时 P 值掉得明显 |
| Recall | 真实异物中被成功召回的比例 | 漏检多时 R 值低 |
对挂线异物来说,漏检比误检更危险,因为漏一个可能造成线路故障,而误检最多增加人工复核成本。所以我验收时先看 Recall,再看 mAP@0.5,最后看 Precision。如果 R 值在 0.85 以上、mAP@0.5 在 0.75 左右,这个模型已经具备预研价值。某些类别目标特别少时,mAP 会被少数类拉低,这时候要单独看每个类别的 AP 值,而不是只盯均值。
4.2 混淆矩阵怎么读:为什么总和不是 100%
验证完成后,框架会生成一张confusion_matrix.png。很多人拿这张图去算行合计和列合计,发现每行加起来不是 100%,以为训练出 bug 了,这就是网上热搜里常说的「yolo 混淆矩阵总合不唯一」问题。
其实混淆矩阵的每一格代表的是「某个真实类别被预测成某个目标类别的归一化比例」,归一化的方式可能是按行做、按列做,也可能是按全局样本数做。YOLO 验证输出的矩阵里还包含background这一类,即没有被任何框覆盖的区域,以及missing行/列。真实目标被漏检时,比例会被归到 background;预测框没有匹配到任何真实目标时,会被归到 background 列。所以行和加起来不是 1 是正常的,因为还有一部分去了背景那一格。
读图时只看三处:主对角线是不是亮;background 列是不是有明显亮点(亮点越高误检越重);某一个具体类别是否整行偏暗(说明该类漏检严重)。我在验收时会把混淆矩阵截图存下来,和 PR 曲线放在一起,作为模型版本的「体检档案」,下次改进后对比用。
4.3 验证命令与结果文件:每个输出字段是什么
标准验证命令如下:
yolo detect val \ data=data.yaml \ model=runs/detect/train/weights/best.pt \ batch=16 \ conf=0.25 \ iou=0.45逻辑说明:conf是置信度阈值,预测框得分低于该值会被丢弃,提高它能压误检但会掉召回;iou是 NMS 的 IoU 阈值,太高容易多个框重叠输出,太低容易把同一个目标拆成两个框。参数说明:验收阶段我用 conf=0.25 看模型极限能力,部署时再根据现场误检率调到 0.4 甚至 0.5。
验证完成后,输出目录下会有这些文件,对应关系如下:
| 文件 | 内容 | 验收时怎么看 |
|---|---|---|
results.csv | 每个 epoch 的完整指标序列 | 看 mAP 曲线趋势自证收敛 |
PR_curve.png | 精确率-召回率曲线 | 曲线下方面积越大越好,确认无断崖 |
F1_curve.png | F1 随置信度变化曲线 | 找到 F1 峰值对应的置信度,部署时可作参考 |
confusion_matrix.png | 类别间误检关系 | 定位哪两个类互相混淆 |
val_batch0_pred.jpg | 验证集预测可视化 | 直接看漏检误检,这是最直观的验收手段 |
我的验收习惯是:先打开val_batch0_pred.jpg用眼睛扫一遍,确认没有明显标错框,再去看 mAP 和混淆矩阵。可视化图里如果出现大量置信度 0.3 以下的勉强框,说明模型学到的特征还不够强,需要回到数据增强或标注质量上找原因,而不是继续加大 epoch。
5. 避坑指南:YOLO 训练中最常踩的 5 个真实问题
这部分是血泪经验汇总。800 张规模的数据集,我前前后后踩过不少坑,挑 5 个出现频率最高的写在这里。每条都按「现象 → 原因 → 解决」来说,对照你自己的训练日志排查。
坑一:训练到一半 loss 变 NaN,mAP 直接归零
现象:前几轮 loss 正常下降,到某个 epoch 突然变成 NaN,之后验证 mAP 永远为 0,训练还在跑但没意义。
原因:最常见的是标注坐标越界导致增强阶段生成负数框;其次是学习率过大,batch 又小,BN 层统计量在后期震荡崩坏,这也是热词里「yolo 训练中 bn 崩溃」提到的场景;个别时候是数据里有损坏图片。
解决:先跑第 2 章的质量检查脚本,把所有越界坐标 clamp 回合法范围;然后调低学习率,Ultralytics 里可以通过lr0=0.005手动指定初始学习率;batch 从 16 提到 32 能显著稳定 BN 统计量。如果数据里混着损坏图片,用脚本做一次图像完整性检测,能打开的文件数量要和图片列表一致。
坑二:坐标越界,模型学出来的框全是歪的
现象:训练日志 loss 正常下降,但可视化预测图里很多框明显偏移,框的中心点跑到目标旁边甚至贴在图像边缘。
原因:标注 txt 里存在大于 1 的坐标值,或者框中心点坐标正确但宽度高度写得过大,导致边界超出图像。Ultralytics 训练时对越界做了部分容错,但增强阶段 mosaic 或平移操作会把越界框放大成错误目标。
解决:强制 clamp。下面这段脚本可以把所有标注的坐标裁剪到 [0, 1] 区间:
import os label_root = "labels" for split in ["train", "val", "test"]: lbl_dir = os.path.join(label_root, split) if not os.path.exists(lbl_dir): continue for name in os.listdir(lbl_dir): if not name.endswith(".txt"): continue path = os.path.join(lbl_dir, name) lines = [] with open(path) as f: for line in f: parts = line.strip().split() if len(parts) != 5: continue cls_id = parts[0] xc, yc, w, h = [float(v) for v in parts[1:]] xc = max(0.0, min(1.0, xc)) yc = max(0.0, min(1.0, yc)) w = max(1e-6, min(1.0, w)) h = max(1e-6, min(1.0, h)) lines.append(f"{cls_id} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}\n") with open(path, "w") as f: f.writelines(lines) print("坐标越界清理完成")逻辑说明:脚本读取每个 txt,将中心点坐标和宽高逐项限制到 [0, 1] 区间内,宽度高度下限设为 1e-6 防止 0 尺寸框。参数说明:1e-6这个下限值不是固定的,如果你的标注里有特别小的目标,可以放宽到 1e-4,但绝不能是 0,否则训练时会出现除零错误。
坑三:类别不平衡,某类异物 AP 等于 0
现象:总 mAP 看起来还行,但拆到每个类别,某类 AP 是 0,混淆矩阵里对应行几乎全暗。
原因:800 张图里可能有几百张是风筝线这类高频异物,塑料薄膜只有几十个框。模型在训练时高频类主导梯度,低频类学到特征不足。
解决:先把每个类别的目标数量统计出来,如果差距超过 10 倍,就做重采样。常见做法是低频类的图片重复进队列,或者用 mosaic 增强把低频类目标拼到多张图里。Ultralytics 里没有直接的重采样开关,我一般会在数据准备阶段对低频类做水平翻转、亮度扰动,生成副本补进训练集。
python scripts/augment_small_class.py --input labels/train --images images/train --class_id 1 --factor 3逻辑说明:这是一个示意性的过采样脚本调用,具体实现是读取标注文件中包含指定 class_id 的图片,复制并做 HSV 抖动和翻转后写回训练集。参数说明:factor控制扩充倍数,低频类和最高频类的比例差多少倍就扩多少倍,不用追求完全均衡,差距缩小到 5 倍以内即可。
坑四:mAP 一直很低,逗号级别的提升都费劲
现象:训练正常,loss 收敛,但 mAP@0.5 卡在 0.5 附近,怎么加 epoch 都不动。
原因:常见的有三类:一是小目标问题,异物在 1920×1080 的原图上只有二三十像素,缩放到 640 后不足 5 个像素,特征基本丢了;二是背景干扰强,杆塔、绝缘子、导线这些结构被误检成异物;三是标注框过紧或过松,导致 IoU 计算吃亏。
解决:先看可视化预测图,如果漏检的都是小目标,用切图推理,把原图切成 640×640 的 patch 分别送入模型,再把结果映射回原图坐标。找一张典型图测试一下,如果切图后召回明显提升,说明问题就在输入分辨率。训练时不要开大 mosaic,因为 mosaic 会进一步把目标缩小,改为 mosaic=0.5 或干脆关掉。
坑五:混淆矩阵总合加起来不等于 100%,以为模型坏了
现象:验证生成的混淆矩阵,按行或按列加起来都不是 100%,有人怀疑是框架 bug 或者模型输出错乱。
原因:这不是 bug。混淆矩阵的每一格代表该行真实类别被预测成对应类别的样本比例,而未被检测出的目标会落到 background 类。YOLO 验证时的 background 归一化方式和前景类不同,所以行和列都不会正好是 100%。搜索引擎上「yolo 混淆矩阵总合不唯一」的说法,本质就是对这个归一化机制的误解。
解决:读图时不要算总合,只看主对角线亮度和 background 列。主对角线亮,说明分类正确率高;background 列亮,说明误检框多。如果 background 列特别亮,把推理阈值conf从 0.25 调到 0.4,通常能压掉大量低置信度误检。
6. 数据增强与迁移学习的组合拳:让 800 张数据在复杂巡检场景下更稳
小数据集最怕的就是「训练时天下无敌,验证时处处碰壁」。模型把训练集背下来了,一换角度、一换光线就露馅。我最后补一个自己常用的收尾技巧:用数据增强参数调节模型的泛化性格,再配合两阶段迁移学习,把模型的鲁棒性拉上去。
针对输电巡线场景,图像里最稳定的干扰变量是光照和角度,最不稳定的则是背景里的杆塔、导线、绝缘子。我的增强配置是这样:
yolo detect train \ data=data.yaml \ model=yolov8n.pt \ epochs=50 \ imgsz=640 \ batch=16 \ freeze=10 \ hsv_h=0.015 \ hsv_s=0.5 \ hsv_v=0.4 \ mosaic=1.0 \ mixup=0.2 \ fliplr=0.5逻辑说明:hsv_h、hsv_s、hsv_v控制色调、饱和度、明度的随机扰动幅度,模拟巡线图像在不同日照下的色偏;fliplr=0.5让一半图像随机水平翻转,因为异物挂线不区分左右方向;mixup=0.2做图像混合,让模型学会在复杂背景下区分目标边缘。参数说明:如果训练图里有大量文字或方向性特征,fliplr可以降到 0.3;如果背景结构复杂导致误检偏高,把mixup降到 0.1 甚至 0,因为 mixup 会生成大量「鬼影目标」,提升定位难度的同时也可能放大误检。
两阶段迁移学习的习惯做法是:第一阶段用上面的冻结命令训 50 轮,第二阶段解冻全部参数,用更低学习率再训 30 轮:
yolo detect train \ data=data.yaml \ model=runs/detect/train/weights/best.pt \ epochs=30 \ imgsz=640 \ batch=16 \ lr0=0.001 \ device=0逻辑说明:加载第一阶段的 best.pt 继续训练,初始学习率压到 0.001,让解冻的主干参数在现有特征基础上微调,而不是从头剧烈震荡。参数说明:如果解冻阶段 mAP 反而下降,说明模型已经过拟合,此时不是继续微调,而是回到第一阶段的权重做推理,或者增加验证集数据。
有一次我在一个类似规模的防风偏数据集上踩过亏:第一阶段冻结训练表现很好,第二阶段解冻后 mAP 从 0.78 掉到 0.71,一开始以为是学习率没调好,后来发现是解冻阶段把预训练主干里的通用纹理特征冲掉了。从那以后我凡是拿到这种小样本数据,都强制走一遍流程:先跑标注质量检查脚本,再冻结主干训练,解冻前先备份第一阶段权重,最后在验证集上做一遍可视化对比,确认第二阶段的改动是净收益再采用。这套流程帮我少走很多弯路,也希望帮到你,祝你的异物检测模型一次跑通。
本文还有配套的精品资源,点击获取