YOLO 层大小

数据挖掘 喀拉斯 计算机视觉 卷积 约洛
2022-02-27 05:34:26

根据原始论文,YOLO 网络层的输入大小为 448x448x3,在应用过滤器(7x7x64-s-2)后,输出形状为 221x221x192,如我所料。一些消息来源断言输出形状是 224x224x192,但是如果我们不使用内核(2x2x64-s-2)怎么可能呢?

我想使用 keras 来实现它。但是我的代码不允许获得它给出的下一层的正确大小(无、221、221、64)

model = Sequential()
# The 1st layer
model.add(Conv2D(filters=64, kernel_size=7,
                 strides=2, input_shape=(448,448,3)))
model.add(LeakyReLU(alpha=0.1))
2个回答

通常,当我们使用 CNN 时,我们使用卷积填充,这样,激活图的大小与输入相同。

观看此视频以了解填充的工作原理: Andrew Ng course on Coursera 关于填充(您需要一个帐户才能观看完整视频)

在 Keras 中,Conv2D 层有一个称为“填充”的参数,这里是文档的链接:Keras 的 卷积层文档

请注意,因为他们说在使用不同于 1 的步幅时将填充设置为“相同”(这里是您的情况)可能会因您使用的后端而不一致。我让你试试看第二层的形状是否正确。

这样,你的 conv 层输出应该是 224x224,就像在论文中一样(在 maxpool 层之后是 112x112)

注意:请注意您的过滤器编号。您将过滤器的数量设置为 64,但在论文中,过滤器的数量是 192(我猜它是 64*3,因为有 3 个通道?)

您将不得不调查来源。从下面开始,如果 pad != 0 则 padding = size/2 = 7/2 = 3。如果 pad = 0,则无论 padding 是通过 cfg/yolov1.cfg 传递的。呸!

Breakpoint 1, parse_convolutional (options=0x5555557f18c0, params=...) at ./src/parser.c:180
180 {
(gdb) n
181     int n = option_find_int(options, "filters",1);
(gdb) n
182     int size = option_find_int(options, "size",1);
(gdb) n
183     int stride = option_find_int(options, "stride",1);
(gdb) n
184     int pad = option_find_int_quiet(options, "pad",0);
(gdb) n
185     int padding = option_find_int_quiet(options, "padding",0);
(gdb) print pad
$1 = 1
(gdb) print padding
$2 = 1436698242
(gdb) n
186     int groups = option_find_int_quiet(options, "groups", 1);
(gdb) print padding
$3 = 0
(gdb) n
187     if(pad) padding = size/2;
(gdb) n
189     char *activation_s = option_find_str(options, "activation", "logistic");
(gdb) print padding
$4 = 3
(gdb) print size
$5 = 7
(gdb)