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, , ));
}
} 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;
}
}
}
目前由于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,最近将会和大家见面
Windows ML,系统内置的机器学习平台初探的更多相关文章
- 16 Windows编程——系统内置窗口子类型之edit、ComboBox、ownerbutton、listbox
edit类型的子窗口 ES_MULTILINE:多行输入文本框 窗口的消息: WL_COMMAND: EN_CHANGE:当edit窗口内的文本内容改变的时候,edit子窗口给父窗口发送一个WL_CO ...
- 15 Windows编程——系统内置窗口子类型之button
button子类型BS_3STATE.BS_AUTO3STATE.BS_AUTOCHECKBOX 源码 #include<Windows.h> #include<Windowsx.h ...
- 13 Windows编程——系统内置窗口子类型之静态子窗口
静态子窗口类型 wndclass:static 源码 #include<Windows.h> #include<Windowsx.h> HINSTANCE G_h; LRESU ...
- windows 服务管理器使用系统内置帐户时密码的输入
windows 服务管理器使用系统内置帐户时在选择帐户如network services后不需要输入密码,直接确认即可,系统会自动附加密码.
- 12 Windows编程——子窗口和系统内置窗口类“BUTTON”
创建子窗口类,使得子窗口有自己的处理过程. 子窗口类型WS_CHILD不能和WS_POPUP一起使用!为什么子窗口要有自己的处理过程?如果使用主窗口类来创建子窗口,那么子窗口和主窗口将公用窗口处理过程 ...
- Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构
Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构 目录 Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构 0x00 摘要 0x01 Alink设计原则 0x02 A ...
- 看懂Azure ML、Windows ML和ML.NET
最新2018微软中国人工智能大会刚刚落下帷幕,对于.NET开发者,可能早已被眼花缭乱的微软家AI体系弄晕了.我特意整理了几张图,以示区别. Azure ML提供了大量认知API服务,外加一个机器学习的 ...
- 让Windows 7内置Administrator 用户也能使用指纹登录
前言 这周末重装了个系统,之前用windows 8 现在8.1预览版出来了,琢磨着是不是给升级玩玩.装上后感觉变化不大,后来一折腾,就换回windows 7 了(64位旗舰版).将安装时创建的用户删除 ...
- 国内物联网平台初探(八):移动云OneNET
国内物联网平台初探(八)——移动云OneNET 平台架构 数据模型 使用场景示意图 服务 IOT Paas 基础服务 为IoT开发者提供智能设备自助开发工具.后台技术支持服务,为您提供物联网专网.短彩 ...
随机推荐
- Uva - 512 - Spreadsheet Tracking
Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some oper ...
- Cocos2D中的纹理(textures)的解释
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- C#之FileInfo的简单操作
和DirectoryInfo一样,FileInfo类同样是很方便的就能实现复杂的功能. 如下,我们一起来看一下一个简单的小例子吧. using System; using System.Collect ...
- OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据
OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...
- HTML5 在<a>标签内放置块级元素
原文地址:HTML5: Wrap Block-Level Elements with A's 原文日期: 2010年06月26日 翻译日期: 2013年08月22日 对比起XHTML来说,HTML5通 ...
- Ubuntu安装JDK与环境变量配置
Ubuntu安装JDK与环境变量配置 一.getconf LONG_BIT 查看系统位数,并下载相应的jdk.我的系统是32位的,所以下载的jdk是:jdk-8u77-linux-i586.gz.并且 ...
- XML Publisher Report Issues, Recommendations and Errors
In this Document Purpose Questions and Answers References APPLIES TO: Oracle Process Manufactu ...
- tomcat集群机制剖析及其生产部署选型
为什么要使用集群? 为什么要使用集群?主要有两方面原因:一是对于一些核心系统要求长期不能中断服务,为了提供高可用性我们需要由多台机器组成的集群:另外一方面,随着访问量越来越大且业务逻辑越来越复杂,单台 ...
- Cocos2d中update与fixedUpdate的区别(四)
关于fixedUpdate:方法的目的 现在,想象一下在小球飞行的位置1到8之间有一个移动的平台: 该平台不停地上升和下降.有些时候小球可以不碰到而飘过平台,有些时候小球会和平台发生碰撞: 这表示小球 ...