Windows ML,系統內置的機器學習平台初探


人工智能現在很火,雖然最近風頭隱隱有被區塊鏈蓋過,但仍是未來技術轉型的首選方向之一。作為AI核心的機器學習,目前也進化到了可以基於平台自動訓練模型的地步,例如Azure Machine Learning Service和Google AutoML Service。這使得訓練模型的難度大大降低,開發人員可以分出更多精力關注在訓練好的模型應用上。

在這種背景下,各個操作系統平台紛紛推出內置的機器學習框架/運行環境,iOS有CoreML,Android有TensorFlow。Windows在最近的RS4(build 1803)更新之后,也正式內置了機器學習平台- Windows ML

 

Windows ML是什么?


 

Windows ML是Windows全新的內置機器學習平台,用於本機執行預訓練的機器學習模型,並提供了API允許我們快速集成到應用中。

它的亮點如下:

  • 支持硬件加速

在兼容DirectX 12的設備上可以直接使用GPU加速運算,確保機器學習模型可以被高效執行。

  • 本機執行

不依賴於任何遠程服務,不受任何網絡連接限制,本機即可達到低延遲高性能的執行效果。

  • 圖像處理優化

針對計算機視覺場景,對視頻、圖像和相機數據統一預處理為VideoFrame形式,簡化圖像處理流程。

 

模型要求


 

 

 

Windows ML目前僅支持執行ONNX格式模型,其他格式需要預先轉換后再使用。

ONNX是由微軟、Facebook和英特爾等公司推出的一個通用開放的機器學習模型格式,官方支持現有機器學習框架對其轉換。ONNX項目地址

支持轉換的現有模型來源:

  • Core ML
  • Scikit-Learn
  • XGBoost
  • LibSVM

使用的轉換工具為微軟提供的WinMLTools:https://pypi.org/project/winmltools/

轉換工具使用教程請參考官方文檔:https://docs.microsoft.com/en-us/windows/uwp/machine-learning/conversion-samples 

 

代碼生成


 

在安裝了Windows SDK Build 17110或更新版本后,默認會為Visual Studio 2017項目添加模型代碼生成工具mlgen.exe。它可以根據添加的ONNX模型文件,Visual Studio 2017 Preview自動生成C#/CX的定義文件,方便代碼直接調用。

這里以FNS-La-Muse模型為例,這是一個可以將圖像轉為特定風格的模型。

 

 

生成的代碼如下:

 

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.Media;
using Windows.Storage;
using Windows.AI.MachineLearning.Preview;

// FNSLaMuse

namespace Demo
{
    public sealed class FNSLaMuseModelInput
    {
        public VideoFrame inputImage { get; set; }
    }

    public sealed class FNSLaMuseModelOutput
    {
        public VideoFrame outputImage { get; set; }
        public FNSLaMuseModelOutput()
        {
            this.outputImage = VideoFrame.CreateWithSoftwareBitmap(new Windows.Graphics.Imaging.SoftwareBitmap(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, 720, 720));
        }
    }

    public sealed class FNSLaMuseModel
    {
        private LearningModelPreview learningModel;
        public static async Task<FNSLaMuseModel> CreateFNSLaMuseModel(StorageFile file)
        {
            LearningModelPreview learningModel = await LearningModelPreview.LoadModelFromStorageFileAsync(file);
            FNSLaMuseModel model = new FNSLaMuseModel();
            model.learningModel = learningModel;
            return model;
        }
        public async Task<FNSLaMuseModelOutput> EvaluateAsync(FNSLaMuseModelInput input) {
            FNSLaMuseModelOutput output = new FNSLaMuseModelOutput();
            LearningModelBindingPreview binding = new LearningModelBindingPreview(learningModel);
            binding.Bind("inputImage", input.inputImage);
            binding.Bind("outputImage", output.outputImage);
            LearningModelEvaluationResultPreview evalResult = await learningModel.EvaluateAsync(binding, string.Empty);
            return output;
        }
    }
}
View Code

 

 目前由於SDK仍在預覽中,所以Visual Studio正式版並不會自動調用mlgen工具生成定義文件,需要手動執行如下命令:

mlgen -i INPUT-FILE -l LANGUAGE -n NAMESPACE [-o OUTPUT-FILE]
  • INPUT-FILE: ONNX模型文件
  • LANGUAGE: C++或者C#
  • NAMESPACE: 命名空間
  • OUTPUT-FILE: 輸出路徑,可缺省

 

 總結


 

有了Windows ML后我們可以實現以前難以實現的機器學習特性,同時不用依賴外部web service,很多創新的體驗可以實現,不僅僅是在PC,甚至在HoloLens上同樣可以運用機器學習的能力。

最后給大家安利下我的開源項目- Awesome WindowsML ONNX Models ,這個項目除了提供我已經驗證過的模型外,還提供了CoreML模型的快速轉換工具。

 

 

 同時我也在開發為HoloLens編寫的Demo,最近將會和大家見面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM