最近准备先画个yolov5的结构图,为改结构作准备。
于是找到了官方结构图和V5 6.0的代码,在backbone代码部分遇到了一个小问题
——第0层的args和其它Conv层的参数数量不一样
所以去查了下common.py中的class Conv(nn.Module),第0层[64, 6, 2, 2]中,channel=64,kernel_size=6,第一个2应该是stride=2,第二个2是padding=2。也因为第1层的[128,3,2]中的2肯定是stride。
下面是第二个问题——代码中第一层卷积(P2)和结构图中不一样
P2:可以看到结构图中存在padding=1,而代码中没有,是哪个对呢,不妨算一下试试,输入320*320,如果没有padding,实际输出(320-3)/2+1=159.5,卷积要舍去,所以输出的是159*159,与期望不符,如果存在padding=1,那么输出(320-3+2*1)/2+1=160.5,输出160*160,这就对上了,说明结构图没问题,那是代码的问题吗。
再次找到common.py
nn.Conv2d中有个autopad(k,p),再ctrl到这个函数(其实就是这段代码上面一行)
可以看出如果传入了padding参数,那就按传入参数,否则p=none时,根据kernel_size自动算出padding。对于P2卷积层的代码来看,p=None,k=3,所以在autopad中,p=k//2=3//2=1,所以自动padding=1,因此代码部分只是省略了padding,从而根据k自动算出的padding=1。