代码:https://github.com/ultralytics/yolov3
# parameters
nc: 1 # number of classes
depth_multiple: 1.0 # model depth multiple(控制模型的深度)
width_multiple: 1.0 # layer channel multiple(控制卷积核的个数)
# anchors
anchors:
# - [48,56, 55,146, 129,94] # P3/8
# - [126,221, 80,364, 233,145] # P4/16
# - [182,433, 349,259, 396,499] # P5/32
- [32,36, 36,95, 84,61] # P3/8
- [82,144, 52,237, 151,94] # P4/16
- [118,282, 227,166, 257,324] # P5/32
# darknet53 backbone
backbone:
# [from, number, module, args]
#form:-1表示从上一层获得,-2表示从上两层获得
#number:列数:1表示只有一个,3表示有三个小相同的模块
[[-1, 1, Conv, [32, 3, 1]], # 0
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2
[-1, 1, Bottleneck, [64]],
[-1, 1, Conv, [128, 3, 2]], # 3-P2/4
[-1, 2, Bottleneck, [128]],
[-1, 1, Conv, [256, 3, 2]], # 5-P3/8
[-1, 8, Bottleneck, [256]],
[-1, 1, Conv, [512, 3, 2]], # 7-P4/16
[-1, 8, Bottleneck, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 9-P5/32
[-1, 4, Bottleneck, [1024]], # 10
]
# YOLOv3 head
head:
[[-1, 1, Bottleneck, [1024, False]],
[-1, 1, Conv, [512, [1, 1]]],
[-1, 1, Conv, [1024, 3, 1]],
[-1, 1, Conv, [512, 1, 1]],
[-1, 1, Conv, [1024, 3, 1]], # 15 (P5/32-large)
[-2, 1, Conv, [256, 1, 1]],
# [-1, 1, nn.Upsample, [None, 2, 'nearest']],
[-1, 1, nn.ConvTranspose2d, [256, 256, 2, 2]], ##1是输出,2是卷积核,2是步长
[[-1, 8], 1, Concat, [1]], # cat backbone P4
[-1, 1, Bottleneck, [512, False]],
[-1, 1, Bottleneck, [512, False]],
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, Conv, [512, 3, 1]], # 22 (P4/16-medium)
[-2, 1, Conv, [128, 1, 1]],
# [-1, 1, nn.Upsample, [None, 2, 'nearest']],
[-1, 1, nn.ConvTranspose2d, [128, 128, 2, 2]],
[[-1, 6], 1, Concat, [1]], # cat backbone P3
[-1, 1, Bottleneck, [256, False]],
[-1, 2, Bottleneck, [256, False]], # 27 (P3/8-small)
[[27, 22, 15], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
两次上采样的输出是1616的,反卷积的步长为2,卷积核为33时,padding的0或1,输出大小为1717或1515.
因为输出大小是
output = (input-1)stride+outputpadding -2padding+kernelsize
所以把卷积核改成2*2.
参考:https://blog.csdn.net/weixin_45798280/article/details/110226826