如何用caffe模型提取memnet热图?
How to extract memnet heat maps with the caffe model?
我想通过使用 Khosla 等人提供的可用 memnet caffemodel 来提取可记忆性分数和可记忆性热图。在 link
查看prototxt模型,我可以理解最终的内积输出应该是记忆分数,但是我应该如何获得给定输入图像的记忆图呢? Here 一些例子。
提前致谢
如他们的论文 [1] 所述,CNN (MemNet) 输出单个 real-valued 输出以提高记忆力。因此,他们制作的网络 publicly available 计算了这个单一的记忆分数,给定输入图像 - 而不是热图。
在论文的第 5 节中,他们描述了如何使用经过训练的 CNN 来预测记忆热图:
To generate memorability maps, we simply scale up the image and apply MemNet to overlapping regions of the image. We do this for multiple scales of the image and average the resulting memorability maps.
让我们考虑这里的两个重要步骤:
问题 1:使 CNN 适用于任何输入大小。
为了使 CNN 能够处理任意大小的图像,他们使用了 [2] 中介绍的方法。
虽然卷积层可以应用于任意大小的图像 - 导致更小或更大的输出 - 内积层具有固定的输入和输出大小。
要使内积层适用于任何输入大小,您可以像使用卷积核一样应用它。对于具有 4096 个输出的 FC 层,您将其解释为具有 4096 个特征图的 1x1 卷积。
要在 Caffe 中做到这一点,您可以直接按照 Net Surgery tutorial 进行操作。您创建一个新的 .prototxt
文件,将 InnerProduct
层替换为 Convolution
层。现在,Caffe 将不再识别 .caffemodel
中的权重,因为图层类型不再匹配。因此,您将旧网络及其参数加载到 Python,加载新网络,并将旧参数分配给新网络并将其另存为新的 .caffemodel
文件。
现在,我们可以通过网络运行任意尺寸(大于或等于227x227)的图像。
问题 2:生成热图
如论文 [1] 中所述,您将问题 1 中的 fully-convolutional 网络应用于不同比例的同一图像。 MemNet 是 re-trained AlexNet,因此默认输入维度为 227x227。他们提到 451x451 输入给出 8x8 输出,这意味着应用层的步幅为 28。所以一个简单的例子可以是:
- 比例 1:227x227 → 1x1。 (我猜他们肯定用这个秤。)
- 比例 2:283x283 → 2x2。 (胡乱猜测)
- 比例 3:339x339 → 4x4。 (胡乱猜测)
- 比例 4:451x451 → 8x8。 (论文中提到了这个比例。)
结果将如下所示:
因此,您只需对这些输出进行平均即可获得最终的 8x8 热图。从上图中,应该清楚如何对 different-scale 输出进行平均:您必须将 low-res 的输出上采样到 8x8,然后进行平均。
根据论文,我假设他们使用非常 high-res 的尺度,因此他们的热图将与图像最初的大小大致相同。他们写道,在“普通”GPU 上需要 1 秒。这是相当长的时间,这也表明他们可能将输入图像上采样到相当高的维度。
参考书目:
[1]:A. Khosla、A. S. Raju、A. Torralba 和 A. Oliva,“大规模理解和预测图像可记忆性”,载于:ICCV,2015 年。[PDF]
[2]:J. Long、E. Shelhamer 和 T. Darrell,“用于语义分割的全卷积网络”,载于:CVPR,2015 年。[PDF]
我想通过使用 Khosla 等人提供的可用 memnet caffemodel 来提取可记忆性分数和可记忆性热图。在 link 查看prototxt模型,我可以理解最终的内积输出应该是记忆分数,但是我应该如何获得给定输入图像的记忆图呢? Here 一些例子。
提前致谢
如他们的论文 [1] 所述,CNN (MemNet) 输出单个 real-valued 输出以提高记忆力。因此,他们制作的网络 publicly available 计算了这个单一的记忆分数,给定输入图像 - 而不是热图。
在论文的第 5 节中,他们描述了如何使用经过训练的 CNN 来预测记忆热图:
To generate memorability maps, we simply scale up the image and apply MemNet to overlapping regions of the image. We do this for multiple scales of the image and average the resulting memorability maps.
让我们考虑这里的两个重要步骤:
问题 1:使 CNN 适用于任何输入大小。
为了使 CNN 能够处理任意大小的图像,他们使用了 [2] 中介绍的方法。 虽然卷积层可以应用于任意大小的图像 - 导致更小或更大的输出 - 内积层具有固定的输入和输出大小。 要使内积层适用于任何输入大小,您可以像使用卷积核一样应用它。对于具有 4096 个输出的 FC 层,您将其解释为具有 4096 个特征图的 1x1 卷积。
要在 Caffe 中做到这一点,您可以直接按照 Net Surgery tutorial 进行操作。您创建一个新的 .prototxt
文件,将 InnerProduct
层替换为 Convolution
层。现在,Caffe 将不再识别 .caffemodel
中的权重,因为图层类型不再匹配。因此,您将旧网络及其参数加载到 Python,加载新网络,并将旧参数分配给新网络并将其另存为新的 .caffemodel
文件。
现在,我们可以通过网络运行任意尺寸(大于或等于227x227)的图像。
问题 2:生成热图
如论文 [1] 中所述,您将问题 1 中的 fully-convolutional 网络应用于不同比例的同一图像。 MemNet 是 re-trained AlexNet,因此默认输入维度为 227x227。他们提到 451x451 输入给出 8x8 输出,这意味着应用层的步幅为 28。所以一个简单的例子可以是:
- 比例 1:227x227 → 1x1。 (我猜他们肯定用这个秤。)
- 比例 2:283x283 → 2x2。 (胡乱猜测)
- 比例 3:339x339 → 4x4。 (胡乱猜测)
- 比例 4:451x451 → 8x8。 (论文中提到了这个比例。)
结果将如下所示:
因此,您只需对这些输出进行平均即可获得最终的 8x8 热图。从上图中,应该清楚如何对 different-scale 输出进行平均:您必须将 low-res 的输出上采样到 8x8,然后进行平均。
根据论文,我假设他们使用非常 high-res 的尺度,因此他们的热图将与图像最初的大小大致相同。他们写道,在“普通”GPU 上需要 1 秒。这是相当长的时间,这也表明他们可能将输入图像上采样到相当高的维度。
参考书目:
[1]:A. Khosla、A. S. Raju、A. Torralba 和 A. Oliva,“大规模理解和预测图像可记忆性”,载于:ICCV,2015 年。[PDF]
[2]:J. Long、E. Shelhamer 和 T. Darrell,“用于语义分割的全卷积网络”,载于:CVPR,2015 年。[PDF]