本次 Windows Developer Day,最值得期待的莫过于 Windows AI Platform 了,能够说是千呼万唤始出来。观看直播的开发者们,留言最多的也是 Windows AI Platform。python
下面结合微软提供的展现过程,文档和 Git Sample 来详细分析一下。git
基础概念github
基础认知编程
众所周知,目前 AI(Artificial Intelligence)的主要实现方式就是机器学习(Machine Learning),而 Windows AI Platform 对应的就是 Windows Machine Learning。windows
微软官方对于它的描述以下:服务器
Windows Machine Learning (ML) evaluates trained machine learning models locally on Windows 10 devices, allowing developers to use pre-trained models within their applications. The platform provides hardware-accelerated performance by leveraging the device's CPU or GPU to compute evaluations for both classical Machine Learning algorithms and Deep Learning.架构
结合这一描述,咱们能够简单总结出 Windows ML 的几个特色:app
模型格式框架
Windows ML 的模型格式是 ONNX,Open Neural Network Exchange,是 Microsoft 和 Facebook、Amazon 等公司制定的机器学习模型文件格式标准。在目前不少主流模型训练框架中,都有 ONNX 的原生支持,或者能够支持其余格式转换为 ONNX 格式。 这里是 ONNX 的 Git 主页,你们能够详细了解:GitHub Open Neural Network Exchange
dom
另外你们能够经过 WinMLTools 来把其余格式的模型文件转换为 ONNX 格式,这里是 WinMLTools 地址:Python WinMLTools 0.1.0.5072. 能够转换的格式有 Core ML/Scikit-Learn/XGBoost/LibSVM。
另外 ONNX 支持超过 100 种运算符,针对 CPU 或 GPU 有不一样的运算符支持,这里是运算符列表:https://github.com/onnx/onnx/blob/rel-1.0/docs/Operators.md
技术架构
从这张架构图来看:
开发过程
概述
目前 Windows AI Platform 仍是预览版内容,因此须要预览版的 Windows OS 和 WIndows 10 SDK,下面是下载地址:
Windows Insider Preview Downloads
其中 Visual Studio 的版本要求是 Community、Professional 或 Enterprise,Community 版本的获取最为简单,建议实验性需求时使用这个版本。
先来看一张发布会的展现图:
从上图中能够看出整个 Windows ML 的使用过程:
示例分析
Windows ML 的示例 Git 地址:GitHub Windows-Machine-Learning
上面的连接中也提供了 Windows Insider Preview 17110 OS、Windows 10 SDK 17110 和 Visual Studio 2017 的下载地址,按照指示我下载安装好了开发环境。
来看第一个示例:MNIST_Demo,是一个手写数字识别的 UWP 程序,你们都知道,手写数字识别是 Machine Learning 的基础和入门课题,就像每种编程语言的 Hello World 同样,咱们借这个示例来看一下 Windows ML 对于 ONNX 模型和 Windows 10 SDK 的使用过程。
首先来看一下示例在 Visual Studio 中的工程结构:
这里咱们能够看到:
而在 mnist.cs 文件中
using System; using System.Collections.Generic; using System.Threading.Tasks; using Windows.Media; using Windows.Storage; using Windows.AI.MachineLearning.Preview; ...
...
public sealed class MNISTModel
{
private LearningModelPreview learningModel;
...
咱们能够看到,Windows ML 的命名空间是:Windows.AI.MachineLearning.Preview
能够看得出,目前由于仍是预览版本,全部命名空间包含了 Preview 的字样,但 Windows.AI.MachineLearning 这个命名空间应该能够肯定。
来看看 Windows ML winmd 的结构:
而模型的名称是 LearningModelPreview,来看一下类的定义:
#region 程序集 Windows.AI.MachineLearning.Preview.MachineLearningPreviewContract, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime // C:\Program Files (x86)\Windows Kits\10\References\10.0.17110.0\Windows.AI.MachineLearning.Preview.MachineLearningPreviewContract\1.0.0.0\Windows.AI.MachineLearning.Preview.MachineLearningPreviewContract.winmd #endregion using System.Collections.Generic; using Windows.Foundation; using Windows.Foundation.Metadata; using Windows.Storage; using Windows.Storage.Streams; namespace Windows.AI.MachineLearning.Preview { [ContractVersion(typeof(MachineLearningPreviewContract), 65536)] [Static(typeof(ILearningModelPreviewStatics), 65536, "Windows.AI.MachineLearning.Preview.MachineLearningPreviewContract")] public sealed class LearningModelPreview : ILearningModelPreview { [RemoteAsync] public IAsyncOperation<LearningModelEvaluationResultPreview> EvaluateAsync(LearningModelBindingPreview binding, string correlationId); [RemoteAsync] public IAsyncOperation<LearningModelEvaluationResultPreview> EvaluateFeaturesAsync(IDictionary<string, object> features, string correlationId); [RemoteAsync] public static IAsyncOperation<LearningModelPreview> LoadModelFromStorageFileAsync(IStorageFile modelFile); [RemoteAsync] public static IAsyncOperation<LearningModelPreview> LoadModelFromStreamAsync(IRandomAccessStreamReference modelStream); public InferencingOptionsPreview InferencingOptions { get; set; } public LearningModelDescriptionPreview Description { get; } } }
这个类包含了推断选项、模型的两种加载方式和模型评估方法。
接下来看看界面代码中模型实际的加载方式:
private async void LoadModel() { //Load a machine learning model StorageFile modelFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/MNIST.onnx")); ModelGen = await MNISTModel.CreateMNISTModel(modelFile); }
public static async Task<MNISTModel> CreateMNISTModel(StorageFile file) { LearningModelPreview learningModel = await LearningModelPreview.LoadModelFromStorageFileAsync(file); MNISTModel model = new MNISTModel(); model.learningModel = learningModel; return model; }
mnist.onnx 模型文件被做为一个项目文件被加载到 StorageFile 中,使用 mnist 类的 CreateMNISTModel 方法,具体说是 LearningModelPreview 类的 LoadModelFromStorageFileAsync 方法完成模型加载。
整个 Sample 完成的事情就是使用 InkCanvas 获取用户的手写输入,输入给 Windows ML 进行检测,输出检测结果。来看看运行结果:
另外发布会的展现过程当中还展现了其余的 Sample,这里暂不详细介绍,你们能够看看它完成的效果:
这是一个图片艺术化风格转换的 Sample,相似 Prisma 的实现方式。尤为是第二张,是从摄像头采集图像的实时转换,摄像头图像流的帧率应该在 30 帧以上,依然能在本地运行模型的状况下,完成实时转换。这也让咱们对本地程序完成视频风格转换颇有信心。
到这里,对于 Windows AI Platform 和 Windows ML 的介绍就完成了,由于目前官方提供的仍是预览版,并且公开的内容还不够多,后续咱们会继续跟进研究,欢迎你们一块儿讨论,谢谢!