本次 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 的介紹就完成了,由於目前官方提供的仍是預覽版,並且公開的內容還不夠多,後續咱們會繼續跟進研究,歡迎你們一塊兒討論,謝謝!