Yolov5-seg 实战:从零构建自定义实例分割数据集
1. 环境配置与工具准备第一次接触YOLOv5-seg时我被官方文档里密密麻麻的依赖项吓到了。后来发现其实只要掌握几个关键工具整个过程就会变得非常简单。这里我分享下自己搭建环境的完整过程包括那些官方文档没写的细节。核心工具链只需要两个YOLOv5-seg代码库和Labelme标注工具。建议直接使用v7.0版本这个版本在实例分割任务上最稳定。安装时有个小技巧——先创建一个干净的conda环境conda create -n yolov5_seg python3.8 conda activate yolov5_seg然后处理依赖项时很多人卡在PyTorch的安装上。我的经验是先去PyTorch官网用他们的安装命令然后再安装其他依赖。比如对于CUDA 11.3的用户pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txtLabelme的安装更简单但要注意版本兼容性。3.16.7这个版本对多边形标注的支持最好。遇到过标注时闪退的问题后来发现是Qt版本冲突用下面这个命令可以完美解决pip install labelme3.16.7 pyqt55.15.42. 数据标注实战技巧给工业零件做标注时我踩过最大的坑就是标注规范不统一。比如同一个螺丝孔有人标内径有人标外径。后来我们团队制定了明确的标注规则边缘标注始终标注物体最外缘遮挡处理被遮挡部分按可见轮廓标注小物体小于10x10像素的可以忽略用Labelme标注时这几个快捷键能提升3倍效率CtrlZ撤销上一点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)转换后一定要验证数据。除了原文提到的可视化检查我还建议做这些校验检查所有标注是否在[0,1]范围内确认每个JSON都有对应的图片验证类别索引是否连续这个增强版校验脚本能发现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(fMissing 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(fInvalid class id in {label_file}) coords list(map(float, parts[1:])) if any(x 0 or x 1 for x in coords): print(fOut 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: 根据显存选择工业检测推荐640x640batch-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训练过程中要重点关注这些指标mask_loss: 应该稳步下降val_mask_loss: 与训练损失差距不应过大mAP0.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在工业场景中这几个优化技巧很实用对固定摄像头场景可以预先标定ROI区域小目标检测可以适当降低conf-thres使用TensorRT加速能提升3-5倍推理速度最后分享一个部署后的性能检查脚本import cv2 import torch from time import time model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt) def benchmark(): img cv2.imread(test.jpg) start time() results model(img) print(fInference time: {(time()-start)*1000:.2f}ms) print(results.pandas().xyxy[0])
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2510204.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!