资讯动态

下水管道缺陷检测实战:YOLOv8目标检测数据集与训练部署全解析

发布时间:2026/9/13 14:47:30 来源:尧图企业网站定制
简介这是一套面向目标检测任务的下水管道缺陷检测数据集适合计算机视觉学习者和工业质检项目开发者用于模型训练与算法验证。压缩包共2000个文件包含1717张清晰图片、1717个VOC格式xml标注文件及对应YOLO格式txt标签文件整体61.64MB目录按图片、标注、标签三类组织并附有classes.txt类别对照便于直接接入YOLO、Faster R-CNN等常见检测框架。数据涵盖7类典型管道缺陷共3401个矩形框标注提供中文对照与各类别框数统计其中堆积、裂缝、垃圾等样本量较充足穿入、树根等少见类别也各有数百框可支撑多类别缺陷检测模型的训练与评估。目前已有154人学习使用该数据集标注规范、结构统一能大幅节省人工标注成本适合作为学术实验或工程项目的缺陷识别基础数据。1. 为什么拿 1717 张图做管道缺陷检测我劝你先看标注分布下水管道缺陷检测这几年在市政运维里需求量很大多数团队上手就找公开数据集但真正能用的不多。CCTV 检测车拍回来的视频抽帧容易标注却极贵一个框画错模型训练出来在真实管廊里就会漏报。这套 7 类缺陷、1717 张图、3401 个目标框的数据集最让人放心的是它同时给了 YOLO 和 VOC 两种格式省掉了格式转换这一层最烦琐的体力活。对做目标检测的工程师来说拿到手可以直接训练 YOLOv5/v8 或跑 Detectron2、MMDetection对做市政算法交付的朋友它也能充当基线数据用来验证模型对不同缺陷形态的敏感度。我更看重的是它标签分布的参考价值。垃圾 610 框、裂缝 836 框、堆积 884 框这三类占了绝大多数而泥土只有 187 框、错口只有 200 框。这个比例不平均但非常接近真实管道巡检的缺陷出现频率。训练时若不做任何处理模型会对高频类别过拟合对低频类别错口、泥土、穿入几乎学不到有效特征。换句话讲这个数据集的难点不在“有没有数据”而在“类别不平衡怎么处理”后面我会给出具体的 loss 调整和采样策略。适合的人群我分成两类一类是刚入门目标检测、想拿真实业务数据练手的开发者和学生另一类是做市政算法交付、需要小样本快速验证方案的工程师。前者可以把这套数据当作学习 YOLO 训练全流程的练手项目后者可以用来做预训练迁移或者数据增强实验。要注意的是数据集本身没有附带训练好的权重博主也明确不对模型精度作任何承诺这意味着文件的真实价值完全取决于你怎么用它而不是下载完就能出结果。2. 数据集结构与标注体系YOLO/VOC 双格式的对应关系与前处理2.1 压缩包内三个目录的核心作用解压后你会看到 JPEGImages、Annotations、labels 三个文件夹数量完全对齐1717 张图片对应 1717 个 XML 和 1717 个 TXT。JPEGImages 里是原始图片Annotations 里是 PASCAL VOC 格式的标注labels 里是 YOLO 格式的标注。这是当前开源检测数据集最常见的组织方式好处是不同框架接入时不用再到处找格式转换脚本。VOC 格式的 XML 通过object节点记录每个目标的类别名称和边界框坐标坐标是绝对值单位是像素左上角和右下角各一对 x、y 值。YOLO 格式的 labels 文件每行是一条目标记录五个数值依次是类别 id、归一化中心点 x、归一化中心点 y、归一化宽度 w、归一化高度 h。归一化是指除以图片原始宽高所有数值都在 0 到 1 之间。两种格式之间的差异是初学者最容易踩坑的地方很多人在训练时发现框全部偏到左上角就是因为把 VOC 的绝对坐标直接喂给了 YOLO。2.2 标签类别与中文缺陷对应关系这个数据集的 7 类标签分别是chuanru穿入、cuokou错口、duiji堆积、laji垃圾、liefeng裂缝、nitu泥土、shugen树根。其中“穿入”指的是管道外部物体穿入管内比如其他管线或构筑物侵入“错口”指相邻管节接口处发生错位“堆积”指管道内沉积物形成的堆状物“垃圾”指人为丢弃物“裂缝”指管壁开裂“泥土”指管内淤积的泥浆“树根”指根系侵入管道内部。这些类别是市政排水管道检测中比较典型的缺陷种类CCTV 检测规范里也都有对应的定义。一个值得注意的点是 YOLO 格式的类别顺序和框数统计顺序不对应。项目说明里给出的 chuanru 328 框、cuokou 200 框等统计数据是按类别名称排序的但 labels 文件夹中 TXT 文件的类别 id 以 classes.txt 为准。这意味着你在做类别映射时不能想当然地认为 id 0 就是 chuanru必须打开 classes.txt 看一眼实际顺序。我在实际处理别的数据集时也遇到过类似问题解决方法是训练前写一个校验脚本把每张图的 YOLO 标注解析出来统计每个 id 的框数再和 classes.txt 逐一对应确认无误后再开始训练。2.3 数据集质量校验与可视化脚本拿到数据后的第一步不是直接训练而是做一次完整的数据体检。这里给出一段 Python 脚本思路可以用来验证图片与标注文件的对应关系、检查标注框是否越界、统计每个类别的框数。import os from PIL import Image img_dir JPEGImages label_dir labels img_files set(f.split(.)[0] for f in os.listdir(img_dir) if f.endswith(.jpg)) label_files set(f.split(.)[0] for f in os.listdir(label_dir) if f.endswith(.txt)) missing_label img_files - label_files missing_img label_files - img_files print(f缺标注的图片: {len(missing_label)}, 缺图片的标注: {len(missing_img)}) # 检查YOLO坐标是否越界 for fname in sorted(label_files): with open(os.path.join(label_dir, fname .txt)) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f{fname} 格式错误: {line.strip()}) continue _, cx, cy, w, h map(float, parts) if cx 0 or cx 1 or cy 0 or cy 1: print(f{fname} 中心点越界: {line.strip()}) if w 0 or h 0: print(f{fname} 宽高异常: {line.strip()})这段脚本的核心逻辑分为三步第一通过文件名取交集判断图片和标注是否一一对应缺失情况直接打印名字方便定位第二解析每一行 YOLO 标注检查五个数值的数量和范围第三对越界的中心点和非正的宽高做告警。我在多个开源数据集上跑过这段逻辑通常能查出 1% 到 5% 的脏数据这类问题在训练阶段表现为 loss 不收敛或 mAP 异常偏低。如果发现某张图的标注缺失处理方法不是直接删图而是先看看是不是文件名编码问题比如中文名或空格导致的解析失败。如果确认是漏标建议将该图片移到单独的文件夹不要混在训练集里否则训练时会报 FileNotFoundError 或读到空的标注文件。2.4 VOC 与 YOLO 的相互转换补充方案虽然压缩包已经同时提供了两种格式但实际使用中你还是可能遇到需要转换的场景。比如你想用某个只支持 VOC 格式的标注工具做增补标注就需要把 YOLO 转回 VOC或者你从网上收集了 VOC 格式的新数据需要转成 YOLO 来扩充这个数据集。这里给出一段 YOLO 转 VOC 的核心逻辑使用 lxml 库生成 XML 文件。import os from lxml import etree def yolo_to_voc(img_path, label_path, xml_output_dir, class_names): with open(img_path, rb) as f: img Image.open(f) w, h img.size root etree.Element(annotation) folder etree.SubElement(root, folder) folder.text JPEGImages filename etree.SubElement(root, filename) filename.text os.path.basename(img_path) size etree.SubElement(root, size) width etree.SubElement(size, width) width.text str(w) height etree.SubElement(size, height) height.text str(h) with open(label_path) as f: for line in f: parts line.strip().split() cls_id, cx, cy, bw, bh map(float, parts) xmin int((cx - bw / 2) * w) ymin int((cy - bh / 2) * h) xmax int((cx bw / 2) * w) ymax int((cy bh / 2) * h) obj etree.SubElement(root, object) name etree.SubElement(obj, name) name.text class_names[int(cls_id)] bndbox etree.SubElement(obj, bndbox) for tag, val in [(xmin, xmin), (ymin, ymin), (xmax, xmax), (ymax, ymax)]: node etree.SubElement(bndbox, tag) node.text str(val) xml_str etree.tostring(root, pretty_printTrue) out_path os.path.join(xml_output_dir, os.path.splitext(os.path.basename(img_path))[0] .xml) with open(out_path, wb) as f: f.write(xml_str)这里需要注意坐标转换时先减半宽高再乘图片尺寸不要反过来。很多人在这一步出错把中心点直接当左上角用导致生成的框整体偏移半个目标。另一个常见问题是类别名映射YOLO 类别 id 必须通过 classes.txt 对应到 VOC 的类别名称顺序一旦搞错生成的 XML 里类别就是错的训练时模型的分类头学到的全是错误映射。3. 基于 YOLOv8 的管道缺陷检测训练参数配置与实战流程3.1 为什么推荐从 YOLOv8 而不是 YOLOv5 开始虽然 YOLOv5 的资料更多社区更成熟但 YOLOv8 在训练流程上有几个明显的优势对这套数据集尤其合适。第一YOLOv8 原生支持多尺度训练和自动数据增强策略对小目标比如裂缝、穿入这类细长或小面积缺陷的鲁棒性更好。第二YOLOv8 的 anchor-free 设计省去了聚类 anchor 的步骤YOLOv5 时代你需要单独跑 k-means 脚本算 anchor 尺寸YOLOv8 自动适配省了一道工序。第三YOLOv8 提供了更干净的训练日志和验证输出对初学者更友好。如果你只有 CPU 环境建议不要直接上 YOLOv8哪怕是最小的 n 模型训练 1717 张图也要很久。这种情况下我建议用 YOLOv5s 或者 YOLOv8n并且开启混精度训练同时在配置里把 batch size 降到 4 以下。如果你有 NVIDIA 显卡哪怕是 GTX 1660 这种 6GB 显存的卡也能顺利跑 YOLOv8s只是 epoch 不要设太大50 轮以内比较合适。3.2 数据集配置文件的正确写法YOLOv8 使用 YAML 文件描述数据集路径和类别信息。这里给出一份可以直接套用的配置注意路径要改成你自己机器上的绝对路径。# pipe_defect.yaml path: /data/pipe_defect_dataset # 数据集根目录 train: images/train # 训练图片相对路径 val: images/val # 验证图片相对路径 names: 0: chuanru 1: cuokou 2: duiji 3: laji 4: liefeng 5: nitu 6: shugen这份配置里最关键的是 names 字段的顺序必须和 classes.txt 完全一致。这个数据集没有显式划分 train/val/test 目录需要你自己做切分。常见做法是按 8:1:1 或 7:2:1 的比例随机划分但要注意同一张图片的三种文件jpg、xml、txt必须同步移动否则训练时会因为找不到对应文件而报错。我这里给出一个稳定的切分思路使用 sklearn 的 train_test_split 或者直接用 python 的 random 模块对文件名列表做 shuffle然后通过集合运算生成三个子集再逐一移动文件。切分时另一个容易忽略的点是类别均衡。如果随机切分导致验证集中完全没有“泥土”或“错口”类别的样本验证时的 mAP 会严重失真你以为模型学得很好实际上只是验证集恰好避开了难点。所以切分后一定要检查验证集中每个类别的框数比例如果发现某些类别为零建议改为按图像级分层采样确保每个类别的图片在训练集和验证集中都存在。3.3 训练命令与关键参数的含义说明YOLOv8 的训练命令非常简洁所有参数通过命令行传入。这里给出一个经过调优的配置适合 6GB 显存的显卡。yolo detect train \ modelyolov8s.pt \ datapipe_defect.yaml \ epochs80 \ imgsz640 \ batch8 \ lr00.01 \ lrf0.01 \ momentum0.937 \ weight_decay0.0005 \ optimizerAdamW \ ampTrue \ patience15 \ projectpipe_defect_runs \ nameexp1逐项解释关键参数的含义modelyolov8s.pt加载 COCO 预训练权重做迁移学习。这套数据集只有 1717 张图从零训练很难收敛迁移学习会把骨干网络的底层特征直接复用大幅缩短训练时间。想更快就换 yolov8n.pt想更准就换 yolov8m.pt但显存要 8GB 以上。epochs80训练轮数。这个数据集规模不大80 轮足够让模型充分收敛。轮数过多会过拟合表现为训练 loss 持续下降但验证 mAP 不再上升甚至下降patience15 的作用就是检测到这种情况自动早停。imgsz640训练时输入图片的尺寸。640 是 YOLOv8 的默认值兼顾精度和速度。如果裂缝或树根这类细长目标在你的场景里很小可以试试 960但显存占用会显著上升。batch8每批次图片数量。显存不够就降到 4但梯度噪声会变大建议同时微调 lr0 到 0.005 左右。ampTrue开启自动混合精度训练能在几乎不损失精度的情况下减少 30% 到 50% 显存占用。optimizerAdamWYOLOv8 默认是 SGD但 AdamW 在小数据集上收敛更稳尤其是类别不平衡的场景下AdamW 的适应性更好。3.4 类别不平衡问题的处理策略之前提到过这个数据集中泥土 187 框、错口 200 框而堆积 884 框、裂缝 836 框高频类别是低频类别的 4 倍以上。直接训练会导致模型对低频类别的召回率极低典型表现是验证时泥土类的 mAP 只有 0.1 左右而堆积类能到 0.8。解决办法有四个路径按推荐程度排布。第一个是修改 loss 权重。YOLOv8 的训练配置支持通过cls系数调整分类损失的权重但对不同类别设置不同权重需要修改源码里的 loss 计算部分门槛稍高。第二个是使用过采样策略从训练集中复制泥土和错口类别的图片让模型在每轮 epoch 中更多次地看到这些样本。这个办法简单直接缺点是可能过拟合因为复制不增加新的多样性。第三个是使用数据增强对图片做随机旋转、缩放、亮度调整人为产生更多包含低频类别的新样本。YOLOv8 自带 mosaic 和 mixup 增强默认开启但对低频类别的影响不是定向的建议手动对样本做增强扩充。第四个是调整置信度阈值和 NMS 参数在推理阶段降低对低频类别的置信度门限让模型更容易把模糊区域判成泥土或错口。我实际跑下来的经验是先不做任何处理直接训练一轮拿到 baseline然后只针对泥土和错口两类各复制 1 到 2 份样本再训练一轮对比 mAP 变化。如果提升明显再考虑其他策略。不要一上来就用复杂的采样方法先把 baseline 跑通后续优化才有对比依据。4. VOC 格式评估流程从 XML 解析到 mAP 计算的完整链条4.1 为什么需要独立的评估脚本YOLOv8 自带的验证命令会输出一张完整的 P-R 曲线和各类别 mAP那把 VOC 格式单独拿出来讲有什么意义原因有两层。第一评测脚本不依赖任何框架可以用同一套逻辑比较 YOLOv8、Faster R-CNN、SSD 等多种模型的性能而不是被 YOLOv8 的验证逻辑绑死。第二如果后期要部署到边缘设备比如 Jetson Nano需要手工计算每一类的 AP 来决定哪些类别可以降低置信度阈值这时手写评估脚本比调用框架内部函数更灵活。4.2 从 VOC XML 到模型预测结果的匹配逻辑VOC 格式评估的核心是算 IoU然后把每个预测框和真实框配对。基本流程是解析 XML 得到真实框的类别和坐标把模型输出的预测框按置信度降序排列对每个预测框计算它与所有同类真实框的 IoU取最大值如果 IoU 大于阈值通常是 0.5且该真实框没有被其他预测框匹配过就记为 TP否则是 FP遍历完所有预测框后没被匹配到的真实框是 FN。最后根据 TP、FP、FN 计算每个类别的 precision 和 recall绘制 P-R 曲线曲线下的面积就是 AP。实际评估时要注意两个极易出错的点。一是类别匹配必须在同类别内部进行不同类别之间不计算 IoU否则模型把裂缝预测成树根IoU 再高也不算正确。二是 IoU 阈值选取直接影响结果0.5 是 VOC 系列的默认标准COCO 用 0.5:0.95 的平均值两者数字差异很大写报告时要明确标注指标口径。4.3 一段可复用的 VOC 评估核心代码这里给出一个精简版的 mAP 计算脚本聚焦于 IoU 计算和 TP/FP 分配逻辑便于理解整个评估链条。import numpy as np def compute_iou(box1, box2): # box格式: [xmin, ymin, xmax, ymax] x1 max(box1[0], box2[0]) y1 max(box1[1], box2[1]) x2 min(box1[2], box2[2]) y2 min(box1[3], box2[3]) inter_area max(0, x2 - x1) * max(0, y2 - y1) box1_area (box1[2] - box1[0]) * (box1[3] - box1[1]) box2_area (box2[2] - box2[0]) * (box2[3] - box2[1]) union_area box1_area box2_area - inter_area return inter_area / union_area def evaluate_class(pred_boxes, gt_boxes, iou_thresh0.5): # pred_boxes: 按置信度降序排列的列表 # 每个元素为 [xmin, ymin, xmax, ymax, conf] gt_matched [False] * len(gt_boxes) tp [] fp [] for pred in pred_boxes: best_iou 0 best_idx -1 for i, gt in enumerate(gt_boxes): if gt_matched[i]: continue iou compute_iou(pred[:4], gt) if iou best_iou: best_iou iou best_idx i if best_iou iou_thresh and best_idx 0: gt_matched[best_idx] True tp.append(1) fp.append(0) else: tp.append(0) fp.append(1) tp np.cumsum(tp) fp np.cumsum(fp) recall tp / max(len(gt_boxes), 1) precision tp / np.maximum(tp fp, 1e-6) return precision, recall这段代码的核心思想是贪心匹配对每个预测框找到 IoU 最大的未匹配真实框达到阈值就视为命中。逐点累积 TP 和 FP 后可以画出阶梯形的 P-R 曲线AP 就是曲线下面积。如果某个图像有多张类似目标且模型输出了多个高重叠预测框逻辑会确保同一个真实框只被匹配一次避免重复计数。实际使用中pred_boxes 来自模型输出文件格式取决于部署方式。如果是在 YOLOv8 的验证集上做可以用yolo predict输出 txt 文件再写解析脚本读取如果是用 TensorRT 部署可以从推理引擎的输出张量解析。gt_boxes 则从 XML 里提取提取时要注意 VOC 坐标是整数像素值模型输出如果是归一化坐标需要先乘回图片尺寸。4.4 评估结果异常时的排查思路跑完评估后发现 mAP 很低先别急着调模型按顺序排查三个环节。第一检查模型输出的坐标是否是归一化值比如 YOLOv8 的输出是 0 到 1 的 float如果直接和 XML 里的像素坐标算 IoU数值几乎必然为零mAP 当然垫底。第二检查类别 id 映射是否正确很多预训练模型的输出类别顺序和这个数据集的 classes.txt 不一致比如把 id 2 当成 duiji但模型实际输出的是 conflict就会导致每张图的匹配全部失败。第三检查图片缩放方式模型推理时通常会把图片 resize 到正方形但 VOC 标注是原始分辨率下的坐标如果用缩放后的图片推理预测框坐标也必须同步变换否则坐标空间不一致导致 IoU 计算失真。5. 模型部署与推理加速导出 ONNX 和 TensorRT 的完整路径5.1 从 PyTorch 权重到 ONNX 的导出过程训练完成后模型文件通常是.pt格式这是 PyTorch 的序列化权重。直接把.pt文件部署到生产环境有诸多不便比如需要完整的 PyTorch 运行环境推理速度不够快难以集成到 C 或 Java 服务。把权重导出为 ONNX 格式是迈向部署的关键一步ONNX 是一种开放的模型交换格式被 TensorRT、OpenVINO、ONNX Runtime 等多种推理引擎支持。yolo export modelpipe_defect_runs/exp1/weights/best.pt formatonnx opset12 simplifyTrue这条命令把训练好的best.pt导出为 ONNX 格式。opset12指定 ONNX 算子集的版本版本太低可能缺失某些算子支持太高则部分推理引擎不兼容simplifyTrue会调用 onnx-simplifier 对计算图做优化删除冗余节点使模型更小、推理更快。导出完成后可以用onnxruntime加载 ONNX 文件做一次推理验证确认输出和 PyTorch 原模型基本一致。import onnxruntime as ort import numpy as np from PIL import Image sess ort.InferenceSession(best.onnx) input_name sess.get_inputs()[0].name img Image.open(test.jpg).resize((640, 640)) img_array np.array(img).astype(np.float32) / 255.0 img_array img_array.transpose(2, 0, 1)[None, :, :, :] outputs sess.run(None, {input_name: img_array}) # 输出格式: [1, 84, 8400]84 4(坐标) 80(COCO类别) # 对这个数据集则应该是 [1, 12, 8400]12 4 7 1(置信度)这段验证代码里输入图片做了归一化和通道前置这是 ONNX 模型的标准输入格式。输出张量的形状变化源于 YOLOv8 的网络结构8400 是特征图上的预测框数量12 表示每个框有 4 个坐标值、7 个类别概率和 1 个综合置信度。如果你导出时用了自定义类别数输出维度会相应变化不要再按 COCO 的 80 类去解析。5.2 TensorRT 加速的量化选择与实际收益TensorRT 是 NVIDIA 官方的推理加速引擎它能把 ONNX 模型转换成针对特定 GPU 高度优化的计算图。转换完成后推理速度通常能比 PyTorch 原生提升 3 到 5 倍。对于管道缺陷检测这种可能有实时性要求的场景比如 CCTV 检测车在管道内行进时实时判断缺陷类型TensorRT 的价值非常明显。trtexec --onnxbest.onnx --saveEnginebest.engine --fp16trtexec是 TensorRT 自带的命令行工具--fp16开启半精度推理。半精度能进一步缩短推理时间但注意它可能带来 1% 到 2% 的精度损失。如果精度敏感可以选择先跑 FP32 引擎作为对比基准再切换到 FP16 或 INT8。INT8 需要提供校准数据集通常会让模型缩小一半以上速度提升更明显但精度波动也更大。对于管道缺陷检测我建议先从 FP16 开始因为缺陷纹理细节丰富INT8 可能在裂缝和树根这种细长目标上丢失边缘特征。5.3 推理时后处理的几个关键参数ONNX 或 TensorRT 的输出是未经过 NMS非极大值抑制的原始张量需要自己做后处理。这个环节有三个参数直接影响最终检测效果。第一个是置信度阈值通常设置在 0.25 到 0.5 之间阈值越低召回越高但误检也越多。第二个是 NMS 的 IoU 阈值最常用的是 0.45它控制相邻框的合并程度。第三个是输入图片尺寸倍率如果你的真实图片分辨率不是 640需要按比例缩放后填充灰色边框而不是直接拉伸否则目标比例失真。后处理里还有一个常见陷阱不同类别的置信度分布差异。在这个数据集上模型对堆积和垃圾类别的置信度往往高于泥土和错口因为后两者训练样本少。实际部署时我建议给不同类别设置不同的置信度阈值比如泥土设为 0.15堆积设为 0.35这样整体召回率会更均衡。实现方式是解析模型输出的 7 个类别概率时按类别索引去查阈值表。6. 数据挖掘技巧用特征分布定位模型失效场景并做增量标注模型训练完、评估通过、部署上线看起来任务结束了但实际工作中这才到真正有意义的部分——发现模型在哪些场景下失效、如何用最少的标注成本补齐短板。这里分享一套我从这个数据集中总结出来的思路它适用于所有类别不平衡的检测任务。6.1 利用置信度分布筛选困难样本YOLOv8 训练结束后在验证集上把每张图片的预测结果保存下来包括各类别的置信度分数。按图片分组后统计每张图的平均置信度和最大置信度然后找出平均置信度最低的 20 张图。这些图大概率包含了模型难以识别的目标可能是遮挡严重、光线不足或目标过小。把这类图片挑选出来重点分析你会快速掌握当前模型的视觉盲区在哪里。yolo detect predict modelbest.pt sourceval_images save_txtTrue save_confTrue这条命令会输出每个预测框的坐标和置信度到 TXT 文件配合脚本解析后即可得到每张图的置信度分布。逐个查看置信度最低的图片时建议同时打开对应的原图和真值标注对比模型漏掉了什么、误判了什么然后在笔记本上记录共性特征。比如可能发现模型在管壁有水渍反光时容易把裂缝漏掉或者树根在图片边缘时置信度显著下降。这些记录就是增量标注的指导清单。6.2 半自动标注流程模型预标注 人工修正确认了模型薄弱场景后通常的做法是从原始 CCTV 录像或未标注图片中提取类似场景的图片用当前模型做预标注然后人工修正。半自动标注的效率远高于纯手工标注尤其是目标边缘清晰的堆积和垃圾类。工具方面推荐使用 LabelImg 或 X-AnyLabeling前者是轻量级工具支持 VOC 格式直接读写后者内置了 YOLO 系列模型的推理可以一键生成预标注框再手动调整。这里要强调一个边界半自动标注的修正环节不能省。模型生成预标注框后必须逐张检查类别是否正确、边界是否贴合缺陷区域。管线行业内对标注精度的要求通常是不低于 95% 的 IoU否则训练出的模型在小目标上的表现会持续恶化。对于裂缝这种细长目标建议在标注时适当扩大边界框使其覆盖裂缝两侧的暗色过渡区这样模型在推理时更容易捕获完整特征而不是只检测到裂缝中间段。6.3 增量训练中的超参数调整策略新增标注数据后不建议直接从头训练完整数据集更高效的做法是在现有权重上做微调。核心区别是学习率必须大幅降低否则会把之前学好的特征破坏掉。常见做法是把 lr0 设为 0.001大约是初始训练的十分之一训练轮数也缩减到 20 到 30 轮因为新增数据量通常不大模型只需要少量迭代就能适应新样本。yolo detect train \ modelpipe_defect_runs/exp1/weights/best.pt \ datapipe_defect_aug.yaml \ epochs25 \ imgsz640 \ batch8 \ lr00.001 \ lrf0.01 \ ampTrue \ patience10对比初始训练的配置这里的关键变化是 lr0 从 0.01 降到了 0.001epochs 从 80 降到了 25。为什么不是继续用 0.01 一开始就训因为模型已经收敛到某个局部最优附近较大学习率会导致参数在最优解附近震荡甚至跳出有效区域造成精度反而下降。另一方面patience 也降到了 10因为增量数据少早停更敏感如果连续 10 轮验证 mAP 没提升就停止防止过拟合到少量新样本上。6.4 增量数据扩增时的类别比例控制增量标注不是均匀补充而是要针对性补齐之前的短板。假设初始训练中泥土类只有 187 框增量数据就应该让泥土类至少增加到 400 框以上错口类从 200 框提升到 350 框左右。对于已经足够多的堆积和垃圾类增量标注只需要少量补充保持数据分布相对均衡即可。实际操作时我通常设定一个目标框数表每类目标框数除以总框数不低于 8%不高于 25%超出这个区间的类别优先补充。按这个标准去检查这个数据集会发现泥土187 框占 5.5%和错口200 框占 5.9%都低于 8% 的下限这就是最优先补的两类。补完后重新做训练对比实验你会发现整体 mAP 不一定大幅上涨但低频类别的召回率会有显著改善这正是增量标注最大的价值所在。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价