YOLO 实例分割用于构建高精度的语义分割模型实现对管道内部裂缝、腐蚀、错口等缺陷的像素级识别 排水管道缺陷分割数据集的训练及应用文章目录排水管道缺陷语义分割数据集信息表数据集特点总结典型应用场景示例目录结构data.yaml 示例内容用于YOLO系列模型✅ 一、系统环境搭建1. 确认 CUDA 驱动2. 安装 Anaconda 并创建虚拟环境3. 安装依赖项✅ 二、数据准备VOC → YOLO-Seg 格式✅ 假设你的 XML 包含 polygon 标注常见于标注工具如 LabelImg、CVATVOC → YOLO-Seg 转换脚本✅ 三、数据划分train/val✅ 四、data.yaml 配置文件✅ 五、训练 YOLOv8-Seg 模型实例分割✅ 六、推理代码单图 / 批量 / 视频1. 单图推理显示掩码2. 批量推理3. 获取掩码和边界框✅ 七、模型评估✅ 八、模型导出ONNX / TensorRT✅ 九、应用场景与拓展以下文字及代码仅供参考学习使用。排水管道缺陷语义分割数据集信息表序号类别名数量中文名称说明1AJ88支管暗接管道中支管与主干管连接处的暗接现象2BX420变形管道因外力或内部压力导致的形状变化3CJ1353沉积管道内壁沉积物如泥沙、油脂等4PL260破裂管道出现裂缝或断裂5QF78起伏管道内壁不平整有起伏现象6SG779树根树根侵入管道内部7ZW1077障碍物管道内的异物阻塞数据集特点总结特点说明✅像素级标注所有图片均为像素级别的标注确保高精度识别✅VOC格式支持提供.xml文件符合VOC数据集标准适用于大部分模型训练✅真实场景覆盖4055张原图未经过数据增强反映实际管道状况✅标准化分类根据我国规程CJJ181-2012标注了7类常见缺陷便于行业应用✅部分标注图片部分图片进行了详细标注适合研究和开发典型应用场景智能巡检系统结合图像识别技术自动检测并分类管道缺陷。健康状态评估对管道进行定期检测评估其健康状况预防潜在风险。运维管理平台集成到市政设施管理系统中实现数字化、智能化管理。示例目录结构drainage_pipe_defect_dataset/ ├── images/ │ ├── image_0001.jpg │ ├── image_0002.jpg │ └── ... ├── annotations/ │ ├── image_0001.xml │ ├── image_0002.xml │ └── ... └── data.yaml # YOLO训练配置文件可选data.yaml示例内容用于YOLO系列模型train:./drainage_pipe_defect_dataset/images/trainval:./drainage_pipe_defect_dataset/images/valtest:./drainage_pipe_defect_dataset/images/testnc:7names:[AJ,BX,CJ,PL,QF,SG,ZW]11111排水管道缺陷分割数据集4055 张图像7 类缺陷VOC 格式标注可用于构建高精度的语义分割模型实现对管道内部裂缝、腐蚀、错口等缺陷的像素级识别。该任务适用于智能巡检机器人、市政管网健康评估等工业 AI 场景。使用YOLOv8-SegUltralytics YOLO 实例分割模型进行训练和应用。YOLOv8-Seg 支持实例分割任务能够输出每个缺陷的边界框 掩码mask非常适合此类工业检测任务。✅ 一、系统环境搭建1. 确认 CUDA 驱动nvidia-smi要求NVIDIA GPU建议 ≥ RTX 3090 / A100CUDA 版本 ≥ 11.8推荐 12.12. 安装 Anaconda 并创建虚拟环境# 创建环境conda create-npipe_segmentationpython3.9# 激活环境conda activate pipe_segmentation3. 安装依赖项# 安装 PyTorchCUDA 11.8 示例pipinstalltorch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118# 安装 YOLOv8支持分割pipinstallultralytics opencv-python numpy matplotlib lxml scikit-image pillow tensorboard# 验证 GPUpython-cimport torch; print(torch.cuda.is_available())# 应输出 True✅ 二、数据准备VOC → YOLO-Seg 格式YOLOv8-Seg 使用如下格式dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml每个.txt标注文件格式为class_id x1 y1 x2 y2 ... xn yn其中(x1,y1)...(xn,yn)是归一化后的多边形顶点坐标来自 VOC 的polygon或bndbox转为轮廓点。⚠️ 注意VOC 通常用bndbox矩形框但分割需要polygon多边形标注。如果你的数据是bndbox需先转为轮廓近似如矩形四角点或确认是否包含polygon。✅ 假设你的 XML 包含polygon标注常见于标注工具如 LabelImg、CVATVOC → YOLO-Seg 转换脚本# convert_voc_to_yolo_seg.pyimportosfromxml.etree.ElementTreeimportparsefrompathlibimportPathimportnumpyasnp# 类别映射根据 CJJ181-2012classes{crack:0,corrosion:1,dislocation:2,leakage:3,deformation:4,root_intrusion:5,obstruction:6}defpolygon_to_yolo_segment(polygon,img_w,img_h):将多边形点转换为归一化坐标segment[]forpointinpolygon:xfloat(point.find(x).text)/img_w yfloat(point.find(y).text)/img_h segment.append(x)segment.append(y)returnsegmentdefconvert_annotation(xml_file,output_folder):treeparse(xml_file)roottree.getroot()sizeroot.find(size)img_wint(size.find(width).text)img_hint(size.find(height).text)forobjinroot.iter(object):cls_nameobj.find(name).text.strip().lower()ifcls_namenotinclasses:continuecls_idclasses[cls_name]# 提取多边形点假设使用 polygonpolygonobj.find(polygon)ifpolygonisNone:print(fWarning: no polygon in{xml_file})continuepointspolygon.findall(pt)iflen(points)3:continueyolo_segmentpolygon_to_yolo_segment(points,img_w,img_h)txt_fileos.path.join(output_folder,Path(xml_file).stem.txt)withopen(txt_file,a)asf:f.write(f{cls_id}{ .join(f{x:.6f}forxinyolo_segment)}\n)# 执行转换voc_dirpipe_seg_dataset/annotations_vocyolo_label_dirpipe_seg_dataset/labels/trainos.makedirs(yolo_label_dir,exist_okTrue)forxml_fileinPath(voc_dir).glob(*.xml):convert_annotation(xml_file,yolo_label_dir)print(✅ VOC to YOLO-Seg conversion completed.) 如果你的数据只有bndbox可以用矩形四角点模拟多边形xmin,ymin,xmax,ymaxbox polygon[(xmin,ymin),(xmax,ymin),(xmax,ymax),(xmin,ymax)]✅ 三、数据划分train/val# split_data.pyimportrandomfrompathlibimportPathimportshutil img_dirpipe_seg_dataset/images_rawlabel_dirpipe_seg_dataset/labelsout_img_trainpipe_seg_dataset/images/trainout_img_valpipe_seg_dataset/images/valout_lbl_trainpipe_seg_dataset/labels/trainout_lbl_valpipe_seg_dataset/labels/valos.makedirs(out_img_train,exist_okTrue)os.makedirs(out_img_val,exist_okTrue)os.makedirs(out_lbl_train,exist_okTrue)os.makedirs(out_lbl_val,exist_okTrue)imageslist(Path(img_dir).glob(*.jpg))random.shuffle(images)splitint(0.8*len(images))train_filesimages[:split]val_filesimages[split:]defcopy_files(files,img_dst,lbl_dst):forimg_pathinfiles:shutil.copy(img_path,img_dst)lbl_pathlabel_dir/(img_path.stem.txt)iflbl_path.exists():shutil.copy(lbl_path,lbl_dst)copy_files(train_files,out_img_train,out_lbl_train)copy_files(val_files,out_img_val,out_lbl_val)print(✅ Data split: 80% train, 20% val)✅ 四、data.yaml配置文件# data.yamltrain:./pipe_seg_dataset/images/trainval:./pipe_seg_dataset/images/val# 类别数量nc:7# 类别名称names:-crack-corrosion-dislocation-leakage-deformation-root_intrusion-obstruction# 中文名可选names_zh:-裂缝-腐蚀-错口-渗漏-变形-树根侵入-阻塞✅ 五、训练 YOLOv8-Seg 模型实例分割fromultralyticsimportYOLO# 加载预训练的 YOLOv8 分割模型modelYOLO(yolov8l-seg.pt)# 推荐 large 模型或 yolov8m-seg.pt# 开始训练resultsmodel.train(datadata.yaml,epochs300,# 分割任务需要更多 epochbatch16,# 显存足够可用 32imgsz640,# 输入尺寸optimizerAdamW,lr00.001,weight_decay0.0005,# 数据增强分割更需强增强augmentTrue,hsv_h0.015,hsv_s0.7,hsv_v0.4,degrees10.0,translate0.2,scale0.5,flipud0.0,fliplr0.5,mosaic1.0,mixup0.1,# 分割专用overlap_maskTrue,# 掩码重叠处理mask_ratio4,# 掩码下采样率# 学习率调度cos_lrTrue,# 保存projectruns/seg,namepipe_defect_seg,saveTrue,save_period10,exist_okFalse,# 缓存cacheTrue) 模型下载yolov8l-seg.ptUltralytics 官方模型✅ 六、推理代码单图 / 批量 / 视频1. 单图推理显示掩码fromultralyticsimportYOLOimportcv2 modelYOLO(runs/seg/pipe_defect_seg/weights/best.pt)resultsmodel(test_pipe.jpg,conf0.3)forrinresults:# 绘制分割结果annotated_imgr.plot()cv2.imshow(Segmentation Result,annotated_img)cv2.waitKey(0)2. 批量推理resultsmodel.predict(sourcepipe_seg_dataset/images/val,saveTrue,projectruns/predict/seg,nameval_results,conf0.3,imgsz640)3. 获取掩码和边界框forrinresults:boxesr.boxes.xyxy.cpu().numpy()# 边界框classesr.boxes.cls.cpu().numpy()# 类别 IDmasksr.masks.xy# 多边形点列表每个 mask 是 n x 2 数组fori,maskinenumerate(masks):print(f缺陷{int(classes[i])}:{mask.shape}个点)✅ 七、模型评估metricsmodel.val(datadata.yaml,splitval,batch16,imgsz640,save_jsonTrue)print(fmAP0.5 (mask):{metrics.seg.map50:.4f})print(fmAP0.5:0.95 (mask):{metrics.seg.map:.4f})print(fPrecision (mask):{metrics.seg.p:.4f})print(fRecall (mask):{metrics.seg.r:.4f})✅ 八、模型导出ONNX / TensorRT# 导出为 ONNX支持分割model.export(formatonnx,dynamicTrue,opset13,imgsz640)# 导出为 TensorRT高性能部署model.export(formatengine,halfTrue,dynamicTrue)✅ 九、应用场景与拓展应用场景说明智能巡检机器人实时识别管道缺陷并生成报告缺陷面积计算利用掩码像素数估算腐蚀/裂缝面积健康状态评分结合缺陷类型面积给出管道评分GIS 系统集成将缺陷位置与地下管网地图融合以上文字及代码仅供参考学习使用。