AI 神经网络由于反转颜色而导致错误的手写数字预测。八度/ Matlab?

Posted

技术标签:

【中文标题】AI 神经网络由于反转颜色而导致错误的手写数字预测。八度/ Matlab?【英文标题】:AI Neural Network Wrong Handwritten Digit Prediction due to inverted color. Octave/Matlab? 【发布时间】:2017-11-26 16:32:33 【问题描述】:

我的 Octave 程序使用神经网络来识别手写数字。问题是,如果颜色改变,它将无法正确识别数字。但如果颜色反转,则预测错误。例如:


上面的图片包含相同的数字和相同的图案。但是它们有反转的颜色。

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

【问题讨论】:

您的训练数据是否有反色数据? CNN 不会学习颜色不变的表示。 不,我没有包含反转颜色的训练示例。是的,这是一个解决方案,但我想知道是否有更好的方法来解决这个问题! 神经网络的优势之一是它们可以为手头的数据和任务找到最佳“特征”。例如,他们可以学习 HOG 描述符。 quora.com/How-do-I-use-deep-CNN-to-learn-HOG-descriptors 看看这篇关于深度学习和特征工程的 IBM 帖子ibm.com/developerworks/community/blogs/jfp/entry/… 我也有类似的问题。 【参考方案1】:

特征提取

为了概括@bakkal 使用边的建议,可以提取多种类型的image features。这些包括边缘、角落、斑点、脊等。实际上有一个page on mathworks 有几个例子,包括使用HOG features 的数字识别(定向梯度直方图)。

此类技术也适用于更复杂的图像,因为边缘并不总是最好的特征。使用matlab的extractHOGFeatures从你的两张图片中提取HOG特征:

如果您有 Octave,我相信您可以使用 vlfeat 来实现 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 功能。也可以快点试试SURF features

同样,颜色反转并不重要,因为特征匹配。但是您可以看到 HOG 特征在这里可能是更好的选择,因为绘制的 20 个点/blob 并不能很好地代表数字 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;

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

【讨论】:

这太棒了。谢谢先生:) 我很高兴它有帮助【参考方案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 示例:)

检测主色并在需要时反转

另一种方法是决定您要使用一个版本,假设您已经对网络进行了“白底黑字”变体的训练。

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

【讨论】:

感谢先生的回答。我想到了“检测主色”的第二种方法,但我不确定如何使用 Octave/Matlab 反转颜色。不过,“边缘提取”的第一种方法似乎更有趣。您能否描述一下这两种方法中哪一种更有效、更准确? @HNLearner 我会选择边缘或任何特征提取,因为这就是深度端到端解决方案的运作方式,并且它们会产生良好的结果,例如如果您查看卷积神经网络,您会发现它在第一阶段会尝试学习看起来像边缘的特征。 @HNLearner 如果您愿意,可以告诉我您的网络配置,例如隐藏层的数量和每层中的神经元数量等它应该很容易测试出来。如果你愿意,给我发电子邮件。 非常感谢您的帮助,先生。我是机器学习的初学者,不久前才开始学习神经网络。我只使用了一个隐藏层。 @HNLearner 请注意,边缘检测算法通常是应用(卷积)方形高斯滤波器来模糊图像,然后是其他一些滤波器的组合,例如拉普拉斯或索贝尔,找到边缘。 youtube.com/watch?v=uihBwtPIBxM

以上是关于AI 神经网络由于反转颜色而导致错误的手写数字预测。八度/ Matlab?的主要内容,如果未能解决你的问题,请参考以下文章

AI常用框架和工具丨10. TensorFlow实现基于LeNet5的手写数字识别

AI常用框架和工具丨8. Keras实现基于CNN的手写数字识别

AI常用框架和工具丨8. Keras实现基于CNN的手写数字识别

tensorflow 卷积神经网络预测手写 数字

Vertex AI 模型批量预测因内部错误而失败

前馈全连接神经网络和函数逼近时间序列预测手写数字识别