图像识别用什么卷积运算?
What convolution operation is used for image recognition?
我发现的所有特征识别中卷积的人为示例 "simplify" 卷积运算的像素值为 1 或 -1。它实现了一个非常简单的操作(将输入像素乘以过滤器像素,对结果求和,然后除以像素数):
但是,对于像素值具有范围的大多数图像来说,它并不是很有帮助。例如。 (0.0-1.0), 或 (0-255).
我无法在任何地方找到用于这些输入值的算法示例。我尝试对每个像素的差异求和,然后除以像素数以获得总体 "error"。然后激活等于最大 - 错误。例如。 255 - 错误,或 1.0 - 错误。
虽然它永远不会输出负值,所以我认为不需要 ReLU 层。这让我怀疑这是一种天真的方法,实际上行不通,但我不确定为什么。
那么当输入数据不是1/-1时使用的操作是什么?
编辑 这是我一直在看的例子:http://brohrer.github.io/how_convolutional_neural_networks_work.html
及其描述的卷积运算:
To calculate the match of a feature to a patch of the image, simply multiply each pixel in the feature by the value of the corresponding pixel in the image. Then add up the answers and divide by the total number of pixels in the feature. If both pixels are white (a value of 1) then 1 * 1 = 1. If both are black, then (-1) * (-1) = 1. Either way, every matching pixel results in a 1. Similarly, any mismatch is a -1.
一个具体的例子,说明为什么我认为这不适用于值为 [0.0,1.0]
的像素。假设我们有一个值为 [0.5]
的 1x1 过滤器。如果我们 运行 在值为 0.5
的输入像素上,那么我们得到 0.25
.
同样,如果我们使用 [0,255]
的颜色范围,那么我们很容易得到 > 255 的值。虽然我不确定这是否重要,因为它不再是像素数据;它是在特征图中激活,对吧?
通常对每个像素使用卷积。所以每个像素都是所有那些具有所有这些权重的像素的总和。所以它是 0.77 * 那个角像素,0.33 * 那个角,所有这些值都加起来并放在中心。通常是卷曲的。然后对所有其他像素进行相同的操作而不重叠任何数据。
该像素的下一个版本的值是几个像素的总和。有时这是带有权重的。因此,我们不是乘以 -1,而是乘以每个像素的权重。
您通常会将卷积权重归一化。在本例中为 9.444444444444444 并将各种权重的各种像素的总和除以该数量。但是,这显然是 Canny 边缘检测,这意味着要超出给定范围并仅划分边缘。这意味着取决于内核,它可能允许最大 9.44 倍的最高范围。和负值的底部范围。然后你压缩例程并将给定的像素截断到 0-255 或 0.0-1.0 的范围内(取决于你使用的是什么)。这会丢失大量数据,但这就是重点,它想要丢失噪声并保留边缘。
通常您需要对输入进行阈值处理以将其转换为二进制作为第一遍。您当然可以对灰度图像进行卷积,而 Canny 线检测就是这样做的。但结果是另一个连续图像,需要进一步处理。
我的 github 项目中有一些关于二进制图像处理的 material,在这里
http://malcolmmclean.github.io/binaryimagelibrary/
我发现的所有特征识别中卷积的人为示例 "simplify" 卷积运算的像素值为 1 或 -1。它实现了一个非常简单的操作(将输入像素乘以过滤器像素,对结果求和,然后除以像素数):
但是,对于像素值具有范围的大多数图像来说,它并不是很有帮助。例如。 (0.0-1.0), 或 (0-255).
我无法在任何地方找到用于这些输入值的算法示例。我尝试对每个像素的差异求和,然后除以像素数以获得总体 "error"。然后激活等于最大 - 错误。例如。 255 - 错误,或 1.0 - 错误。
虽然它永远不会输出负值,所以我认为不需要 ReLU 层。这让我怀疑这是一种天真的方法,实际上行不通,但我不确定为什么。
那么当输入数据不是1/-1时使用的操作是什么?
编辑 这是我一直在看的例子:http://brohrer.github.io/how_convolutional_neural_networks_work.html
及其描述的卷积运算:
To calculate the match of a feature to a patch of the image, simply multiply each pixel in the feature by the value of the corresponding pixel in the image. Then add up the answers and divide by the total number of pixels in the feature. If both pixels are white (a value of 1) then 1 * 1 = 1. If both are black, then (-1) * (-1) = 1. Either way, every matching pixel results in a 1. Similarly, any mismatch is a -1.
一个具体的例子,说明为什么我认为这不适用于值为 [0.0,1.0]
的像素。假设我们有一个值为 [0.5]
的 1x1 过滤器。如果我们 运行 在值为 0.5
的输入像素上,那么我们得到 0.25
.
同样,如果我们使用 [0,255]
的颜色范围,那么我们很容易得到 > 255 的值。虽然我不确定这是否重要,因为它不再是像素数据;它是在特征图中激活,对吧?
通常对每个像素使用卷积。所以每个像素都是所有那些具有所有这些权重的像素的总和。所以它是 0.77 * 那个角像素,0.33 * 那个角,所有这些值都加起来并放在中心。通常是卷曲的。然后对所有其他像素进行相同的操作而不重叠任何数据。
该像素的下一个版本的值是几个像素的总和。有时这是带有权重的。因此,我们不是乘以 -1,而是乘以每个像素的权重。
您通常会将卷积权重归一化。在本例中为 9.444444444444444 并将各种权重的各种像素的总和除以该数量。但是,这显然是 Canny 边缘检测,这意味着要超出给定范围并仅划分边缘。这意味着取决于内核,它可能允许最大 9.44 倍的最高范围。和负值的底部范围。然后你压缩例程并将给定的像素截断到 0-255 或 0.0-1.0 的范围内(取决于你使用的是什么)。这会丢失大量数据,但这就是重点,它想要丢失噪声并保留边缘。
通常您需要对输入进行阈值处理以将其转换为二进制作为第一遍。您当然可以对灰度图像进行卷积,而 Canny 线检测就是这样做的。但结果是另一个连续图像,需要进一步处理。
我的 github 项目中有一些关于二进制图像处理的 material,在这里 http://malcolmmclean.github.io/binaryimagelibrary/