AI手写数字识别(一)

news2024/9/25 3:23:43

使用Visual Studio Tools for AI加速桌面智能应用开发

主要知识点

  • 典型的AI应用的代码结构和功能,如处理输入;
  • 使用Visual Studio Tools for AI进行TensorFlow模型到.Net Framework应用环境的快速集成。

简介

本文将介绍一例"手写数字识别应用"的开发过程。本文将通过这一入门级案例展示人工智能应用开发中的典型元素,如准备人工智能应用开发所需的软件环境,使用Visual Studio Tools for AI快速集成模型、加速人工智能应用开发,以及在代码中处理用户输入,以便人工智能模型能正确地接受输入的数据等等。本文将对这些工作和该应用的主要代码逻辑进行分析、讲解。此外,本文还将解答手写数字识别应用开发的一些常见问题,并介绍现实场景中的一些可能需求。开发将基于桌面.Net Framework环境和训练好的MNIST手写数字分类模型完成。

目标应用介绍

背景

在移动硬件得到高度发展的今天,手写输入已经成为了一种非常常见的输入方式。然而手写输入和传统的鼠标、键盘输入方式有很大的不同,相对于传统输入方式生产的数据,手写输入的内容——也即数据——在很多场景下都不是计算机能直接处理的。

传统的输入方式里,鼠标的点击可以对应到屏幕上精确的一点,进而对应到某一特定的UI控件;键盘的敲击可以产生一个特定的字符数据。这些都是计算机可以很容易处理的。而通过手写输入,计算机得到的只是一块具有"特别的形状"的图形,但这图形中蕴含着的用户真正的意图,计算机却不能识别。而这些蕴含其中的意图,才是很多应用场景的核心价值所在。比如用户希望设备上的手写输入法,可以将手写的字转换成传统的字符数据;笔记应用应能识别用户手写的笔记,并进行索引以便查询或计算一些数学表达式的结果......然而我们都有所了解,用传统的技术手段,很难高质量地达成这一识别任务。

不过近年来人工智能领域取得了很多令世人瞩目的成果,其中图像识别方面的很多成果,非常值得我们借鉴。那么这些人工智能领域的成果,能否助力我们广大应用开发者解决上述这些手写输入相关的难题呢?答案是肯定的。

本文将介绍一款"手写数字识别应用"的开发和其代码结构。这款应用通过借力MNIST数据集,具备了最基本的手写输入功能和图像识别功能,能将用户手写的0,1,2,...,9数字单个地识别出来。该应用使用效果如图:

完整应用的使用效果

麻雀虽小,五脏俱全。这款入门级应用涵盖很多了人工智能应用开发中的典型问题。本文将以这些基本问题为出发点,为读者展开人工智能应用开发的画卷。

开发环境

本文采取.Net Framework桌面环境作为开发环境,基于WPF框架实现用户界面,并依赖TensorFlow和VS Tools for AI等组件来完成人工智能模型的创建和集成。

后文将介绍的开发中需要用到人工智能模型的训练环境,请确保已经按照【引用:课程1 – 环境准备】中所述在本地机器上下载(Git的术语叫“克隆”)了微软AI样例库(即命令),并已成功安装了相关工具(即CUDA、cuDNN,若硬件允许)并成功运行了安装脚本(即)。git clone https://github.com/Microsoft/samples-for-ai.gitinstaller\install.py

训练模型

模型介绍

之前下载的samples-for-ai样例库中包含了大量的机器学习训练和应用的示例,其中就有针对MNIST数据集的人工智能模型(下称MNIST模型)训练程序,这正是我们需要的。

MNIST数据集包含了大量单个手写数字的位图数据,包含各种手写风格,并且这些位图数据都已经被很好地标记过了。即每一张手写数字的位图都存在一个对应的数字,并且这个数字是可以以数据的形式被访问的。这极大地简化了我们的准备工作。

MNIST数据集为本文中识别手写数字的问题提供了大量素材,利用这些素材我们可以训练出专门用于识别单个手写数字的人工智能模型。

同时,我们选择使用TensorFlow来训练MNIST模型。TensorFlow是一款使用非常普遍、很有代表性的机器学习框架。

实际训练

打开“命令提示符”,再同cd命令进入samples-for-ai样例库中,TensorFlow示例集中的MNIST目录,如:

cd D:\Users\squir\source\repos\samples-for-ai\examples\tensorflow\MNIST

小提示

如果最初下载(即克隆)samples-for-ai的磁盘并非C盘(命令提示符默认的初始磁盘),如D盘,那么执行完cd命令后还需再执行D:命令将当前命令行切换到其他磁盘。

此时可以通过 命令检查一下我们在命令行下能否访问到Python。python –-version

如果出现下图的情况:

命令提示符内没有正确配置Python

则还需要执行下面的命令,将通过Visual Studio 2017 Installer安装的Python 3.6(也就是【课程1】中执行 脚本的Python)所在的目录加入 环境变量,以便我们接下来能正确执行Python:install.pyPATH

set PATH=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64;%PATH%

注意

此处的真正目的是将通过 脚本安装了机器学习工具的Python.exe引入命令行,而非引入任意的Python.exe。如果Python不是通过Visual Studio 2017 Installer安装的,或者执行 脚本的是别的环境下的Python.exe,那么上述 命令将不适用,需要根据实际情况调整环境变量PATH。install.pyinstall.pyset PATH

然后我们执行下面的命令来启动MNIST模型的训练:

python mnist.py

运行过程中会打印出一些 error 字样。别担心,这都是AI训练过程中正常的错误率信息。随着训练过程的进行,模型在训练时的错误率会逐步下降,这表示 AI 模型推理预测出的结果越来越准确了。模型训练的最终结果如下图:

训练的最终结果

训练结束后,我们可以在samples-for-ai样例库下的 文件夹内看到 文件和 文件夹,它们即是我们训练出的MNIST模型。examples\tensorflow\MNIST\exportsaved_model.pbvariables

小提示

如果用来训练的机器没有配备高性能的GPU,训练MNIST可能会花费很长时间。如上图所示,需要8500个Step才能完成训练,我们可以靠观察Step数量的增量来判断训练速度。如果训练速度很慢(特别是没有高性能GPU的情况下),我们可以先进行下一章节的学习。之后需要用到训练出的MNIST模型时,再确保训练完成即可。

应用的构建和理解

本文已经为读者准备好了该手写数字识别应用的主体代码,但仍需要完成对MNIST模型的集成工作,才算完成整个人工智能应用的开发。接下来本文将介绍模型的集成工作和对整个项目内的重点代码片段进行分析讲解。

完成应用

克隆代码

本文所需的主体代码就在这个仓库中,可以通过 当前仓库来获取代码。git clone

注意

由于本教程使用的工具对中文路径的支持不好,请务必将 文件夹复制到 没有中文字符的路径 下,再从那里打开解决方案。sample-mnist

成功获取代码后,可以双击打开本文件下的 解决方案文件,以启动 Visual Studio 2017 并加载包含应用主体代码的解决方案。sample-mnist\MnistDemo.sln

引用模型

注意

这一步骤需要用到我们在实际训练章节中训练出的模型。如果尚未训练完成,请等待训练完成后再继续阅读。

  1. 首先创建模型项目。在解决方案资源管理器中,右击解决方案,指向添加,再点击新建项目,如下图所示:

新建项目

  1. 在弹出的添加新项目的对话框里,选择 AI Tools 下的 Inference 后,在右边选择 模型推理类库(.NET Framework),如下图所示。然后在下面的 名称 处改为 Model,并点击确定。

注意

名称(即“Model”)一定要保持一致(包括大小写),这是生成代码的命名空间。已有的代码会按照预设的名称来访问模型相关的代码。

选择模型推理类库(.Net Framework)

  1. 点击确定后,Visual Studio 会提示正在 检查环境。完成后会显示创建向导对话框,如下图。红色的框先不用担心,点击 浏览

新打开的创建向导对话框

  1. 找到之前训练出的 文件(一般在samples-for-ai样例库下的 文件夹内),并点击 打开。如下图所示。saved_model.pbexamples\tensorflow\MNIST\export

选取训练好的MNIST模型文件

  1. 点击打开后,会出现 分析模型 的过程,等待分析完成。分析完成后,再如图所示在类名中输入 Mnist,最后点击 确定。第一次导入模型会下载所依赖的库,因此,正在创建项目“Model”... 的对话框会显示较长时间。

填入类名“Mnist”

注意

类名(即“Mnist”)一定要保持一致(包括大小写),这是生成的模型访问类的类名。已有的代码会按照预设的名称来访问模型相关的代码。

小提示

分析模型 会调用 TensorFlow 来分析模型文件的输入输出等信息,以便生成相应的代码,有时会花一两分钟。

  1. 创建项目完成后,先检查一下是不是如图中高亮区域1所示产生了 Model 项目,并且里面有 文件(高亮区域1)。如果没有看到此文件,通常是由于网速过慢,下载超时造成的。请参考5.2创建模型项目时出现错误。packages.config

推理类库创建成功后,我们还需要调整一个依赖项的版本,否则会出现不兼容的错误。要调整依赖项版本,请在解决方案管理器中,于 Model 项目下的 引用 上右键,选择 管理NuGet包,如下图所示。

管理NuGet包

然后在弹出的NuGet包管理页面里,找到 Microsoft.ML.Scoring 项(已经被自动安装了,比如下图中显示的 1.2.0 版),我们需要将它换成其他版本。请在下图所示的高亮区里,选择 1.0.3 版本并安装。之后等待安装完备。这样就设置好可以运行本教程的软件环境了。

安装Microsoft.ML.Scoring包1.0.3版本

完成NuGet包的版本替换之后,我们需要在主体界面的项目上,引用我们的模型推理类库。

在解决方案资源管理器中,右击 MNIST.App 项目的 引用,并点击 添加引用。如下图高亮区域2、3所示。

为 MNIST.App 项目添加引用

  1. 在弹出的对话框中,点击 项目,并在右侧将 Model 勾上。这样就能在窗体项目 MNIST.App 中引用 Model 项目中用于访问MNIST模型的代码了。如图所示。

添加对Model项目的引用

  1. 现在按下 CTRL+F5,或者点击工具栏上的 启动 按钮。之后便会如下图一样,我们的手写数字识别应用运行起来了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1380362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数——行列式相关性质

目录 一、行列式与它的转置列行列式相等 二、对换行列式的两行(列),行列式变号 三、行列式某行(列)有公因子k,则k可以提到行列式外 四、行列式中若两行成比例,则行列式为0 五、行列式的某一行…

使用FreeBASIC设计8051单片机汇编编译器

在STC论坛上看到有人用C语言实现8051汇编编译器(源码),好奇下,试着用FB写了一下。 基本原理就是通过分析汇编文件然后转换为机器码。以下是51汇编与机器码对应的表格(数据来自网络,如果发现有误请联系QQ149…

腾讯云添加SSL证书

一、进入腾讯云SSL证书: ssl证书控制台地址 选择“我的证书”,点击"申请免费证书" 2、填写域名和邮箱,点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS:云解析DNS地址 进入我的解析-记录…

C#,入门教程(17)——条件语句(if-else)的基础知识

上一篇: C#,入门教程(16)——可变数据类型(var)的基础知识与使用禁忌https://blog.csdn.net/beijinghorn/article/details/124032216 程序的核心是逻辑。 逻辑的核心是布尔条件表达式。 逻辑的主要体现形式之一是 if-else 语句…

【文末送书】语义解析:连接自然语言与机器智能的桥梁

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

R语言【paleobioDB】——pbdb_collections():通过参数选择,返回多个采集号的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_collections (...) Arguments 参数【...…

2024趋势:ERP中数据分析的五大要点

2024 年,数据分析不仅仅是 ERP 实施中的一个额外功能;这就像第一步,将最终确定整个 ERP 实施项目的成功之路。忘记笨重的电子表格和无休止的报告——准备好驾驭这五种新兴趋势的浪潮: 一、人工智能和机器学习 (ML) 的兴起 人工智能驱动的数据…

PiflowX-DorisRead组件

DorisRead组件 组件说明 从Doris存储读取数据。 计算引擎 flink 有界性 目前Doris Source是有界流,不支持CDC方式读取。 组件分组 Doris 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述…

java使用itext7实现html转pdf全代码完整示例

之前项目有个需求,系统实现自己的打印功能,基本上都是前端找了个框架搞的,我呢,就是配合处理一些前端不好处理的部分,但是新一期的需求评审中,前端提出了,前端自己生成pdf在数据量大的时候会很慢…

前端基础知识整理汇总(上)

HTML页面的生命周期 HTML页面的生命周期有以下三个重要事件&#xff1a; DOMContentLoaded —— 浏览器已经完全加载了 HTML&#xff0c;DOM 树已经构建完毕&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 load —— 浏览器已经加载了所有的资源&…

C语言宏定义小技巧

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒&#xff08;除闰年&#xff09;举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

商城小程序系统:数字化转型下的商机

近几年&#xff0c;电商行业不断发展&#xff0c;线上购物已经成为大众的重要选择。线上商超作为传统的商业购物模式&#xff0c;为带来更多的商机&#xff0c;也逐渐转向了线上电商模式&#xff0c;越来越多的商超企业开始搭建专属的商城小程序&#xff0c;为消费者提供方便快…

适用于动态 IT 环境的服务器流量监控软件

服务器在网络性能中起着至关重要的作用&#xff0c;这意味着保持其最佳容量至关重要。企业需要将 AI、ML 和云技术融入其 IT 中&#xff0c;从而提供充分的敏捷性、安全性和灵活性&#xff0c;在这方面&#xff0c;服务器流量监控已成为当务之急。通过定期监控通信、跟踪流量上…

《Linux C编程实战》笔记:线程同步

这一节主要是解决共享资源的处理。操作系统里也讲过互斥、锁之类的概念。 互斥锁 互斥锁通过锁机制来实现线程同步&#xff0c;同一时刻只允许一个线程执行一个关键部分的代码 一下是操作互斥锁的函数&#xff0c;均声明在pthread.h中。 pthread_mutex_init&#xff08;初始…

【2024济南生物发酵展同期会议】合成生物学背景下的发酵深层次技术论坛

2024合成生物学背景下的发酵深层次技术论坛 新技术、新资源、新机遇 反应设备.过滤分离.提取浓缩.干燥.流体机械.实验室设备.仪器仪表.废水废气 主办单位&#xff1a; 生物发酵展组委会 发酵人社区公众号 万物生物合成俱乐部 承办单位&#xff1a; 上海履济技术服务中心 …

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示 引言 在企业级应用或桌面程序中&#xff0c;经常需要从远程服务器获取数据&#xff0c;并在用户界面上展示这些数据。本文将通过一个实际案例&#xff0c;演示如何在 Windows Forms 应用程序中使用 FtpWebReques…

openWrt将插件安装到USB外接硬盘上

问题描述&#xff1a; 陆由器的闪存空间不够&#xff0c;而陆由器有一个usb接口&#xff0c;可以外接硬盘&#xff0c;可以将插件安装在外接硬盘上&#xff0c;就再也不用担心陆由器的空间不够了&#xff1b; 解决方案&#xff1a; 查看USB目录&#xff0c;为 mnt/sdb1 利用…

Web前端-移动web开发_流式布局

文章目录 移动web开发流式布局1.0 移动端基础1.1浏览器现状1.2 手机屏幕的现状1.3常见移动端屏幕尺寸1.4移动端调试方法 2.0 视口2.1 布局视口 layout viewport2.2视觉视口 visual viewport2.3理想视口 ideal viewport&#xff08;苹果&#xff09;2.4meta标签 3.0 物理像素(手…

kafka入门(六):日志分段(LogSegment)

日志分段&#xff08;LogSegment&#xff09; Kafka的一个 主题可以分为多个分区。 一个分区可以有一至多个副本&#xff0c;每个副本对应一个日志文件。 每个日志文件对应一个至多个日志分段&#xff08;LogSegment&#xff09;。 每个日志分段还可以细分为索引文件、日志存储…

MOOSE相关滤波跟踪算法(个人学习笔记)

MOOSE 论文标题 “Visual Object Tracking using Adaptive Correlation Filters” 原文地址 用滤波器对目标外观进行建模&#xff0c;并通过卷积操作来执行跟踪。 参考阅读&#xff1a; 目标跟踪经典算法——MOSSE&#xff08;Minimum Output Sum Square Error&#xff09…