Yolo v3 模型输出说明与 keras

Xey*_*yes 4 python neural-network keras yolo

我正在使用带有 keras 的 yolo v3 模型,这个网络给我作为输出容器,形状如下:

[(1, 13, 13, 255), (1, 26, 26, 255), (1, 52, 52, 255)]
Run Code Online (Sandbox Code Playgroud)

所以我找到了这个链接

然后我理解了 3 个容器中的每一个的值 255,我也理解有 3 个容器,因为边界框创建有 3 种不同的图像缩放。

但我不明白为什么在输出向量中,第一个缩放率有 13 * 13 个列表,第二个有 26 * 26 个列表,最后一个有 52 * 52 个列表。

我无法找到一些很好的解释,所以我不能使用这个网络。如果有人知道我在哪里可以找到有关输出维度的一些信息,我会非常感激。

编辑

是因为如果我将图像切成 13 x 13 个部分,考虑到每个部分都是对象的中心,我只能检测 13*13 个对象吗?

vic*_*iel 6

YOLOv3 有 3 个输出层。这个输出层在 3 个不同的尺度上预测框坐标。YOLOv3 也以将图像划分为单元格的方式运行。根据您查看的输出层,单元格的数量是不同的。

所以输出的数量是正确的,3 个列表(因为三个输出层)。您必须考虑到 YOLOv3 是完全卷积的,这意味着输出层是宽 x 高 x 过滤器。看第一个形状 (1, 13, 13, 255) 。您知道 255 代表边界框坐标、类别和置信度,1 代表批次大小。您现在不明白输出是 conv2d,所以有问题的部分是 13 x 13。13 x 13 意味着您的输入图像将被划分到网格中,并且对于网格的每个单元格将预测边界框坐标、类概率等。第二层操作在不同的比例下,您的图像将被划分为 26 x 26 的网格,第三个将您的图像划分为 52 x 52 的网格,并且对于网格中的每个单元格,都将预测边界框坐标。

为什么有用?从实际的角度来看,想象一下许多小鸽子集中在某个地方的图片。当您只有一个 13 x 13 输出层时,所有这些鸽子都可以出现在一个网格中,因此您不会因此而一一检测它们。但是,如果您将图像划分为 52 x 52 网格,您的单元格会很小,并且您检测到它们的可能性更高。检测小物体是对 YOLOv2 的抱怨,所以这是响应。

从更多机器学习的角度来看。这是所谓的特征金字塔的实现。这个概念是由 Retina 网络架构推广的。

在此处输入图片说明

您处理输入图像、应用卷积、最大池化等直到某个点,您将此特征图用作输出层的输入(在 YOLOv3 情况下为 13 x 13)。比您放大的特征图用作 13 x 13 层的输入并与具有相应大小的特征图连接(此特征图将取自网络的早期部分)。因此,现在您将其用作输出层放大特征的输入,这些特征在网络中一直被预处理,而特征则是较早计算的。这会导致更高的准确性。对于 YOLOv3,您再次将这些放大的特征与早期特征连接起来放大、连接并用作第三个输出层的输入。