我在Octave的程序使用神经网络识别手写数字。问题是如果颜色改变,它将无法正确识别数字。但如果颜色反转,则预测不正确。例如:
上面的图像包含相同图案的相同编号。但是它们的颜色反转了。
我已经在使用 RGB到GrayScale 转化。如何克服这个问题?除了为倒置彩色图像使用单独的训练示例之外,还有更好的选择吗?
答案 0 :(得分:2)
如果从图像中提取边缘,您会发现它在这方面基本上是不变的,图像的两个版本在转换后看起来几乎相同
下面我将展示使用拉普拉斯边缘检测提取边缘时图像的外观,对于“白底黑”和“黑白底”图像:
我们的想法是在边缘训练你的网络,以获得关于你所描述的变化的一些不变性。
以下是MATLAB / OCtave用于边缘提取的一些资源:
https://mathworks.com/discovery/edge-detection.html https://octave.sourceforge.io/image/function/edge.html
<子>
我使用Python和OpenCV用edges_image = cv2.Laplacian(original_image, cv2.CV_64F)
完成了边缘提取。如果我可以修复我的安装,我可以发布一个MATLAB / Octave示例:)
子>
另一种方法是决定你想要使用一个版本,假设你已经在“白色背景上的黑色文本”变体上训练了网络。
现在输入图像时,首先检测主色/背景是黑色还是白色,然后根据需要进行反转。
答案 1 :(得分:2)
为了概括@ bakkal关于使用边缘的建议,可以提取许多类型的image features。这些包括边缘,角落,斑点,脊等。实际上有page on mathworks个例子,包括使用HOG features进行数字识别(面向渐变的直方图)。
这些技术也适用于更复杂的图像,因为边缘并不总是最好的特征。使用matlab的extractHOGFeatures
:
如果您使用Octave,我相信您可以将vlfeat用于HOG功能。
要记住的另一个重要事项是,您希望所有图像具有相同的大小。我已将两张图片的大小调整为500x500,但这是任意的。
生成上面图像的代码
y
您不必限于HOG功能。也可以快速尝试SURF features
同样,颜色反转无关紧要,因为功能匹配。但你可以看到HOG功能在这里可能是一个更好的选择,因为绘制的20点/ blob并不能真正代表数字6 ..在matlab中获得上述代码的代码。
close all; clear; clc;
% reading in
img1 = rgb2gray(imread('img1.png'));
img2 = rgb2gray(imread('img2.png'));
img_size = [500 500]; %
% all images should have the same size
img1_resized = imresize(img1, img_size);
img2_resized = imresize(img2, img_size);
% extracting features
[hog1, vis1] = extractHOGFeatures(img1_resized);
[hog2, vis2] = extractHOGFeatures(img2_resized);
% plotting
figure(1);
subplot(1, 2, 1);
plot(vis1);
subplot(1, 2, 2);
plot(vis2);
总结一下,根据问题,您可以选择不同类型的功能。大多数情况下,根据您自己的经验,选择原始像素值并不够好,除非您有一个非常大的数据集封装了所有可能的情况。