当前位置:   article > 正文

YOLOv9改进 | 提供YOLOv9全系列支持YOLOv9n、YOLOv9s、V9m、V9l、V9x的修改方式(全网独家首发)_yolov9模型有哪几种

yolov9模型有哪几种

一、本文介绍

大家好,本文给大家带来的是2024年2月21日全新发布的SOTA模型YOLOv9的补全教程(算是一种补全吧我个人认为),了解V7的读者都知道V7系列是不支持模型深度和宽度的修改的也就是没有办法像YOLOv8那样有多个版本(例如:V9n、V9s、V9m、V9l、V9x这样),所以我也是在YOLOv9最新版本的基础上给大家把这个共功能添加上了(修改模型的深度和宽度从而产生达到不同版本的效果),本文的内容均为我个人整理和撰写,创作不易,大家可以帮忙点赞评论支持一下!

专栏地址YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

目录

一、本文介绍

二、模型获取和训练

2.1 训练教程

2.2 模型下载 

三、 添加多版本教程

3.1 修改一

3.2 修改二

3.3 修改三 

四、运行对比

4.1 gelan-n

4.1.1 gelan-n.yaml文件

4.1.2 运行截图 

4.2 gelan-s

4.2.1 gelan-s.yaml文件 

4.2.1 运行截图

4.3 gelan-m

4.3.1 gelan-m.yaml文件

4.3.2 运行截图 

4.4 gelan-l

4.4.1 gelan-l.yaml文件

4.4.1 运行截图 

4.5 gelan-x

4.5.1  gelan-x.yaml文件

4.5.1 运行截图 

五、全文总结 


二、模型获取和训练

2.1 训练教程

在开始之前大家肯定要学会训练自己的YOLOv9模型(比较特殊)所以我这里给大家总结了教程,大家有需要的可以点击下面的链接进行跳转到我另一篇的文章里(文章里详细介绍了如何训练、验证、导出、推理等功能)。

使用教程:YOLOv9 | 利用yolov9训练自己的数据集 -> 推理、验证(源码解读 + 手撕结构图)


2.2 模型下载 

YOLOv9已经开源在Github上了,地址如下->

官方论文地址: 官方论文地址点击即可跳转

官方代码地址: 官方代码地址点击即可跳转 


三、 添加多版本教程

下面给大家添加上教程,修改教程很简单大家看着修改即可。


3.1 修改一

首先我们下载完YOLOv9的官方代码之后,我们找到如下的文件'models/yolo.py'文件,在其中找到'def parse_model(d, ch):  # model_dict, input_channels(3)'。

下面的代码就是红框内的代码大家复制即可,省的自己可能打错字! 

  1. if m in (RepNCSPELAN4,):
  2. args[1] = make_divisible(args[1] * gw, 8)
  3. args[2] = make_divisible(args[2] * gw, 8)
  4. args[3] = max(round(args[3] * gd), 1) if n > 1 else n


3.2 修改二

同样还是同一个文件我们往下翻一下找到'elif m is CBLinear:'然后按照我给的图片内修改即可,修改后的代码我以及提供了大家复制替换下即可。

            c2 = [int(x * gw) for x in args[0]]


3.3 修改三 

修改完上面之后我们可以找到我们的模型配置文件进行修改了,我这里以'models/detect/gelan.yaml'为例。进行修改,

修改后的yaml文件提供给大家! 

  1. # YOLOv9
  2. # parameters
  3. nc: 80 # number of classes
  4. depth_multiple: 0.33 # model depth multiple
  5. width_multiple: 0.25 # layer channel multiple
  6. #activation: nn.LeakyReLU(0.1)
  7. #activation: nn.ReLU()
  8. # anchors
  9. anchors: 3
  10. # gelan backbone
  11. backbone:
  12. [
  13. # conv down
  14. [-1, 1, Conv, [64, 3, 2]], # 0-P1/2
  15. # conv down
  16. [-1, 1, Conv, [128, 3, 2]], # 1-P2/4
  17. # elan-1 block
  18. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 2
  19. # avg-conv down
  20. [-1, 1, Conv, [256, 3, 2]], # 3-P3/8
  21. # elan-2 block
  22. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 4
  23. # avg-conv down
  24. [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
  25. # elan-2 block
  26. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 6
  27. # avg-conv down
  28. [-1, 1, Conv, [512, 3, 2]], # 7-P5/32
  29. # elan-2 block
  30. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 8
  31. ]
  32. # gelan head
  33. head:
  34. [
  35. # elan-spp block
  36. [-1, 1, SPPELAN, [512, 256]], # 9
  37. # up-concat merge
  38. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
  39. [[-1, 6], 1, Concat, [1]], # cat backbone P4
  40. # elan-2 block
  41. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 12
  42. # up-concat merge
  43. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
  44. [[-1, 4], 1, Concat, [1]], # cat backbone P3
  45. # elan-2 block
  46. [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 15 (P3/8-small)
  47. # avg-conv-down merge
  48. [-1, 1, Conv, [256, 3, 2]],
  49. [[-1, 12], 1, Concat, [1]], # cat head P4
  50. # elan-2 block
  51. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 18 (P4/16-medium)
  52. # avg-conv-down merge
  53. [-1, 1, Conv, [512, 3, 2]],
  54. [[-1, 9], 1, Concat, [1]], # cat head P5
  55. # elan-2 block
  56. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 21 (P5/32-large)
  57. # detect
  58. [[15, 18, 21], 1, DDetect, [nc]], # Detect(P3, P4, P5)
  59. ]

到此就修改完了,此时我们的模型就支持修改深度和宽度系数了,修改的教程也很简单不知道为什么YOLOv7的作者不提供,所以这里我也是给其做了一个补全,其中修改一的修改方法主要是因为其yaml文件配置的参数都放到了args的位置所以不能直接插入到下面的判断里,所以大家注意不要修改错了!  


四、运行对比

上面我们提供了修改的教程,下面提供几个版本的yaml文件和运行截图供大家参考。

4.1 gelan-n

4.1.1 gelan-n.yaml文件

下面的两个参数是X版本对应的深度和宽度系数。

depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple

  1. # YOLOv9
  2. # parameters
  3. nc: 80 # number of classes
  4. depth_multiple: 0.33 # model depth multiple
  5. width_multiple: 0.25 # layer channel multiple
  6. #activation: nn.LeakyReLU(0.1)
  7. #activation: nn.ReLU()
  8. # anchors
  9. anchors: 3
  10. # gelan backbone
  11. backbone:
  12. [
  13. # conv down
  14. [-1, 1, Conv, [64, 3, 2]], # 0-P1/2
  15. # conv down
  16. [-1, 1, Conv, [128, 3, 2]], # 1-P2/4
  17. # elan-1 block
  18. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 2
  19. # avg-conv down
  20. [-1, 1, Conv, [256, 3, 2]], # 3-P3/8
  21. # elan-2 block
  22. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 4
  23. # avg-conv down
  24. [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
  25. # elan-2 block
  26. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 6
  27. # avg-conv down
  28. [-1, 1, Conv, [512, 3, 2]], # 7-P5/32
  29. # elan-2 block
  30. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 8
  31. ]
  32. # gelan head
  33. head:
  34. [
  35. # elan-spp block
  36. [-1, 1, SPPELAN, [512, 256]], # 9
  37. # up-concat merge
  38. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
  39. [[-1, 6], 1, Concat, [1]], # cat backbone P4
  40. # elan-2 block
  41. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 12
  42. # up-concat merge
  43. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
  44. [[-1, 4], 1, Concat, [1]], # cat backbone P3
  45. # elan-2 block
  46. [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 15 (P3/8-small)
  47. # avg-conv-down merge
  48. [-1, 1, Conv, [256, 3, 2]],
  49. [[-1, 12], 1, Concat, [1]], # cat head P4
  50. # elan-2 block
  51. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 18 (P4/16-medium)
  52. # avg-conv-down merge
  53. [-1, 1, Conv, [512, 3, 2]],
  54. [[-1, 9], 1, Concat, [1]], # cat head P5
  55. # elan-2 block
  56. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 21 (P5/32-large)
  57. # detect
  58. [[15, 18, 21], 1, DDetect, [nc]], # Detect(P3, P4, P5)
  59. ]

4.1.2 运行截图 


4.2 gelan-s

4.2.1 gelan-s.yaml文件 

下面的两个参数是X版本对应的深度和宽度系数。

depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

  1. # YOLOv9
  2. # parameters
  3. nc: 80 # number of classes
  4. depth_multiple: 0.33 # model depth multiple
  5. width_multiple: 0.50 # layer channel multiple
  6. #activation: nn.LeakyReLU(0.1)
  7. #activation: nn.ReLU()
  8. # anchors
  9. anchors: 3
  10. # gelan backbone
  11. backbone:
  12. [
  13. # conv down
  14. [-1, 1, Conv, [64, 3, 2]], # 0-P1/2
  15. # conv down
  16. [-1, 1, Conv, [128, 3, 2]], # 1-P2/4
  17. # elan-1 block
  18. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 2
  19. # avg-conv down
  20. [-1, 1, Conv, [256, 3, 2]], # 3-P3/8
  21. # elan-2 block
  22. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 4
  23. # avg-conv down
  24. [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
  25. # elan-2 block
  26. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 6
  27. # avg-conv down
  28. [-1, 1, Conv, [512, 3, 2]], # 7-P5/32
  29. # elan-2 block
  30. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 8
  31. ]
  32. # gelan head
  33. head:
  34. [
  35. # elan-spp block
  36. [-1, 1, SPPELAN, [512, 256]], # 9
  37. # up-concat merge
  38. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
  39. [[-1, 6], 1, Concat, [1]], # cat backbone P4
  40. # elan-2 block
  41. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 12
  42. # up-concat merge
  43. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
  44. [[-1, 4], 1, Concat, [1]], # cat backbone P3
  45. # elan-2 block
  46. [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 15 (P3/8-small)
  47. # avg-conv-down merge
  48. [-1, 1, Conv, [256, 3, 2]],
  49. [[-1, 12], 1, Concat, [1]], # cat head P4
  50. # elan-2 block
  51. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 18 (P4/16-medium)
  52. # avg-conv-down merge
  53. [-1, 1, Conv, [512, 3, 2]],
  54. [[-1, 9], 1, Concat, [1]], # cat head P5
  55. # elan-2 block
  56. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 21 (P5/32-large)
  57. # detect
  58. [[15, 18, 21], 1, DDetect, [nc]], # Detect(P3, P4, P5)
  59. ]

4.2.1 运行截图


4.3 gelan-m

4.3.1 gelan-m.yaml文件

下面的两个参数是X版本对应的深度和宽度系数。

depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple

  1. # YOLOv5 本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/312841
    推荐阅读
    相关标签