python - Yolo v3 模型输出澄清与 keras

标签 python keras neural-network yolo

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

[(1, 13, 13, 255), (1, 26, 26, 255), (1, 52, 52, 255)]

所以我找到了这个link

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

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

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

编辑

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

最佳答案

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 网络架构所普及。

enter image description here

您处理输入图像、应用卷积、最大池化等,直到某个点,您将此特征图用作输出层的输入(在 YOLOv3 的情况下为 13 x 13)。比起用作 13 x 13 层输入的高级特征图,并与具有相应大小的特征图连接(该特征图将从网络的早期部分获取)。所以现在你使用作为输出层输入的放大特征,这些特征在整个网络和之前计算的特征中一直被预处理。这会导致更高的准确性。对于 YOLOv3,您需要再次将这个放大的特征与早期的特征串联起来,将它们放大,串联并用作第三个输出层的输入。

关于python - Yolo v3 模型输出澄清与 keras,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57112038/

相关文章:

python - 在python中使用openCV查找文档中打印区域(文本或图像)的X和Y坐标

python - 从 CSV 输入 Python 中查找最后一行

python - Matplotlib 饼图 : How to replace auto-labelled relative values by absolute values

php - python 纹 : download file accessible through PHP script

python - 如何在人工神经网络中处理多个分类列?

python - 让 Keras/Tensorflow 输出 OneHotCategorical,但操作没有梯度

python - TensorFlow:如何在急切执行期间将 DeferredTensor 转换为 Tensor(以执行组标准化)?

machine-learning - Tensorflow 默认情况下会对输入数据进行标准化吗?

machine-learning - 什么是适合预测文章受欢迎程度的神经网络架构?

python - 用神经网络填充序列的缺失值