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

Yolov5-seg 实战:从零构建自定义实例分割数据集

1. 环境配置与工具准备

第一次接触YOLOv5-seg时,我被官方文档里密密麻麻的依赖项吓到了。后来发现其实只要掌握几个关键工具,整个过程就会变得非常简单。这里我分享下自己搭建环境的完整过程,包括那些官方文档没写的细节。

核心工具链只需要两个:YOLOv5-seg代码库和Labelme标注工具。建议直接使用v7.0版本,这个版本在实例分割任务上最稳定。安装时有个小技巧——先创建一个干净的conda环境:

conda create -n yolov5_seg python=3.8 conda activate yolov5_seg

然后处理依赖项时,很多人卡在PyTorch的安装上。我的经验是先去PyTorch官网用他们的安装命令,然后再安装其他依赖。比如对于CUDA 11.3的用户:

pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt

Labelme的安装更简单,但要注意版本兼容性。3.16.7这个版本对多边形标注的支持最好。遇到过标注时闪退的问题,后来发现是Qt版本冲突,用下面这个命令可以完美解决:

pip install labelme==3.16.7 pyqt5==5.15.4

2. 数据标注实战技巧

给工业零件做标注时,我踩过最大的坑就是标注规范不统一。比如同一个螺丝孔,有人标内径有人标外径。后来我们团队制定了明确的标注规则:

  1. 边缘标注:始终标注物体最外缘
  2. 遮挡处理:被遮挡部分按可见轮廓标注
  3. 小物体:小于10x10像素的可以忽略

用Labelme标注时,这几个快捷键能提升3倍效率:

  • Ctrl+Z撤销上一点
  • Space锁定当前多边形
  • Esc完成当前标注

建议先创建好目录结构再开始标注:

dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/

标注过程中有个重要细节:Labelme默认把JSON和图片放一起,但训练时需要分离。我写了个自动整理脚本:

import shutil import os def organize_files(src_dir): for root, _, files in os.walk(src_dir): for file in files: if file.endswith('.json'): shutil.move(os.path.join(root, file), os.path.join(root, '../labels', file))

3. 数据格式转换详解

原始文章里的转换脚本已经很实用,但实际项目中我发现几个需要改进的地方。首先是类别处理,原脚本只支持单类别,我扩展了多类别支持:

classes = ['bolt', 'nut', 'washer'] # 多类别示例 def parse_json(json_path): with open(json_path) as f: data = json.load(f) shapes = data['shapes'] img_h = data['imageHeight'] img_w = data['imageWidth'] results = [] for shape in shapes: label = shape['label'] points = np.array(shape['points']) # 归一化处理 points[:, 0] /= img_w points[:, 1] /= img_h results.append(f"{classes.index(label)} " + " ".join([f"{x:.6f}" for x in points.flatten()])) return "\n".join(results)

转换后一定要验证数据。除了原文提到的可视化检查,我还建议做这些校验:

  1. 检查所有标注是否在[0,1]范围内
  2. 确认每个JSON都有对应的图片
  3. 验证类别索引是否连续

这个增强版校验脚本能发现90%的问题:

def validate_labels(label_dir, img_dir): for label_file in os.listdir(label_dir): img_file = label_file.replace('.txt', '.jpg') if not os.path.exists(os.path.join(img_dir, img_file)): print(f"Missing image for {label_file}") with open(os.path.join(label_dir, label_file)) as f: for line in f: parts = line.strip().split() if not parts[0].isdigit(): print(f"Invalid class id in {label_file}") coords = list(map(float, parts[1:])) if any(x < 0 or x > 1 for x in coords): print(f"Out of range in {label_file}")

4. 模型训练与调优

配置文件修改是新手最容易出错的地方。以coco128-seg.yaml为例,关键参数要这样设置:

train: ../dataset/images/train val: ../dataset/images/val nc: 3 # 类别数 names: ['bolt', 'nut', 'washer'] # 类别名称

模型配置文件(yolov5s-seg.yaml)通常只需要改类别数:

nc: 3 # 与数据配置一致

开始训练时,这几个参数对结果影响最大:

  • img-size: 根据显存选择,工业检测推荐640x640
  • batch-size: 尽可能大但不要爆显存
  • epochs: 通常100-300足够
  • data: 指向修改后的数据配置文件

完整的训练命令示例:

python segment/train.py \ --data data/custom_seg.yaml \ --cfg models/segment/yolov5s-seg.yaml \ --batch-size 16 \ --epochs 150 \ --img 640 \ --name bolt_detection

训练过程中要重点关注这些指标:

  1. mask_loss: 应该稳步下降
  2. val_mask_loss: 与训练损失差距不应过大
  3. mAP@0.5: 主要评估指标

5. 模型验证与部署

训练完成后,用这个命令测试模型效果:

python segment/predict.py \ --weights runs/train/bolt_detection/weights/best.pt \ --source test_images/ \ --img-size 640 \ --conf-thres 0.25

实际部署时,我推荐用ONNX格式。转换命令:

python export.py \ --weights runs/train/bolt_detection/weights/best.pt \ --include onnx \ --img-size 640 640

在工业场景中,这几个优化技巧很实用:

  1. 对固定摄像头场景,可以预先标定ROI区域
  2. 小目标检测可以适当降低conf-thres
  3. 使用TensorRT加速能提升3-5倍推理速度

最后分享一个部署后的性能检查脚本:

import cv2 import torch from time import time model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt') def benchmark(): img = cv2.imread('test.jpg') start = time() results = model(img) print(f"Inference time: {(time()-start)*1000:.2f}ms") print(results.pandas().xyxy[0])
http://www.jsqmd.com/news/629695/

相关文章:

  • QLVideo如何实现macOS视频预览扩展的跨格式支持技术方案
  • 最新PHP客服系统源码 _ 多商户客服 _ 在线客服系统源码 附教程
  • 暗黑2存档编辑器:打造完美游戏体验的终极解决方案
  • 三步掌握微信聊天记录永久保存:你的数字记忆守护者
  • .Acwing基础课第题-简单-区间和缀
  • 桌布机维护与优化技巧:延长设备使用寿命,全自动桌布机/全自动斗篷雨衣机/浴帘机/鸡眼机,桌布机源头厂家推荐 - 品牌推荐师
  • 三菱 FX5U/Q 系列 PLC 以太网通讯中间件功能说明书
  • AI必克6款AI论文神器:一键搞定毕业,真实参考文献秒生成 - 麟书学长
  • 3分钟掌握ComfyUI智能图像修复:只修局部,不伤整体
  • 【仅剩最后217份】:《大模型热更新SOP白皮书》V2.3(含Kubernetes Operator配置模板+Prometheus热更健康度监控看板)
  • 大模型热更新不是“reload_model()”!从PyTorch DDP到FSDP的4层状态一致性保障机制(含内存快照校验算法)
  • 3DGS代码解析实战:从模块导入到训练流程详解
  • VSCode远程调试WSL程序实战:从GDB命令到内存查看的完整调试手册
  • libcrypt-dev安装指南:解决crypt.h缺失报错
  • 智能仓储AGV运维实战:C#上位机对接科聪/极智嘉MQTT协议,远程调度+故障诊断一步到位
  • 基于TMS320F28027的智能晾衣架系统
  • 【前沿探索】自监督学习与扩散模型:图像去噪技术的双重革新
  • 如何免费解锁Cursor Pro:3步实现AI编程助手无限使用
  • 小米摄像机RTSP固件刷机完全指南:解锁专业监控与区域限制解决方案
  • 免费查AI率靠谱吗?深度解读AIGC检测的准确性和局限
  • Codex使用教程:在PyTorch项目开发中借助AI编程助手提升效率
  • 新160个crackMe算法分析-34-fireworx.5.exe
  • Nanbeige 4.1-3B与LaTeX结合:学术论文智能写作助手
  • 3岁到15岁:如何用Scratch和Python打造孩子的编程成长路线图(附资源清单)
  • 中学学校教材下载
  • 从零到一:Logisim实战构建智能交通灯控制系统
  • STM32定时器外部计数模式实战:高精度频率计设计与优化
  • 如何用baidupankey智能工具3秒获取百度网盘提取码:告别繁琐搜索的终极指南
  • 2026年4月不锈钢抛丸六角管定制需要多少钱,不锈钢抛丸方钢/不锈钢抛丸六角棒,不锈钢抛丸六角管设计需要多少钱 - 品牌推荐师
  • 终极指南:如何用 FIFA 23 Live Editor 打造你的完美足球世界