最新创新点改进推荐

-统一使用 YOLO 代码框架,结合不同模块来构建不同的YOLO目标检测模型。

 《芒果书》系列改进专栏内的改进文章,均包含多种模型改进方式,均适用于YOLOv3 、YOLOv4 、 YOLOR 、 YOLOX 、YOLOv5 、 YOLOv7 、 YOLOv8 改进(重点)!!!

 专栏创新点教程 均有不少同学反应和我说已经在自己的数据集上有效涨点啦!! 包括COCO数据集也能涨点

所有文章博客均包含 改进源代码部分,一键训练即可

 对应专栏订阅的越早,就可以越早使用原创创新点去改进模型,抢先一步

点击查看详情:YOLOv5改进、YOLOv7改进|YOLO改进超过50种注意力机制,全篇共计30万字(内附改进源代码),原创改进50种Attention注意力机制和Transformer自注意力机制

芒果书 点击以下链接 查看文章目录详情

☁️:一、CSDN原创《芒果改进YOLO高阶指南》强烈改进涨点推荐!推荐指数: ☁️:二、CSDN原创YOLO进阶 | 《芒果改进YOLO进阶指南》改进涨点推荐!推荐指数: ☁️:三、CSDN独家全网首发专栏 | 《目标检测YOLO改进指南》改进涨点推荐!推荐指数:

文章目录

最新创新点改进推荐一、理论部分二、将其应用到YOLOv7中配置文件核心代码其他配置运行配置

一、理论部分

这个模块比较简单,就直接上代码了.

C2f模块来自YOLOv8系列,本质上改进借鉴了YOLOv7核心模块的思想,所以这个严格来说不算改进。

YOLOv5作者 和 YOLOv8作者 是用一个作者,所以没必要基于YOLOv5加这个了…作者本身就是基于 YOLOv5 改进得到的 YOLOv8

就简单试一下效果吧

这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好

图中C2f模块就是ultralytics改进的模块

C2f模块结合了C3模块以及ELAN模块的思想设计 图源:https://github.com/ultralytics/ultralytics/issues/189

二、将其应用到YOLOv7中

配置文件

增加以下yolov7_c2f.yaml文件 代码演示

# YOLOv5  by YOLOAir, GPL-3.0 license

# parameters

nc: 80 # number of classes

depth_multiple: 1.0 # model depth multiple

width_multiple: 1.0 # layer channel iscyy multiple

# anchors

anchors:

- [12,16, 19,36, 40,28] # P3/8

- [36,75, 76,55, 72,146] # P4/16

- [142,110, 192,243, 459,401] # P5/32

# yolov7 backbone

backbone:

# [from, number, module, args]

[[-1, 1, Conv, [32, 3, 1]], # 0

[-1, 1, Conv, [64, 3, 2]], # 1-P1/2

[-1, 1, Conv, [64, 3, 1]],

[-1, 1, Conv, [128, 3, 2]], # 3-P2/4

[-1, 1, C2f, [128]],

[-1, 1, Conv, [256, 3, 2]],

[-1, 1, MP, []],

[-1, 1, Conv, [128, 1, 1]],

[-3, 1, Conv, [128, 1, 1]],

[-1, 1, Conv, [128, 3, 2]],

[[-1, -3], 1, Concat, [1]], # 16-P3/8

[-1, 1, Conv, [128, 1, 1]],

[-2, 1, Conv, [128, 1, 1]],

[-1, 1, Conv, [128, 3, 1]],

[-1, 1, Conv, [128, 3, 1]],

[-1, 1, Conv, [128, 3, 1]],

[-1, 1, Conv, [128, 3, 1]],

[[-1, -3, -5, -6], 1, Concat, [1]],

[-1, 1, Conv, [512, 1, 1]],

[-1, 1, MP, []],

[-1, 1, Conv, [256, 1, 1]],

[-3, 1, Conv, [256, 1, 1]],

[-1, 1, Conv, [256, 3, 2]],

[[-1, -3], 1, Concat, [1]],

[-1, 1, Conv, [256, 1, 1]],

[-2, 1, Conv, [256, 1, 1]],

[-1, 1, Conv, [256, 3, 1]],

[-1, 1, Conv, [256, 3, 1]],

[-1, 1, Conv, [256, 3, 1]],

[-1, 1, Conv, [256, 3, 1]],

[[-1, -3, -5, -6], 1, Concat, [1]],

[-1, 1, Conv, [1024, 1, 1]],

[-1, 1, MP, []],

[-1, 1, Conv, [512, 1, 1]],

[-3, 1, Conv, [512, 1, 1]],

[-1, 1, Conv, [512, 3, 2]],

[[-1, -3], 1, Concat, [1]],

[-1, 1, C2f, [1024]],

[-1, 1, Conv, [256, 3, 1]],

]

# yolov7 head

head:

[[-1, 1, SPPCSPC, [512]],

[-1, 1, Conv, [256, 1, 1]],

[-1, 1, nn.Upsample, [None, 2, 'nearest']],

[31, 1, Conv, [256, 1, 1]],

[[-1, -2], 1, Concat, [1]],

[-1, 1, C2f, [128]],

[-1, 1, Conv, [128, 1, 1]],

[-1, 1, nn.Upsample, [None, 2, 'nearest']],

[18, 1, Conv, [128, 1, 1]],

[[-1, -2], 1, Concat, [1]],

[-1, 1, C2f, [128]],

[-1, 1, MP, []],

[-1, 1, Conv, [128, 1, 1]],

[-3, 1, Conv, [128, 1, 1]],

[-1, 1, Conv, [128, 3, 2]],

[[-1, -3, 44], 1, Concat, [1]],

[-1, 1, C2f, [256]],

[-1, 1, MP, []],

[-1, 1, Conv, [256, 1, 1]],

[-3, 1, Conv, [256, 1, 1]],

[-1, 1, Conv, [256, 3, 2]],

[[-1, -3, 39], 1, Concat, [1]],

[-1, 3, C2f, [512]],

# 检测头 -----------------------------

[49, 1, RepConv, [256, 3, 1]],

[55, 1, RepConv, [512, 3, 1]],

[61, 1, RepConv, [1024, 3, 1]],

[[62,63,64], 1, IDetect, [nc, anchors]], # Detect(P3, P4, P5)

]

核心代码

./models/common.py文件增加以下模块

class Bottlenecks(nn.Module):

# Standard bottleneck

def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5): # ch_in, ch_out, shortcut, groups, kernels, expand

super().__init__()

c_ = int(c2 * e) # hidden channels

self.cv1 = Conv(c1, c_, k[0], 1)

self.cv2 = Conv(c_, c2, k[1], 1, g=g)

self.add = shortcut and c1 == c2

def forward(self, x):

return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

class C2f(nn.Module):

# CSP Bottleneck with 2 convolutions

def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion

super().__init__()

self.c = int(c2 * e) # hidden channels

self.cv1 = Conv(c1, 2 * self.c, 1, 1)

self.cv2 = Conv((2 + n) * self.c, c2, 1) # optional act=FReLU(c2)

self.m = nn.ModuleList(Bottlenecks(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))

def forward(self, x):

y = list(self.cv1(x).split((self.c, self.c), 1))

y.extend(m(y[-1]) for m in self.m)

return self.cv2(torch.cat(y, 1))

其他配置

找到./models/yolo.py文件下里的parse_model函数,将类名加入进去

for i, (f, n, m, args) in enumerate(d[‘backbone’] + d[‘head’]):`内部 对应位置 下方只需要增加 代码

参考代码

elif m in [C2f]:

c1, c2 = ch[f], args[0]

if c2 != no: # if not output

c2 = make_divisible(c2 * gw, 8)

args = [c1, c2]

if m in [C2f]:

args.insert(2, n) # number of repeats

n = 1

运行配置

python train.py --cfg yolov7_c2f.yaml

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: