YOLO 实例分割用于构建高精度的 **语义分割模型**,实现对管道内部裂缝、腐蚀、错口等缺陷的像素级识别 排水管道缺陷分割数据集的训练及应用
YOLO 实例分割用于构建高精度的语义分割模型,实现对管道内部裂缝、腐蚀、错口等缺陷的像素级识别 排水管道缺陷分割数据集的训练及应用
文章目录
- 排水管道缺陷语义分割数据集信息表
- 数据集特点总结
- 典型应用场景
- 示例目录结构
- `data.yaml` 示例内容(用于YOLO系列模型)
- ✅ 一、系统环境搭建
- 1. 确认 CUDA 驱动
- 2. 安装 Anaconda 并创建虚拟环境
- 3. 安装依赖项
- ✅ 二、数据准备(VOC → YOLO-Seg 格式)
- ✅ 假设你的 XML 包含 `<polygon>` 标注(常见于标注工具如 LabelImg、CVAT)
- VOC → YOLO-Seg 转换脚本
- ✅ 三、数据划分(train/val)
- ✅ 四、`data.yaml` 配置文件
- ✅ 五、训练 YOLOv8-Seg 模型(实例分割)
- ✅ 六、推理代码(单图 / 批量 / 视频)
- 1. 单图推理(显示掩码)
- 2. 批量推理
- 3. 获取掩码和边界框
- ✅ 七、模型评估
- ✅ 八、模型导出(ONNX / TensorRT)
- ✅ 九、应用场景与拓展
以下文字及代码仅供参考学习使用。
排水管道缺陷语义分割数据集信息表
| 序号 | 类别名 | 数量 | 中文名称 | 说明 |
|---|---|---|---|---|
| 1 | AJ | 88 | 支管暗接 | 管道中支管与主干管连接处的暗接现象 |
| 2 | BX | 420 | 变形 | 管道因外力或内部压力导致的形状变化 |
| 3 | CJ | 1353 | 沉积 | 管道内壁沉积物,如泥沙、油脂等 |
| 4 | PL | 260 | 破裂 | 管道出现裂缝或断裂 |
| 5 | QF | 78 | 起伏 | 管道内壁不平整,有起伏现象 |
| 6 | SG | 779 | 树根 | 树根侵入管道内部 |
| 7 | ZW | 1077 | 障碍物 | 管道内的异物阻塞 |
数据集特点总结
| 特点 | 说明 |
|---|---|
| ✅像素级标注 | 所有图片均为像素级别的标注,确保高精度识别 |
| ✅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']!
1
1
1
1
1
排水管道缺陷分割数据集(4055 张图像,7 类缺陷,VOC 格式标注)可用于构建高精度的语义分割模型,实现对管道内部裂缝、腐蚀、错口等缺陷的像素级识别。该任务适用于智能巡检机器人、市政管网健康评估等工业 AI 场景。
使用YOLOv8-Seg(Ultralytics YOLO 实例分割)模型进行训练和应用。YOLOv8-Seg 支持实例分割任务,能够输出每个缺陷的边界框 + 掩码(mask),非常适合此类工业检测任务。
✅ 一、系统环境搭建
1. 确认 CUDA 驱动
nvidia-smi- 要求:NVIDIA GPU(建议 ≥ RTX 3090 / A100)
- CUDA 版本 ≥ 11.8(推荐 12.1)
2. 安装 Anaconda 并创建虚拟环境
# 创建环境conda create-npipe_segmentationpython=3.9# 激活环境conda activate pipe_segmentation3. 安装依赖项
# 安装 PyTorch(CUDA 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-c"import 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、CVAT)
VOC → YOLO-Seg 转换脚本
# convert_voc_to_yolo_seg.pyimportosfromxml.etree.ElementTreeimportparsefrompathlibimportPathimportnumpyasnp# 类别映射(根据 CJJ181-2012)classes={'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:x=float(point.find('x').text)/img_w y=float(point.find('y').text)/img_h segment.append(x)segment.append(y)returnsegmentdefconvert_annotation(xml_file,output_folder):tree=parse(xml_file)root=tree.getroot()size=root.find('size')img_w=int(size.find('width').text)img_h=int(size.find('height').text)forobjinroot.iter('object'):cls_name=obj.find('name').text.strip().lower()ifcls_namenotinclasses:continuecls_id=classes[cls_name]# 提取多边形点(假设使用 <polygon>)polygon=obj.find('polygon')ifpolygonisNone:print(f"Warning: no polygon in{xml_file}")continuepoints=polygon.findall('pt')iflen(points)<3:continueyolo_segment=polygon_to_yolo_segment(points,img_w,img_h)txt_file=os.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_dir='pipe_seg_dataset/annotations_voc'yolo_label_dir='pipe_seg_dataset/labels/train'os.makedirs(yolo_label_dir,exist_ok=True)forxml_fileinPath(voc_dir).glob('*.xml'):convert_annotation(xml_file,yolo_label_dir)print("✅ VOC to YOLO-Seg conversion completed.")🔁 如果你的数据只有
<bndbox>,可以用矩形四角点模拟多边形:xmin,ymin,xmax,ymax=box polygon=[(xmin,ymin),(xmax,ymin),(xmax,ymax),(xmin,ymax)]
✅ 三、数据划分(train/val)
# split_data.pyimportrandomfrompathlibimportPathimportshutil img_dir='pipe_seg_dataset/images_raw'label_dir='pipe_seg_dataset/labels'out_img_train='pipe_seg_dataset/images/train'out_img_val='pipe_seg_dataset/images/val'out_lbl_train='pipe_seg_dataset/labels/train'out_lbl_val='pipe_seg_dataset/labels/val'os.makedirs(out_img_train,exist_ok=True)os.makedirs(out_img_val,exist_ok=True)os.makedirs(out_lbl_train,exist_ok=True)os.makedirs(out_lbl_val,exist_ok=True)images=list(Path(img_dir).glob('*.jpg'))random.shuffle(images)split=int(0.8*len(images))train_files=images[:split]val_files=images[split:]defcopy_files(files,img_dst,lbl_dst):forimg_pathinfiles:shutil.copy(img_path,img_dst)lbl_path=label_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 分割模型model=YOLO('yolov8l-seg.pt')# 推荐 large 模型,或 yolov8m-seg.pt# 开始训练results=model.train(data='data.yaml',epochs=300,# 分割任务需要更多 epochbatch=16,# 显存足够可用 32imgsz=640,# 输入尺寸optimizer='AdamW',lr0=0.001,weight_decay=0.0005,# 数据增强(分割更需强增强)augment=True,hsv_h=0.015,hsv_s=0.7,hsv_v=0.4,degrees=10.0,translate=0.2,scale=0.5,flipud=0.0,fliplr=0.5,mosaic=1.0,mixup=0.1,# 分割专用overlap_mask=True,# 掩码重叠处理mask_ratio=4,# 掩码下采样率# 学习率调度cos_lr=True,# 保存project='runs/seg',name='pipe_defect_seg',save=True,save_period=10,exist_ok=False,# 缓存cache=True)📌 模型下载:
yolov8l-seg.pt:Ultralytics 官方模型
✅ 六、推理代码(单图 / 批量 / 视频)
1. 单图推理(显示掩码)
fromultralyticsimportYOLOimportcv2 model=YOLO('runs/seg/pipe_defect_seg/weights/best.pt')results=model('test_pipe.jpg',conf=0.3)forrinresults:# 绘制分割结果annotated_img=r.plot()cv2.imshow('Segmentation Result',annotated_img)cv2.waitKey(0)2. 批量推理
results=model.predict(source='pipe_seg_dataset/images/val',save=True,project='runs/predict/seg',name='val_results',conf=0.3,imgsz=640)3. 获取掩码和边界框
forrinresults:boxes=r.boxes.xyxy.cpu().numpy()# 边界框classes=r.boxes.cls.cpu().numpy()# 类别 IDmasks=r.masks.xy# 多边形点列表(每个 mask 是 n x 2 数组)fori,maskinenumerate(masks):print(f"缺陷{int(classes[i])}:{mask.shape}个点")✅ 七、模型评估
metrics=model.val(data='data.yaml',split='val',batch=16,imgsz=640,save_json=True)print(f"mAP@0.5 (mask):{metrics.seg.map50:.4f}")print(f"mAP@0.5:0.95 (mask):{metrics.seg.map:.4f}")print(f"Precision (mask):{metrics.seg.p:.4f}")print(f"Recall (mask):{metrics.seg.r:.4f}")✅ 八、模型导出(ONNX / TensorRT)
# 导出为 ONNX(支持分割)model.export(format='onnx',dynamic=True,opset=13,imgsz=640)# 导出为 TensorRT(高性能部署)model.export(format='engine',half=True,dynamic=True)✅ 九、应用场景与拓展
| 应用场景 | 说明 |
|---|---|
| 智能巡检机器人 | 实时识别管道缺陷并生成报告 |
| 缺陷面积计算 | 利用掩码像素数估算腐蚀/裂缝面积 |
| 健康状态评分 | 结合缺陷类型+面积给出管道评分 |
| GIS 系统集成 | 将缺陷位置与地下管网地图融合 |
以上文字及代码仅供参考学习使用。
