最近在学yolov5的网络结构,发现不同的人描述yolov5的网络结构并不同,有的说是C3模块有的说是BottleneckCSP,这给我一个小白带来了很大困扰。查询了很多文章终于在一篇文章中有博主提到,yolov5新版本用C3代替了BottleneckCSP。所以为了搞清楚yolov5的具体网络结构,在这里把所有的版本结构记录下来,以便之后的学习理解与查看。
v1.0版本如下:
backbone主要模块:Focus、Conv、BottleneckCSP、SPP
head主要模块:BottleneckCSP、Conv、nn.Upsample、Concat、nn.Conv2d
#YOLOv5 backbone
backbone:
# [from, number, module, args][[-1,1, Focus,[64,3]], # 0-P1/2[-1,1, Conv,[128,3,2]], # 1-P2/4[-1,3, BottleneckCSP,[128]],[-1,1, Conv,[256,3,2]], # 3-P3/8[-1,9, BottleneckCSP,[256]],[-1,1, Conv,[512,3,2]], # 5-P4/16[-1,9, BottleneckCSP,[512]],[-1,1, Conv,[1024,3,2]], # 7-P5/32[-1,1, SPP,[1024,[5,9,13]]],]#YOLOv5 head
head:[[-1,3, BottleneckCSP,[1024, False]], # 9[-1,1, Conv,[512,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,6],1, Concat,[1]], # cat backbone P4
[-1,3, BottleneckCSP,[512, False]], # 13[-1,1, Conv,[256,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,4],1, Concat,[1]], # cat backbone P3
[-1,3, BottleneckCSP,[256, False]],[-1,1, nn.Conv2d,[na *(nc +5),1,1]], # 18(P3/8-small)[-2,1, Conv,[256,3,2]],[[-1,14],1, Concat,[1]], # cat head P4
[-1,3, BottleneckCSP,[512, False]],[-1,1, nn.Conv2d,[na *(nc +5),1,1]], # 22(P4/16-medium)[-2,1, Conv,[512,3,2]],[[-1,10],1, Concat,[1]], # cat head P5
[-1,3, BottleneckCSP,[1024, False]],[-1,1, nn.Conv2d,[na *(nc +5),1,1]], # 26(P5/32-large)[[],1, Detect,[nc, anchors]], # Detect(P5, P4, P3)]
v2.0版本如下:
backbone主要模块:Focus、Conv、BottleneckCSP、SPP
head主要模块:BottleneckCSP、Conv、nn.Upsample、Concat
v2.0与V1.0相比最大的区别就是少了nn.Conv2d模块,并且Detect指定为17, 20, 23层输出
#YOLOv5 backbone
backbone:
# [from, number, module, args][[-1,1, Focus,[64,3]], # 0-P1/2[-1,1, Conv,[128,3,2]], # 1-P2/4[-1,3, BottleneckCSP,[128]],[-1,1, Conv,[256,3,2]], # 3-P3/8[-1,9, BottleneckCSP,[256]],[-1,1, Conv,[512,3,2]], # 5-P4/16[-1,9, BottleneckCSP,[512]],[-1,1, Conv,[1024,3,2]], # 7-P5/32[-1,1, SPP,[1024,[5,9,13]]],[-1,3, BottleneckCSP,[1024, False]], # 9]#YOLOv5 head
head:[[-1,1, Conv,[512,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,6],1, Concat,[1]], # cat backbone P4
[-1,3, BottleneckCSP,[512, False]], # 13[-1,1, Conv,[256,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,4],1, Concat,[1]], # cat backbone P3
[-1,3, BottleneckCSP,[256, False]], # 17[-1,1, Conv,[256,3,2]],[[-1,14],1, Concat,[1]], # cat head P4
[-1,3, BottleneckCSP,[512, False]], # 20[-1,1, Conv,[512,3,2]],[[-1,10],1, Concat,[1]], # cat head P5
[-1,3, BottleneckCSP,[1024, False]], # 23[[17,20,23],1, Detect,[nc, anchors]], # Detect(P3, P4, P5)]
V3.0与V3.1和V2.0相同,这里不放代码;
从V4.0版本开始,作者开始用C3代替了BottleneckCSP,而其他的结构不变。C3结构作用基本相同均为BottleneckCSP架构,只是在修正单元的选择上有所不同,其包含了3个标准卷积层以及多个Bottleneck模块(数量由配置文件.yaml的n和depth_multiple参数乘积决定)
#YOLOv5 backbone
backbone:
# [from, number, module, args][[-1,1, Focus,[64,3]], # 0-P1/2[-1,1, Conv,[128,3,2]], # 1-P2/4[-1,3, C3,[128]],[-1,1, Conv,[256,3,2]], # 3-P3/8[-1,9, C3,[256]],[-1,1, Conv,[512,3,2]], # 5-P4/16[-1,9, C3,[512]],[-1,1, Conv,[1024,3,2]], # 7-P5/32[-1,1, SPP,[1024,[5,9,13]]],[-1,3, C3,[1024, False]], # 9]#YOLOv5 head
head:[[-1,1, Conv,[512,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,6],1, Concat,[1]], # cat backbone P4
[-1,3, C3,[512, False]], # 13[-1,1, Conv,[256,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,4],1, Concat,[1]], # cat backbone P3
[-1,3, C3,[256, False]], # 17(P3/8-small)[-1,1, Conv,[256,3,2]],[[-1,14],1, Concat,[1]], # cat head P4
[-1,3, C3,[512, False]], # 20(P4/16-medium)[-1,1, Conv,[512,3,2]],[[-1,10],1, Concat,[1]], # cat head P5
[-1,3, C3,[1024, False]], # 23(P5/32-large)[[17,20,23],1, Detect,[nc, anchors]], # Detect(P3, P4, P5)]
一张图快速了解C3与BottleneckCSP区别(从别人那扒的,嘘):
V5.0版本也没有改变网络结构,这里不放代码;
v6.0版本将第0层的Focus替换成Conv,将SPP替换成SPPF;
ps:SPPF比SPP快了一倍时间yolov5 github上有代码验证,这里只放结果。
#YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args][[-1,1, Conv,[64,6,2,2]], # 0-P1/2[-1,1, Conv,[128,3,2]], # 1-P2/4[-1,3, C3,[128]],[-1,1, Conv,[256,3,2]], # 3-P3/8[-1,6, C3,[256]],[-1,1, Conv,[512,3,2]], # 5-P4/16[-1,9, C3,[512]],[-1,1, Conv,[1024,3,2]], # 7-P5/32[-1,3, C3,[1024]],[-1,1, SPPF,[1024,5]], # 9]#YOLOv5 v6.0 head
head:[[-1,1, Conv,[512,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,6],1, Concat,[1]], # cat backbone P4
[-1,3, C3,[512, False]], # 13[-1,1, Conv,[256,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,4],1, Concat,[1]], # cat backbone P3
[-1,3, C3,[256, False]], # 17(P3/8-small)[-1,1, Conv,[256,3,2]],[[-1,14],1, Concat,[1]], # cat head P4
[-1,3, C3,[512, False]], # 20(P4/16-medium)[-1,1, Conv,[512,3,2]],[[-1,10],1, Concat,[1]], # cat head P5
[-1,3, C3,[1024, False]], # 23(P5/32-large)[[17,20,23],1, Detect,[nc, anchors]], # Detect(P3, P4, P5)]
V6.1和V6.2版本与V6.0相同,这里不放代码;
总结:
V1.0版本backbone主要模块:Focus、Conv、BottleneckCSP、SPP;head主要模块:BottleneckCSP、Conv、nn.Upsample、Concat、nn.Conv2d。
V2.0版本在V1.0版本基础上删去nn.Conv2d,并且Detect指定为17, 20, 23层输出。
V4.0版本用C3代替了BottleneckCSP,而其他的结构不变。
V6.0版本将第0层的Focus替换成Conv,将SPP替换成SPPF;
最后放一张V6.1版本网络结构图:(来自github官方)
版权归原作者 一朵fafa的学习庄园 所有, 如有侵权,请联系我们删除。