为什么在同一张图像上得到了两个带有相同内核的不同特征图?

问题描述

随机抽取一个内核,并将其应用于padding ='valid',stride =(1,1),内核大小=(3,3)的图像。

这是正常图像:

enter image description here

这是应用滤镜后的图片

enter image description here

然后我将原始图像旋转了90度,然后更改为:

enter image description here

然后我在旋转的图像上应用了相同的滤镜,并将其作为输出

enter image description here

然后旋转此输出图像,以使其旋转与先前的特征图相同。 旋转此旋转特征图并将其与以前的特征图进行比较之后,我发现它们并不相同。

这是两个要素图的图像:

This is the image of the feature map obtained by applying the kernel on non-rotated image

This is the image of the feature map obtained by applying the kernel on rotated image

如您所见,它们显然不相同。

这意味着要素映射会随着输入图像中要素位置的变化而变化。

但是为什么会这样呢? 例如:假设我们有一个检测“眼睛”的内核,然后对图像中心的“眼睛”图像上的内核进行训练后,我们给它一个图像,这一次,“眼睛”位于顶部-图片的左侧。它仍然会做得很好,因为它将在图像的每个(5,5)部分上搜索眼睛(假设内核的大小为(5,5)),因此该功能的位置不重要在图像中。

那么,为什么我们在“ 5”的示例中更改输入图像中特征的位置时映射了特征?

解决方法

您有2个不同的特征图,因为当您将原始图像旋转90度时,不再以相同的方式应用内核。这是一个演示:

假设这是您的图片

    1  2  3  4  5
    1  2  3  4  5
    1  2  3  4  5
    1  2  3  4  5
    1  2  3  4  5

这是您的2乘2​​内核:

    1 2
    3 4

如果将此滤镜应用到图像的2 * 2凝视部分,则会得到以下值:

    (1*1) + (2*2) + (1*3) + (2*4)
    = 16

将图像旋转90度时,图像变为:

    5  5  5  5  5
    4  4  4  4  4
    3  3  3  3  3
    2  2  2  2  2
    1  1  1  1  1

现在在此图像上应用相同的内核,但是由于滤镜图将再次旋转,因此我们将在旋转图像的左下角计算滤镜图的卷积。 (很难理解为什么我们要在旋转图像的左下角应用滤镜。)

    (2*1) + (2*2) + (1*3) + (1*4)
    = 13

由于13和16不相等,因此您获得了不同的特征图。

,

过滤器不会旋转:对于3×3像素的窗口,您有9个权重表示窗口中的像素将在输出中表示多少,而像素不会旋转。如果旋转内核权重,则输出将相同。

假设您的内核具有这样的权重:

@HostListener('input',['$event']) // or/and keydown
onInputChange(event: Event): void {...}

结果是将所有像素移到底部一个位置。如果旋转图像,请应用滤镜并向后旋转,所有像素都将向左移动。