yolov5-seg ,4000张yolo格式的裂缝分割数据
🛠️ 如何使用YOLOv5-seg训练 4000 张 YOLO 格式裂缝分割数据集(含 PR 曲线分析)
✅目标:使用 YOLOv5-seg 模型训练一个高精度的裂缝语义分割模型,支持 4000 张标注图像
✅任务类型:实例分割(Instance Segmentation)——识别并分割出图像中的裂缝区域
✅输出:完整训练流程、配置文件、代码示例、PR曲线解读与优化建议
🔧 一、环境准备
# 创建虚拟环境conda create -n yolov5_segpython=3.9-y conda activate yolov5_seg# 克隆官方 YOLOv5 仓库(含 segmentation 分支)gitclone https://github.com/ultralytics/yolov5.gitcdyolov5# 安装依赖pipinstall-r requirements.txt pipinstalltorch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118✅ 使用
ultralytics/yolov5是推荐版本,已支持segment功能。
📁 二、数据集准备(YOLO 格式)
1. 数据结构要求
datasets/crack_segmentation/ ├── images/ │ ├── train/ # 2800 张训练图 │ └── val/ # 1200 张验证图 └── labels/ ├── train/ # 对应 .txt 文件 └── val/2. YOLO 格式标签(.txt文件)
每行格式:
<class_id> <x_center> <y_center> <width> <height> <segmentation>class_id: 0(裂缝类)<x_center>, <y_center>: 边界框中心点(归一化)<width>, <height>: 边界框宽高(归一化)<segmentation>: 多边形顶点坐标(归一化),格式为:x1 y1 x2 y2 x3 y3 ... xn yn
💡 示例:
labels/train/img_001.txt
0 0.45 0.62 0.2 0.3 0.4 0.6 0.5 0.6 0.55 0.7 0.5 0.7 0.55 0.6 0.5 0.5✅ 建议使用LabelMe或CVAT工具标注,再转换为 YOLO 格式。
📄 三、创建data.yaml
# data.yamlpath:./datasets/crack_segmentationtrain:images/trainval:images/val# number of classesnc:1names:['crack']🎯 四、训练模型(train.py)
# train.pyimportosimportsys sys.path.append('./')frommodels.experimentalimportattempt_loadfromutils.datasetsimportLoadImagesAndLabelsfromutils.generalimportcheck_file,check_img_sizefromutils.plotsimportplot_resultsfromutils.torch_utilsimportselect_device# 设置参数device='0'# GPU 编号batch_size=16imgsz=640epochs=100weights='yolov5s-seg.pt'# 预训练权重(可选)data='data.yaml'name='crack_segmentation'# 启动训练!python train.py \--batch-size{batch_size}\--epochs{epochs}\--img640\--data{data}\--weights{weights}\--name{name}\--device{device}\--workers4\--patience10\--save-period10\--project runs/segment \--exist-ok✅ 输出路径:
runs/segment/crack_segmentation/
📊 五、评估结果与 PR 曲线解读
你提供的Precision-Recall Curve(PR 曲线)显示:
| 特征 | 解读 |
|---|---|
| 初始段接近 (0,1) | 在低召回率下,模型具有很高的精确度(误检少) |
| 下降趋势平缓 | 随着召回率提升,精确度下降较慢 → 模型鲁棒性强 |
| 在 Recall ~0.8 时 Precision ~0.7 | 表明模型在保持较高召回的同时仍能维持良好精度 |
✅理想 PR 曲线特征:
- 越靠近左上角越好
- AUC(曲线下面积)越高越好(>0.9 优秀)
❌ 若曲线陡降,说明模型存在大量误检或漏检。
🧪 六、推理测试(检测 + 分割)
# detect.pyimporttorchfrommodels.experimentalimportattempt_loadfromutils.datasetsimportLoadImagesfromutils.generalimportnon_max_suppression,scale_coordsfromutils.plotsimportplot_one_box,plot_masks# 加载模型model=attempt_load('runs/segment/crack_segmentation/weights/best.pt',map_location='cpu')model.eval()# 推理图片image_path='test.jpg'img=cv2.imread(image_path)img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# 推理withtorch.no_grad():pred=model(torch.tensor(img).permute(2,0,1).float().unsqueeze(0)/255.0)[0]# NMSpred=non_max_suppression(pred,conf_thres=0.5,iou=0.45,classes=None,agnostic=False)# 可视化fordetinpred:iflen(det):for*xyxy,conf,clsindet:# 绘制边界框plot_one_box(xyxy,img,color=(0,255,0),label='crack')# 绘制掩码(mask)mask=det[0][...,5:]# 获取 maskplot_masks(img,mask,xyxy)📈 七、如何提升性能?
1.数据增强
# train.py 中添加--mosaic0.5--mixup0.5--hsv_h0.015--hsv_s0.7--hsv_v0.42.调整学习率
--lr00.001# 初始学习率--warmup_epochs33.使用更大数据量
- 当前 4000 张数据足够训练,但若想更高精度,建议扩充至 8000+ 张
4.模型选择
| 模型 | 参数量 | 精度 | 推荐场景 |
|---|---|---|---|
| yolov5s-seg | 小 | 中 | 移动端/边缘设备 |
| yolov5m-seg | 中 | 高 | 平衡性能 |
| yolov5l-seg | 大 | 很高 | 服务器部署 |
📂 八、导出模型(ONNX / TensorRT)
# export_model.pyfrommodels.experimentalimportattempt_loadimporttorch model=attempt_load('runs/segment/crack_segmentation/weights/best.pt')model.export(format='onnx')# 导出 ONNXmodel.export(format='engine')# 导出 TensorRT(需 CUDA)