一文学习yolov5 实例分割:从训练到部署

1.模型介绍

1.1 YOLOv5结构

SF-YOLOv5: A Lightweight Small Object Detection Algorithm Based on Improved Feature Fusion Mode论文中给出了yolov5的结构框图:
在这里插入图片描述
SPPF块与传统的SPP之间的差异:
在这里插入图片描述

特征融合的几种结构:
在这里插入图片描述
YOLOV5的特征融合结构:
在这里插入图片描述

Ultralytics YOLOv5 Architecture 官方文档给出的详细的整体架构如下:
在这里插入图片描述

1.2 YOLOv5 推理时间

YOLOv5 CPU Export Benchmarks 给出的CPU推断时间:

benchmarks: weights=yolov5s.pt, imgsz=640, batch_size=1, data=/usr/src/app/data/coco128.yaml, device=, half=False, test=False, pt_only=False
Checking setup...
YOLOv5 🚀 v6.1-174-gc4cb7c6 torch 1.11.0+cpu CPU
Setup complete ✅ (96 CPUs, 1007.7 GB RAM, 1948.4/3519.3 GB disk)

Benchmarks complete (128.39s)
                   Format  mAP@0.5:0.95  Inference time (ms)
0                 PyTorch        0.4623                56.52
1             TorchScript        0.4623                59.21
2                    ONNX        0.4623                60.95
3                OpenVINO        0.4623                27.44
4                TensorRT           NaN                  NaN
5                  CoreML           NaN                  NaN
6   TensorFlow SavedModel        0.4623                70.84
7     TensorFlow GraphDef        0.4623                72.44
8         TensorFlow Lite        0.4623               130.43
9     TensorFlow Edge TPU           NaN                  NaN
10          TensorFlow.js           NaN                  NaN

https://learnopencv.com/custom-object-detection-training-using-yolov5/给出的时间:在这里插入图片描述

2.构建数据集

参考labelme+yolov5实例分割:自定义数据集制作、训练与注意点,使用labelme来构建yolov5支持的数据集。

2.1 使用labelme标注数据集

pip安装labelme,打开目录进行标注。

2.2 生成coco格式label

使用位于labelme-main\examples\instance_segmentation目录下的labelme2coco.py文件。

python  labelme2coco.py labelme标注json文件夹  coco目标文件夹 --labels labels.txt路径

查看设置的生成目录,存在以下三个文件:
在这里插入图片描述

2.3 coco格式转yolo格式

使用官方提供的转换工具 general_json2yolo.py

代码中稍加修改2出:

  • 修改1
if __name__ == "__main__":
    source = "COCO"

    if source == "COCO":
        convert_coco_json(
            "../datasets/coco/annotations",  # directory with *.json
            use_segments=True,
            cls91to80=True,
        )

改为:

if __name__ == "__main__":
    source = "COCO"

    if source == "COCO":
        convert_coco_json(
            "上一步生成的coco文件目录",  # directory with *.json
            use_segments=True,
            cls91to80=False,# 这里修改成False
        )
  • 修改2
    在这里插入图片描述
    修改为:
            # Write
            with open((fn / f[11:]).with_suffix(".txt"), "a") as file: #去掉字符串的父路径
                for i in range(len(bboxes)):
                    line = (*(segments[i] if use_segments else bboxes[i]),)  # cls, box or segments
                    file.write(("%g " * len(line)).rstrip() % line + "\n")

运行

转换后的结果位于此文件同目录下的new_dir文件夹/labels/annotations目录中。一张图片对应一个txt文件。

3.训练

3.1 整理数据集

将上面环节生成的数据集保存成以下层次:

dataset
   images
      train
      val
   labels
      train
      val

3.2 修改配置文件

在git主目录下的data文件夹下新建或者修改自定义项目的数据集配置文件:

path:数据集目录
train:训练集目录
val:验证集目录

# Classes 
names:
  0: cat1
  1: cat2
  ...

3.3 执行代码进行训练

python segment/train.py --model yolov5s-seg.pt --data data/custom.yaml --epochs 5 --img 640

4.使用OpenCV进行c++部署

https://github.com/doleron/yolov5-opencv-cpp-python/tree/main

参考文献

[1] https://learnopencv.com/custom-object-detection-training-using-yolov5/
[2] YOLOv5 CPU Export Benchmarks
[3] https://github.com/ultralytics/yolov5/releases
[4] https://sh-tsang.medium.com/brief-review-yolov5-for-object-detection-84cc6c6a0e3a
[5] Ultralytics YOLOv5 Architecture
[6] SF-YOLOv5: A Lightweight Small Object Detection Algorithm Based on Improved Feature Fusion Mode
[7] labelme+yolov5实例分割:自定义数据集制作、训练与注意点

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 20:34:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 20:34:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 20:34:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 20:34:04       20 阅读

热门阅读

  1. Ubuntu22.04嵌入开发环境之NFS文件系统

    2024-06-09 20:34:04       11 阅读
  2. 力扣面试题17.18.最短超串

    2024-06-09 20:34:04       11 阅读
  3. leetcode 1514.概率最大的路径

    2024-06-09 20:34:04       10 阅读
  4. C语言中的变量和常量是什么,以及它们的区别

    2024-06-09 20:34:04       7 阅读
  5. cocos入门8:向量叉乘

    2024-06-09 20:34:04       8 阅读
  6. Mybatis-plus 自动填充字段

    2024-06-09 20:34:04       11 阅读