Yolov3 config file 中 pad 的理解

最近在入门学习object detection, 在查看yolov3的config file时, 被一个参数 pad=1 搞得晕头转向, 几经查询终于有了一些眉目。

pad = 1 代表什么

首先,pad=1不是说padding的取值为1(我傻傻的这样认为了好久)。 官方的解释我没有找到,我会再找一找。在参考了一些资料1 2之后,我发现在这个cfg file中pad的选项有两个,1 或者0。
当pad=1的时候,padding = (kernel-1) // 2;
当pad=0的时候,padding就是依据给出的padding值。

pad=0的情况这里先不做讨论,因为在yolov3的cfg文件中,pad都是为1的情况。
那么下面就来看看为什么pad=1的时候,padding=(kernel-1)//2 意味着什么。

padding =(kernel-1)// 2 代表什么

这里要拿出最著名的公式之一

S o u t p u t = S i n p u t + 2 p − k S + 1 S_{output} = \frac{S_{input} + 2p - k}{S} + 1 Soutput=SSinput+2pk+1
S o u t p u t S_{output} Soutput就是输出的size, S i n p u t 输 入 的 s i z e S_{input}输入的size Sinputsize p p p是padding的取值, k k k是kernel的size, S S S是stride取值。

先来看下如果 p = k − 1 2 p=\frac{k-1}{2} p=2k1 会发生什么
k = 2 p + 1 k = 2p + 1 k=2p+1.
带入刚才的公式

S o u t p u t = S i n p u t + 2 p − ( 2 p + 1 ) S + 1 = S i n p u t + 2 p − 2 p − 1 S + 1 = S i n p u t − 1 S + 1 \begin{aligned} S_{output} & = \frac{S_{input} + 2p - (2p+1)}{S} + 1\\ & = \frac{S_{input} + 2p - 2p -1}{S} +1 \\ & = \frac{S_{input} -1}{S} + 1 \end{aligned} Soutput=SSinput+2p(2p+1)+1=SSinput+2p2p1+1=SSinput1+1
这个时候,如果 S = 1 S=1 S=1, 也就是stride=1, S o u t p u t = = S i n p u t S_{output}==S_{input} Soutput==Sinput, 也就达到了"same" padding的作用。

类似的,如果 S = 2 S=2 S=2, 就达到了size减半的效果(会出现除不尽的情况,但是向下取整就是了)

在查看了yolov3的网络框架,就会发现,same padding运用在residual的block中,确保了residual合并的时候size一致。每一个residual block结束就会用S=2来把size减半。 图片来源researchgate

Yolov3 config file 中 pad 的理解_第1张图片

第一次发博,才体会到原来把一个想法写出来是很繁琐的事情, respect to 所有把自己知识总结下来分享给他人的博主们。如果有哪里写的不对,烦请指正,在此感谢先。


  1. https://blog.csdn.net/qq_35872456/article/details/84216129 ↩︎

  2. https://cloud.tencent.com/developer/article/1582755 ↩︎

你可能感兴趣的:(Yolov3 config file 中 pad 的理解)