机器学习领域中最迷人的主题之一是图像识别 (IR)。 使用红外系统的示例包括使用指纹或视网膜识别的计算机登录程序和机场安全系统的扫描乘客脸寻找某种通缉名单上的个人。 MNIST 数据集是可用于实验的简单图像集合沙用红外的算法。 这篇文章并介绍了一个相对简单 C# 程序,向您介绍的 MNIST 数据集,这反过来你接触到红外的概念。
它不太可能你会需要使用红外大多数软件应用程序,但我觉得你可能有用的信息在这篇文章为四个不同的原因。 第一,没有更好的方法,了解的 MNIST 数据集和 IR 概念比通过试验与实际的代码。 第二,有一个基本的理解的红外将帮助您了解的功能和真实的、 先进的红外系统的限制。 第三,在这篇文章中解释的编程技术的几个可用于不同的、 更常见的任务。 第四,你就会找到红外有趣的在其自己的权利。
看到这篇文章去哪儿的最佳方法是要看一看在演示程序图 1。 演示计划是一个经典的 Windows 窗体应用程序。 标签为加载图像的按钮控件读入内存称为MNIST 的数据集的标准图像识别数据集。 数据集包含的 60,000 手写体数字从 0 到 9,已经数码化。 演示了作为一位映射的图像显示当前所选的图像的能力 (左边的图 1),和作为一个十六进制形式 (右侧) 中的像素值的矩阵。
图 1 显示 MNIST 图像
在后面的部分,我送你通过演示程序的代码。 因为该演示是一个 Windows 窗体应用程序的大部分代码与相关的 UI 的功能,并包含在多个文件中。 我在这里集中逻辑。 我到单个 C# 源文件中的可用在重构的演示代码 msdn.microsoft.com/magazine/msdnmag0614。 若要编译下载,你可以将它保存在 MnistViewer.cs,作为本地计算机上创建一个新的 Visual Studio 项目然后将该文件添加到您的项目。 或者,您可以启动 Visual Studio 命令外壳程序 (其中知道,C# 编译器的位置)、 然后导航到保存下载,目录和发出命令 > csc.exe /target:winexe MnistViewer.cs 来创建可执行文件 MnistViewer.exe。 您可以运行该演示程序之前,您需要下载并保存两个 MNIST 的数据文件,如我在下一节中,解释和编辑演示的源代码以指向那些两个文件的位置。
本文假定您有至少中级技能与 C# (或类似的语言),但不会假设你知道任何有关 ir。 演示代码如此演示的代码重构为向非.NET 语言如 JavaScript 将是一个困难的任务使 Microsoft.NET 框架的广泛使用。
IR 文献中使用的术语往往差别很大。 图像分类、 模式识别、 模式匹配或模式分类,也可能会调用图像识别。 虽然这些条款有不同的含义,他们是有时互换使用,这可以使有点困难的相关信息在互联网上寻找。
MNIST 数据集
混合的国家标准和技术 (简称 MNIST) 由红外研究员,作为基准来比较不同的红外算法创建数据集。 其基本思想是如果你有你想要测试红外的算法或软件的系统,可以运行您的算法或系统针对 MNIST 的数据集和比较您的结果与其他系统以前发布成果。
数据集包含的共 70,000 图像 ; 60,000 训练图像 (用于创建红外模型) 和 10,000 测试图像 (用于评估模型的精度)。 每个 MNIST 图像是一个单一的手写的数字字符的数字化的图片。 每个图像是 28 x 28 像素大小。 每个像素值是 0,表示白色,至 255,表示黑。 中间像素值表示的灰度级。 图 2 显示了训练集的前八位的图像。 对应于每个图像的实际数字是显然对人,但确定数字是非常困难的挑战的计算机。
图 2 首八 MNIST 训练图像
奇怪的是,训练数据和测试数据均存储在两个文件中,而不是在单个文件中。 其中一个文件包含图像的像素值和,另一个包含图像的标签信息 (0 到 9)。 每个的四个文件还包含标头信息,和所有的四个文件都存储在已经使用 gzip 格式压缩的二进制格式。
注意在图 1,该演示程序使用仅 60,000 项目训练集。 测试集的格式是相同的训练集。 MNIST 文件的主存储库是目前位于 yann.lecun.com/exdb/mnist。 培训的像素数据存储在文件火车-图像-idx3-ubyte.gz 和培训标签数据存储在文件火车-标签-idx1-ubyte.gz。 若要运行该演示程序,您需要转到 MNIST 的存储库站点,下载并解压的两个培训数据文件。 将文件解压缩,我用的免费的开源 7-Zip 实用程序。
创建 MNIST 查看器
若要创建 MNIST 演示程序,我发起了 Visual Studio,创建一个名为 MnistViewer 的新 C# Windows 窗体项目。 演示有没有重大的.NET 版本依赖关系,因此,任何版本的 Visual Studio 应该工作。
模板代码加载到 Visual Studio 编辑器后,我设置的 UI 控件。 我添加了两个 TextBox 控件 (textBox1,textBox2) 要坚持两个解压后的培训文件的路径。 我添加一个按钮控件 (button1),并给了它一个标签加载图像。 我添加了两个多个 TextBox 控件 (textBox3,textBox4) 以保存当前图像索引和下一个图像索引的值。 我使用 Visual Studio 设计器,分别设置"NA"和"0,"这些控件的初始值。
我添加了一个 ComboBox 控件 (comboBox1) 的图像放大倍数值。 使用设计器,我去到该控件的项集合,添加字符串"1"到"10"。我添加了第二个按钮控件 (button2),并给了它一个标签的显示下一次。 我添加了 PictureBox 控件 (pictureBox1),将其背景色属性设置为 ControlDark,以便看到控件的轮廓。 我将图片框大小设置为 280 x 280 允许最多 10 倍的放大倍率 (回顾 MNIST 图像是 28 x 28 像素为单位)。 我添加了第五个 (textBox5) 文本框以显示十六进制值的图像,然后将其多行属性设置为 True 和其字体属性设置为 8.25 磅 Courier New 和扩大其大小到 606 x 412。 而且,最后,我添加了一个列表框控件 (listBox1) 的日志记录消息。
后放置 UI 控件拖到 Windows 窗体,添加三个类范围字段: