人工智能神经网络由于颜色反转而导致手写数字错误预测。倍频程/Matlab?

人工智能神经网络由于颜色反转而导致手写数字错误预测。倍频程/Matlab?,matlab,machine-learning,neural-network,octave,handwriting-recognition,Matlab,Machine Learning,Neural Network,Octave,Handwriting Recognition,我的Octave程序使用神经网络识别手写数字。问题是,如果颜色改变,它将无法正确识别数字。但如果颜色颠倒,它的预测就不正确。例如: 上面的图像包含具有相同图案的相同数字。但它们的颜色倒过来了 我已经在使用RGB到灰度的转换。如何克服这个问题?对于反转彩色图像,有没有比使用单独的训练示例更好的选择?边缘提取 如果从图像中提取边缘,您将看到它在这方面基本不变,两个版本的图像在变换后看起来几乎相同 下面,我将展示使用拉普拉斯边缘检测提取边缘时,对于“黑上白”和“白上黑”图像,图像的外观: 这个

我的Octave程序使用神经网络识别手写数字。问题是,如果颜色改变,它将无法正确识别数字。但如果颜色颠倒,它的预测就不正确。例如:


上面的图像包含具有相同图案的相同数字。但它们的颜色倒过来了

我已经在使用RGB到灰度的转换。如何克服这个问题?对于反转彩色图像,有没有比使用单独的训练示例更好的选择?

边缘提取 如果从图像中提取边缘,您将看到它在这方面基本不变,两个版本的图像在变换后看起来几乎相同

下面,我将展示使用拉普拉斯边缘检测提取边缘时,对于“黑上白”和“白上黑”图像,图像的外观:

这个想法是在边缘上训练你的网络,以获得一些关于你描述的变化的不变性

以下是用于边缘提取的MATLAB/OCtave的一些资源:

我已经使用Python和OpenCV完成了边缘提取,使用
edges\u image=cv2.Laplacian(original\u image,cv2.CV\u 64F)
。如果我可以修复我的安装,我可能会发布一个MATLAB/Octave示例:)

检测主色,必要时反转 另一种方法是决定您要使用一个版本,比如说您已经对网络进行了“白底黑字”变体的培训

现在,当您输入图像时,首先检测主色/背景是黑色还是白色,然后根据需要反转。

特征提取 为了推广@bakkal关于使用边的建议,可以提取多种类型的边。这些包括边、角、斑点、脊等。。实际上有一个简单的例子,包括使用(方向梯度直方图)的数字识别

这种技术也适用于更复杂的图像,因为边缘并不总是最好的特征。使用matlab从两幅图像中提取HOG特征:

我相信,如果你有八度音阶的话,你可以使用HOG特性

另一件需要记住的重要事情是,您希望所有图像都具有相同的大小。我已经将两个图像的大小调整为500x500,但这是任意的

生成上面图像的代码

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);
您不必局限于HOG特性。你也可以快速尝试

同样,颜色反转并不重要,因为特征匹配。但是您可以看到,在这里,弓形特征可能是更好的选择,因为绘制的20个点/斑点实际上并不代表数字6。。在matlab中实现上述功能的代码

% extracting SURF features
points1 = detectSURFFeatures(img1_resized);
points2 = detectSURFFeatures(img2_resized);

% plotting SURF Features
figure(2);
subplot(1, 2, 1);
imshow(img1_resized);
hold on;
plot(points1.selectStrongest(20));
hold off;
subplot(1, 2, 2);
imshow(img2_resized);
hold on;
plot(points2.selectStrongest(20));
hold off;

总之,根据问题的不同,您可以选择不同类型的功能。大多数情况下,从您自己的经验中可以看出,选择原始像素值还不够好,除非您有一个包含所有可能情况的非常大的数据集。

您的训练数据是否有反转颜色的数据?CNN不会学习颜色不变的表示法。不,我没有包括反转颜色的训练示例。是的,这是一个解决方案,但我想知道是否有更好的办法来解决这个问题!神经网络的优点之一是,它们可以为手头的数据和任务找到最佳的“特征”。例如,他们可以学习猪的描述词。看看这篇关于深度学习和功能工程的IBM文章,我有一个类似的问题。谢谢你的回答,先生。我想到了第二种“检测主色”的方法,但我不确定如何使用倍频程/Matlab反转颜色。然而,第一种“边缘提取”方法似乎更有趣。你能描述一下这两种方法中哪一种更有效、更准确吗?@HNLEANER我会选择边缘或任何特征提取,因为深度端到端解决方案就是这样运作的,它们会产生很好的结果,例如,如果你看卷积神经网络,您将看到,在它的第一阶段,您将尝试学习类似边缘的功能。@HNLearner如果您愿意,您可以告诉我您的网络配置,例如隐藏层的数量和每层中神经元的数量等,测试起来应该很容易。如果你愿意,给我发封电子邮件。非常感谢你的帮助,先生。我是机器学习的初学者,不久前才开始学习神经网络。我只使用了一个隐藏层。@请注意,边缘检测算法通常是应用(卷积)平方高斯滤波器来模糊图像,然后使用其他滤波器(如拉普拉斯或索贝尔)来查找边缘的组合。这太棒了。谢谢先生:)我很高兴这对你有帮助