Windows Developer Day - Windows AI Platform

来源:https://www.cnblogs.com/shaomeng/archive/2018/03/11/8540860.html
-Advertisement-
Play Games

本次 Windows Developer Day,最值得期待的莫過於 Windows AI Platform 了,可以說是千呼萬喚始出來。觀看直播的開發者們,留言最多的也是 Windows AI Platform。 下麵結合微軟提供的展示過程,文檔和 Git Sample 來詳細分析一下。 基礎概念 ...


本次 Windows Developer Day,最值得期待的莫過於 Windows AI Platform 了,可以說是千呼萬喚始出來。觀看直播的開發者們,留言最多的也是 Windows AI Platform。

下麵結合微軟提供的展示過程,文檔和 Git Sample 來詳細分析一下。

基礎概念

基礎認知

眾所周知,目前 AI(Artificial Intelligence)的主要實現方式就是機器學習(Machine Learning),而 Windows AI Platform 對應的就是 Windows Machine Learning。

微軟官方對於它的描述如下:

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 的幾個特點:

  • 硬體加速  在支持 DirectX12 的硬體設備上,Windows ML 可以利用 GPU 對模型的評估實現加速。
  • 本地評估  Windows ML 可以利用本地硬體進行模型評估,減少了模型上傳到雲端造成的服務端流量成本和服務端壓力。可以更快速便捷的得到結果。
  • 圖像處理  在機器視覺場景,Windows ML 簡化並優化了圖像、視頻文件和視頻流的處理,對輸入源做預處理和攝像頭管道處理。  

 

模型格式

Windows ML 的模型格式是 ONNX,Open Neural Network Exchange,是 Microsoft 和 Facebook、Amazon 等公司制定的機器學習模型文件格式標準。在目前很多主流模型訓練框架中,都有 ONNX 的原生支持,或者可以支持其他格式轉換為 ONNX 格式。 這裡是 ONNX 的 Git 主頁,大家可以詳細瞭解:GitHub Open Neural Network Exchange

另外大家可以通過 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

 

技術架構

從這張架構圖來看:

  • 底層是 Direct 層的 DirectML API/Direct3D/CPU/GPU,DirectX 的版本支持是 DX12
  • 上面一層是推斷引擎,包括了 Win32 和 WinRT 部分,主要負責模型和設備資源管理,負責載入和編輯核心操作符,執行數據流圖
  • 最上層是應用程式層,同樣包括了 Win32 和 WinRT 部分;令人欣喜的是,它在所有 2018 年的 Windows 版本上都可用

 

開發過程

概述

目前 Windows AI Platform 還是預覽版內容,所以需要預覽版的 Windows OS 和 WIndows 10 SDK,下麵是下載地址:

Windows Insider Preview Downloads

其中 Visual Studio 的版本要求是 Community、Professional 或 Enterprise,Community 版本的獲取最為簡單,建議實驗性需求時使用這個版本。

先來看一張發佈會的展示圖:

 

從上圖中可以看出整個 Windows ML 的使用過程:

  • 首先在雲端或者本地伺服器上訓練模型,生成 ONNX 模型文件
  • 把 ONNX 添加到本地開發環境,如 Visual Studio 中
  • 在本地程式中通過 Windows 10 SDK 使用和評估 ONNX 模型的性能和學習結果
  • 把集成了 ONNX 的本地程式發佈到 Windows 序列的全平臺各種設備中

 

示例分析

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 中的工程結構:

這裡我們可以看到:

  • Universal Windows,也就是 Windows 10 SDK 的引用版本是:10.0.17110.0,也就是 Windows ML 支持的最低版本預覽版 SDK
  • mnist.onnx,也就是前面說明的 Windows ML 模型支持格式,被直接添加到瞭解決方案中的 Assets 文件夾中,Build Action 為 “Content”

而在 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 的介紹就完成了,因為目前官方提供的還是預覽版,而且公開的內容還不夠多,後續我們會繼續跟進研究,歡迎大家一起討論,謝謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 字元串 字元串或串(String)是由數字、字母、下劃線組成的一串字元,用雙引號或單引號包裹的為字元串 下麵示例: 語法錯誤 第一行出現三個單引號,Python 解析器匹配不上成對的引號,所以報錯。 解決方法:1、可使用雙引號包裹 2、可以使用反斜杠\ 轉義字元 字元串 、數字互轉 內置函數int( ...
  • Python機器學習介紹(Python Machine Learning 中文版) 機器學習,如今最令人振奮的電腦領域之一。看看那些大公司,Google、Facebook、Apple、Amazon早已展開了一場關於機器學習的軍備競賽。從手機上的語音助手、垃圾郵件過濾到逛淘寶時的物品推薦,無一不用... ...
  • Python機器學習 機器學習,如今最令人振奮的電腦領域之一。看看那些大公司,Google、Facebook、Apple、Amazon早已展開了一場關於機器學習的軍備競賽。從手機上的語音助手、垃圾郵件過濾到逛淘寶時的物品推薦,無一不用到機器學習技術。 如果你對機器學習感興趣,甚至是想從事相關職業... ...
  • 一、前言 JUC這部分還有線程池這一塊沒有分析,需要抓緊時間分析,下麵開始ThreadPoolExecutor,其是線程池的基礎,分析完了這個類會簡化之後的分析,線程池可以解決兩個不同問題:由於減少了每個任務調用的開銷,它們通常可以在執行大量非同步任務時提供增強的性能,並且還可以提供綁定和管理資源(包 ...
  • 內容:Java變數,基本數據類型 邏輯類型:boolean =true/false整數類型:byte占一個位元組,short占兩個位元組,int占四個位元組,long占8個位元組 int 可以表達十進位範圍 (2147483648,4294967296)字元類型:char占兩個位元組 (加單引號)ch=97, ...
  • 前言 在一個小項目的需求中,我需要一個短鏈生成伺服器來縮短一些某個網站的鏈接。 剛開始我使用的是新浪的短鏈生成服務,後來心血來潮Google了一下短鏈生成的演算法,在知乎上看到了 "一個非常棒的構思" ,也就是直接使用資料庫的id的62進位形式作為短鏈索引。 當天我們就把新浪的短鏈換成了自己的服務,不 ...
  • 作為一個java的學習者,我相信JDBC是大家最早接觸也是入門級別的資料庫連接方式,所以我們先來回憶一下JDBC作為一種用於執行SQL語句的Java API是如何工作的。下麵的一段代碼就是最基本的JDBC開發流程。 在上代碼之前要先導入JDBC的jar包,由於我用的資料庫是mysql,所以要先導 入 ...
  • 兩個星期前,微軟發佈了 "EF Core 2.1 Preview 1" ,同時還發佈了 ".NET Core 2.1 Preview 1" 和 "ASP.NET Core 2.1 Preview 1" ;EF Core 2.1 Preview 1 除了 "許多小改進和超過100種產品錯誤修複之外" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...