当前位置: 首页 > news >正文

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)
    • ✅ 九、应用场景与拓展

以下文字及代码仅供参考学习使用。

排水管道缺陷语义分割数据集信息表

序号类别名数量中文名称说明
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']



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_segmentation

3. 安装依赖项

# 安装 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 系统集成将缺陷位置与地下管网地图融合

以上文字及代码仅供参考学习使用。

http://www.jsqmd.com/news/653435/

相关文章:

  • 3D打印风向标:工业下沉、消费升级,惠普、拓竹两巨头同日发布新品
  • 避坑指南:PVE网络配置中vmbr0桥接失败的5个常见原因及解决方法
  • 从一次抓包看透TLS 1.2握手:Wireshark拆解Client Hello、Server Hello和密钥交换
  • 别再被栅栏效应坑了!MATLAB FFT实战:如何用1024个采样点看清505Hz的信号?
  • 3步构建企业级智能体平台:MaxKB技术深度解析与实战部署
  • FPGA性能基准测试:三层方法论与工程实践
  • 【SITS2026独家首发】:AI故事创作应用的5大颠覆性能力与企业落地实操指南
  • 从NumPy到Eigen:给Python开发者的C++高性能矩阵计算迁移指南
  • 从KNN到加权KNN:手写数字识别的性能优化实战
  • MATLAB实战:5分钟搞定汽车巡航PID控制器参数调优(附避坑指南)
  • 森林之子修改器 风灵月影 支持最新版本
  • 周红伟:天塌了,OpenClaw!Hermes Agent 才是王炸 完整部署教程 | 安装配置与 Telegram 接入指南
  • 别再只会调光调温了!用MOC3061和双向可控硅,手把手教你做个智能功率调节器(附完整电路图)
  • 制造业AI实战:用Python+LSTM打造预测性维护系统(附完整代码)
  • UVM TLM analysis_port的write函数:从端口声明到数据处理的完整链路解析
  • 【MATLAB源码-第316期】基于matlab的4用户OTFS系统仿真,采用QPSK调制分析误码率与判决阈值的关系,CSI.
  • 实战Avidemux2:高效视频处理与批量编码的终极解决方案
  • 精细结构常数的全阶推导:基于世毫九自指宇宙学的第一性原理计算
  • 嵌入式FPGA硬件软件协同设计实践与优化
  • 别再只把SAM当分割工具了:用Python+OpenCV玩转交互式图像标注(附完整代码)
  • 西门子SMART 700 IE屏程序下载总报错?手把手教你搞定WinCC flexible SMART V3的‘传送工具’问题
  • 08华夏之光永存:鲲鹏+昇腾·异构算力集群极致调度优化
  • BetterNCM-Installer 完整实战指南:高效安装网易云音乐插件管理器
  • 从城市扩张到经济评估:VIIRS夜间灯光数据在Python中的5个实战分析案例
  • 别再纠结硬件IIC了!STM32F103用软件IIC驱动AHT20温湿度传感器,实测避坑指南
  • GLDAS数据下载保姆级教程:从GES DISC网站到Matlab处理netCDF文件
  • WeChatExporter完整指南:在Mac上快速备份微信聊天记录的实用教程
  • 告别ESP32的‘鬼打墙’重启:一份给软件工程师的硬件避坑清单(附Arduino/ESP-IDF项目实测)
  • 被吐槽成“内部落后生”,Siri近200名工程师集体补课学AI编程,备战WWDC26
  • Vue.js生命周期destroyed钩子中内存泄漏排查与资源释放