Simulator Screen Shot - iPhone 5s - 2018-06-25 at 01.12.20

近年来所谓的「大数据」(Big Data)、「AI 人工智慧」、「机器学习」(Machine Learning)、「深度学习」(Deep Learning)突然变得很夯,可说是目前最火热、最具爆炸性发展的当红显学。我没有在豪洨,热门的程度,可观察这个现象:在台南的市立图书馆与其他分馆中,Python 的书籍根本是一书难求,而且持续很长一段时间。Python 本身除了用途广泛之外,在机械学习领域更是入门标准,无法规避不学的程式语言,不会 Python 就等于做不成机械学习专家。在多年前我就对这个领域很感兴趣,也持续 Google 搜到不少教材,不过坦白讲这类学问的技术理论实在是深不见底、高不可攀,找到的教学常常需要参考某某博士论文,或是先弄懂某某数学演算法,这实非我等江湖术士能力所及,所以这条学习之路不论从哪开始下手,没多久就一定会碰到铁钉子,走得跌跌撞撞,始终得不到入门的要领。

直到去年(2017 年)苹果公司于 WWDC 2017 发表了 Core ML 套件,我这条机械学习的黑暗之路终于见到曙光。苹果宣称 Core ML 能轻易的将「机械学习模型」(Machine Learning Model)整合到 iOS 装置的应用程式内,并在 Developer 官网上释出几个实用的模型(副档名为 mimodel)。到了今年 WWDC 2018,苹果进一步释出 Create ML 工具,号称「不需具备机械学习专家技能,也能在 Mac 上轻松使用机械学习技术」,并且自动启用可用的 GPU 加速训练过程。当然了,加上黑苹果技术,这句话也可改写成:

「不需具备机械学习专家技能,也能在个人电脑上轻松使用机械学习技术」

照这篇官方教学(网址),我终于如愿完成人生第一个机械学习模型,让手机也能认识新事物!

萤幕快照 2018-06-24 上午11.18.40

萤幕快照 2018-06-24 上午11.18.51

感恩 Apple!赞叹 Apple!让艰涩难走的机械学习之路,突然变成一条平坦的康庄大道。(希望啦!)

这篇文章,就是简单纪录一下如何自行创建训练导出机械学习模型(.mlmode),并应用在 iOS App 上面。步骤很简单,真的很简单!

准备工作:

  • 一台安装 macOS 10.14 Mojave 作业系统的个人电脑(安装说明
  • 安装 Xcode 10 (下载) 的 macOS 10.14 Mojave 的作业系统,需 Apple 开发者帐号权限。

不过目前的 macOS 10.14 Mojave Beta 2 有 BUG,会让训练的过程中发生错误而无法完成。(2018.07.10:BUG 已在 Beta3 解决。)

iOS App 使用 .mlmodel 模型

这个部分在去年的 iOS 11 就有了,所以只需要 Xcode 9 就行了。教学很多,在官方强势主导下,找到的大多是 swift 的范例。网路上当然也有 Object-C 的范例就是了。本文内容将使用少数几行 Object-C 语言,搭配官网提供的 MobileNet.mlmodel 作为示范。

(1) 下载 MobileNet.mlmodel (官网下载),并拉进 iOS 专案。

(2) 点击 MobileNet.mlmodel 并查看资讯:

萤幕快照 2018-06-24 下午12.45.47

.mlmodel 是去年(2017)由苹果公司发表对应自家 Core ML 模型的档案格式。上图中点击专案内的 MobileNet.mlmodel 项目后,在 Model Evaluation Parameter 这里可查看模型的输入输出的项目。

  • 输入项目限定在 224x224 尺寸的影像(Image)。
  • 输出的项目有字串(String)与字典(Dictionary,string -> double)两个。

点击 Model Class 内 MobileNet 右边的箭头(红框处),则会依照专案使用的语言(Object-C 或 swift)出现可用的 API 列表。这说明了 .mimodel 其实是一种封装。

萤幕快照 2018-06-24 下午4.35.33

虽然有很多个,不过最基本只需要两个就能运作:

- (instancetype)init NS_UNAVAILABLE;

- (nullable MobileNetOutput *)predictionFromImage:(CVPixelBufferRef)image error:(NSError * _Nullable * _Nullable)error;

也就是最少只需两行就能跑了(当然实际上不可能这么偷懒)。输入的 Image 并不是常见的 UIImage 类,而是影片处理中常见的 CVPixelBufferRef 类,且大小限定在 224x224 。所以在取得 UIImage 类别的物件后,需转换成 224x224 大小的 CVPixelBufferRef 类型物件。这部分也有人把 Object-C 程式码写好了。

参考网址:https://github.com/happymanx/CoreMLTest/

- (UIImage *)imageResize:(UIImage*)img toSize:(CGSize)newSize;

- (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image;

用这两个方法就能转换输入 Image 的格式问题。

至于模型拉进专案之后,撰写应用程式时只要在前面加入 #import "xxxxxx.h" (Object-C 语法)就可以使用模型提供的 API 了。以这个范例使用的 MobileNet.mlmodel 来说,前面加入 #import "MobileNet.h" 就行了。

用最简单的程式码来检验运作的方式与结果。 

    // 用 Google 搜寻 "狗"图片,随机挑一张图片,取用图的网址,做成 UIImage 物件 img

    UIImage *img = [UIImage imageWithData:

                   [NSData dataWithContentsOfURL:

                    [NSURL URLWithString:@"https://www.teepr.com/wp-content/uploads/2014/08/%E9%96%8B%E5%BF%83%E7%9A%84%E7%8B%97%E7%8B%97.jpg"]]];

    // 图片内容显示在 App 画面上的 UIImageView(名称为 imageView)

    imageView.image = img;

    // 辨识前先缩图

    UIImage *img224x224 = [self imageResize:img toSize:CGSizeMake(224, 224)];

    // 转换成 CVPixelBufferRef 型态

    CVPixelBufferRef buffer = [self pixelBufferFromCGImage:img224x224.CGImage];

 

    // 开始影像辨识,载入模型

    MobileNet *mobileNet = [[MobileNet alloc] init];

    // 输入 CVPixelBufferRef 进行辨识,辨识输出结果为 MobileNetOutput 类别物件。

    NSError *error = nil; // 接收辨识程序的错误内容

    MobileNetOutput *output = [mobileNet predictionFromImage:buffer error:&error];

    // 检视输出结果:字串部分为 classLabel

    NSLog(@"output.classLabel = %@", output.classLabel);

    // 检视输出结果:字典部分为 classLabel

    NSLog(@"output.classLabelProbs = %@", output.classLabelProbs);

    // 将输出结果的字串部分,显示在 App 画面中的 UILabel(名称 classifier)

    classifier.text = output.classLabel;

App 的画面结果:

Simulator Screen Shot - iPhone 5s - 2018-06-24 at 17.31.04

终端视窗的回应讯息:

MobileNetProject[1004:38219] output.classLabel = Pembroke, Pembroke Welsh corgi

MobileNetProject[1004:38219] output.classLabelProbs = {

    "Afghan hound, Afghan" = "6.213400904897526e-09";

    "African chameleon, Chamaeleo chamaeleon" = "2.19332374484793e-09";

    "African crocodile, Nile crocodile, Crocodylus niloticus" = "8.66392568799057e-10";

    "African elephant, Loxodonta africana" = "1.9315593569047e-09";

    "African grey, African gray, Psittacus erithacus" = "1.536224836229394e-08";

    "African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus" = "1.789419101783096e-08";

    "Airedale, Airedale terrier" = "1.449278741461058e-08";

    "American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier" = "6.084317760723934e-08";

    "American alligator, Alligator mississipiensis" = "2.423576617172074e-10";

    "American black bear, black bear, Ursus americanus, Euarctos americanus" = "2.094742157510154e-08";

    "American chameleon, anole, Anolis carolinensis" = "9.495959574223889e-09";

    "American coot, marsh hen, mud hen, water hen, Fulica americana" = "2.884459615604129e-10";

    "American egret, great white heron, Egretta albus" = "3.334652831643581e-10";

    "American lobster, Northern lobster, Maine lobster, Homarus americanus" = "1.485787919364157e-07";

    "Angora, Angora rabbit" = "2.548045685557554e-08";

回应的文字部分是「Pembroke, Pembroke Welsh corgi」,字典的部分有几百行的讯息。搜寻字典中「Pembroke, Pembroke Welsh corgi」这行:

    "Pembroke, Pembroke Welsh corgi" = "0.8785513043403625";

辨识结果不难理解,字典的部分前面的字串代表机械学习模型可辨识出来的物品名称,后面的数字则是「该笔结果的准确率」。这些物品名称中,「Pembroke, Pembroke Welsh corgi」所显示的数字结果最大,大约是 87%(0.87),其他物品名称都没有比这个数字还高,大多只有 <1 % 的准确率。

至于「Pembroke, Pembroke Welsh corgi」是尛东西?丢给 Google 查询结果:

Google:潘布鲁克威尔斯柯基犬,就是俗称的「柯基犬」。

萤幕快照 2018-06-24 下午5.34.54

极简化的说法:MobileNet 觉得这张狗图,跟柯基犬有 87% 像。

App 使用 .mlmodel 模型的方法真的是非常简单,输入的 Image 类型是 CVPixelBufferRef 而非 UIImage 类别的最大原因,我想应该是影片处理程序的过程中可随时提取 CVPixelBufferRef 来源,应用的层面更广。

使用 Vision Framework 的另一种写法:

    NSError *err = nil;

    MobileNet *mobileNet = [[MobileNet alloc] init];

    //将模型转换为 VNCoreMLModel 类,#import <Vision/Vision.h>

    VNCoreMLModel *vnModel=[VNCoreMLModel modelForMLModel:mobileNet.model error:&err]; //转换为 VNCoreMLModel

    //建立一个 VNCoreMLRequest,传入 VNCoreMLModel,并处理辨识结果于 completionHandler 区段

    VNCoreMLRequest *request=[[VNCoreMLRequest alloc] initWithModel:vnModel completionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {

        CGFloat confidence = 0.0f;

        VNClassificationObservation *tempClassification = nil;

        for (VNClassificationObservation *classification in request.results) {

            //NSLog(@"%@ %.2f%%",classification.identifier, 100 * classification.confidence); //查看辨识率

            if (classification.confidence > confidence)

            {

                confidence = classification.confidence;

                tempClassification = classification;

            }

        }

        classifier.text = tempClassification.identifier;

    }] ;

    request.imageCropAndScaleOption = VNImageCropAndScaleOptionCenterCrop;

    UIImage *img = [UIImageimageWithData:[NSDatadataWithContentsOfURL:[NSURLURLWithString:imgurl]]];

    imageView.image = img;

    

    //建立一个 VNImageRequestHandler,将图片传入

    VNImageRequestHandler *handler = [[VNImageRequestHandleralloc] initWithCGImage:img.CGImageoptions:nil];

    NSError *error = nil;

    // VNImageRequestHandler 运行 VNCoreMLRequest 类

    [handler performRequests:[NSArrayarrayWithObject:request] error:&error];

    if (error) {

        NSLog(@"%@",error.localizedDescription);

    }

这种写法虽然比较啰唆,但是可统一 .mlmodel 的输出接口,而且不用另外处理图片缩图/转换的问题。两种写法的辨识结果相同,但辨识率数字有些许差异。

使用 Create ML 自行训练产生机械学习模型(.mlmodel)

上面的例子是使用苹果提供已经做好的 .mlmodel 模型,能辨识的影像也是生活常见的事物,不过在商业实务上,不太可能引用这些定义拢统的识别结果,例如识别某厂商特定产品做相关应用,得针对特定目的去产生训练模型。在今年 WWDC 2018 以前,必须使用另外的机械学习套件产生模型之后,再透过「Core ML Tools」工具把模型转换成 .mlmodel 格式,操作者必须自带机械学习专业知识与技能,得熟悉 Python 程式语言与一定程度的数理知识,有一定的技术门槛。

不过从今年的 Xcode 10 开始,我们可以用很简单的方式,直接在 Xcode 内自行训练产生 .mlmodel 模型,不需额外的学习套件了。苹果的官方开发者网站日前已经释出教学,以下是依照教学练习的操作过程,凭个人直觉就能完成训练,很简单,一点都不难。

Creating an Image Classifier Model

英文不懂没关系,AppCoda 中文网站也有中文教学了(网址)。不过万事起头难,要怎么搜集到海量又分类好的训练素材就是个问题。我在之前学习的过程中,有找到的一组花卉的海量图集,刚好可以拿来作训练 .mlmodel 的范例。

(1) 下载图集,并且解压缩。(花卉图集下载,约 218MB)

萤幕快照 2018-06-24 下午6.01.33

查看了一下,图集底下有五个目录「daisy(雏菊),dandelion(浦公英),roses(玫瑰),sunflower(向日葵),tulips(郁金香)」,每个目录底下各有数百张图片。

根据苹果的官方教学,将这些照片以档案数量分配出 80% 的「Training Data」和  20% 的「Testing Data」,大约这个比例就行了( LICENSE.txt 可删除)。

萤幕快照 2018-06-24 下午6.19.10

(2) 执行 Xcode 10,File -> New -> Playground,选 macOS - Blank,按 Next。

萤幕快照 2018-06-24 下午6.27.53  

决定 Playground 档名之后按  Create 即可。

萤幕快照 2018-06-24 下午6.29.19

(2) 点选视窗右上方「Show the Assistant Editor」(即两个圆圈扣在一起的图示按钮),并在左边的编辑区输入三行程式码,输入完按下最后一行的三角形执行钮(下图的红框处)。

import CreateMLUI

 

let builder = MLImageClassifierBuilder()

builder.showInLiveView()

萤幕快照 2018-06-24 下午6.33.11

大约等个几秒钟,右边会出现训练模型的操作介面。介面非常简单,只有一个训练模型的预设标题「ImageClassifier」,和底下有一个「Drop images To Begin Training」的区域(红框部分)。

萤幕快照 2018-06-24 下午6.39.53

我们要做的训练只有两件事:

  1. 滑鼠操作,先将「Training Data」的图片拖进区域
  2. 滑鼠操作,再将「Testing Data」的图片拖进区域

真是超级简单的训练机械学习模型方法!比起其他的三方套件得搞一堆演算参数和撰写神经网路程式码,这简直是苹果德政!

用滑鼠点选「Training Data」目录项目,从 Finder 整个拖进区域后,训练就开始了。下方会出现训练进度和讯息。黑苹果的 GPU (R9-280X)温度也跟著上升,CPU 温度跟频率倒是没什么变化。

萤幕快照 2018-06-24 下午6.48.17

大约花了两分半钟,学习了约三千多张图片,并出现 Training 跟 Validation 两个数字结果。

萤幕快照 2018-06-24 下午6.50.38

接著把「Testing Data」从 Finder 拖进区域,最后会得到第三个数字 Evaluation。

萤幕快照 2018-06-24 下午6.56.29

Testing Data 的资料量只占了约 20% ,所以这个步骤约 40 秒就完成了。三个数字结果代表什么意思,老实说我也不太清楚。

补充:以相同的训练资料,个别以 R9-280X 和 GTX-780 各自重新训练一次,所需时间如下:

  R9-280X GTX-780 CPU ( i7-3770)
Training Data 2 分 23 秒 1 分 40 秒 11 分 43 秒
Testing Data 39 秒 22 秒 3 分 8 秒
温度 (°C) 约 68 °C 约 67 °C --( CPU 温度没有明显升高)

使用 GPU 就已经比 CPU 节省了 80% 时间,而 GTX-780 又比 R9-280X 训练速度快约 40%,所以想玩 Machine Learning 的人,好的独立显卡是必要的,运行时的 GPU 温度也比较低(温度爬升较慢)。

就这样,我们就完成了机械学习认识五种花卉的训练过程,操作超级简单!程式码只需三行,叫出训练介面就行了。在标题「ImageClassfier」右边的往下箭头点一下,填写一下作者大名跟资讯,取个好听一点的名字,按个 Save 就可以把训练好的 .mlmodel 模型存挡了。

萤幕快照 2018-06-24 下午7.03.03

最终得到的这个 .mlmodel 模型,可用来辨识 daisy(雏菊),dandelion(浦公英),roses(玫瑰),sunflower(向日葵),tulips(郁金香)五种花卉的图片。

验证模型运作准确度

照上述 iOS App 使用 .mlmodel 模型的方式依样画葫芦,把自己训练出来的 .mlmodel 拉进 iOS 专案来验证训练成果。先使用相同的科基犬图,得到的结果如下:

Simulator Screen Shot - iPhone 5s - 2018-06-24 at 19.10.48

daisy = 0.06090744495831847

roses = 0.1396115153932302

sunflowers = 0.003177831752012689

tulips = 0.7923442192467409

dandelion = 0.003958988649697627

虽然柯基犬被辨识为 tulips(郁金香),不过准确度只有 73%。辨识为 rose(玫瑰)的准确度为 13%,daisy(雏菊)也有 6%。简单的说,如果把准确度拉高到九成以上,柯基犬会被排除在五种辨识结果之外。

上网随机找一张郁金香的图片来识别看看:

https://i2.wp.com/travels.media/tc/wp-content/uploads/2015/04/郁金香.jpg

结果如下:

Simulator Screen Shot - iPhone 5s - 2018-06-24 at 19.21.59

2018-06-24 19:21:31.421823+0800 MobileNetProject[2283:175536] daisy = 3.277897492815316e-06

2018-06-24 19:21:31.421907+0800 MobileNetProject[2283:175536] roses = 2.371430734334716e-07

2018-06-24 19:21:31.422006+0800 MobileNetProject[2283:175536] sunflowers = 7.708879521718365e-08

2018-06-24 19:21:31.422100+0800 MobileNetProject[2283:175536] tulips = 0.9999963913991989

2018-06-24 19:21:31.422209+0800 MobileNetProject[2283:175536] dandelion = 1.647143954869135e-08

辨识为 tulips(郁金香)的准确度高达 99.999%, 其他花卉的机率低到小数点以下六位。

菊花的种类与颜色更多,随机找一张菊花的图片试试看。

http://pic.pimg.tw/herballey/4bb1c168b3a59.jpg

Simulator Screen Shot - iPhone 5s - 2018-06-24 at 19.30.42

daisy = 0.9937612288437867

roses = 3.80718888536895e-05

sunflowers = 0.001653476840197138

tulips = 0.0009781564784137448

dandelion = 0.003569065948748827

准确率 99.3% 也很好,看来训练出来的模型辨识度很不错。

找一个也是花图,但不在辨识名称内的的照片。Google 搜寻「百合花」:

http://img.ltn.com.tw/Upload/liveNews/BigPic/600_2354058_2.jpg

结果如下:

Simulator Screen Shot - iPhone 5s - 2018-06-24 at 22.41.27

    daisy = 0.00254776680123029;

    dandelion = 8.846607084706478e-06;

    roses = 0.001350513187249112;

    sunflowers = 0.0001463019971201222;

    tulips = 0.9959465714073158;

结果显示为郁金香,准确度还高达 99%。看来这个模型不认识百合花之后,一股脑把结果往郁金香身上堆。

黄花风铃木

Simulator Screen Shot - iPhone 5s - 2018-06-24 at 22.43.17

    daisy = "0.1995546049451405";

    dandelion = "0.622240376836122";

    roses = "0.0250135171787896";

    sunflowers = "0.1017718509332739";

    tulips = "0.05141965010667407";

辨识为 dandelion (浦公英),不过准确度只有 62%,辨识为 daisy(雏菊)的准确度为 19.9%,与柯基图的结果类似。

看来百合的生长姿态与郁金香很雷同,而黄花风铃木的姿态皆不同于五种可辨识的花种,所以机率不高。得到这样的逻辑之后,后续可以用程式去绕开机率过低的结果。

用 Xcode 10 Beta 训练出来的模型,经测试只能用在 iOS 12。在 iOS 11 装置上虽然不会报错,但读进来的模型档变成 (null) ,所以也不能用。希望苹果在 Xcode 10 能处理掉这个问题。

模拟情境:训练辨识新的事物 - 「Gogoro 换电站」

上面提到的花卉图集已经是有人整理过,是绝佳的机械学习教学范例图档,历经无数的教学验证,所以不论用哪一种训练方式,辨识度当然一定有很不错的成绩。但实际上机械学习往往都是有特定的需求,第一步该如何收集到大量的学习图库、正确的分类整理,对个人练习来说,就是个很头痛的问题。模拟一个训练模型的操作流程,首先想到要收集的对象,是正在生活中发生的新事物,或是有强烈特定主题的商品主体,才会更贴近商业上的实务操作。

Gogoro 电动机车在去年中发表第 2 型廉价版之后才逐步打开市场,独有的「换电生态」与逐步建设中的换电站,在最近几个月才在六大都会区逐渐布局,很多人看到 Gogoro 换电站也不知道是什么玩意(不少人以为是贩卖机)。而换电站广布台湾西岸都会区,如果要收集到海量的换电站照片作为训练资料,挑战并不小。

充电站马赛克图

(图片来源:SUPERMOTO8

所以我就用「训练机械学习辨识 Gogoro 换电站」为情境,尝试练习如何自行收集海量的换电站图片,作为训练机械学习的素材。Google 图片搜寻的确是不错的方式,不过最近几个月 Google 搜寻图片的网页变更,已经不太容易从 Google 图片使用「一键下载」的功能了,试了几个 Chrome 外挂都失败,目前大概只能一张一张手动下载。

在 Gogoro 官网有一个「查询换电站」的网页(网址),点击地图上的换电站图示之后,网页会显示该换电站的外观照片。除了 Google 图片之外,这应该是海量收集换电站照片的最佳入口了。然而官网的图片有版权限制,所以我不能教大家如何一次抓取全部的换电站照片。

但我相信对于熟悉解析网页内容的人来说,看到网页就知道用什么方法「一次海量下载」,并非难事。

萤幕快照 2018-06-24 下午11.18.43

解析这个网页内容后,我们一次就取得了 917 张每个换电站的外观图片。

萤幕快照 2018-06-24 下午11.44.46  

接著按照上面的方式,在原来的花卉图集的目录中,加入「gogorostation」目录作为辨识标签,并依照 80% 「Training Data」与 20% 「Testing Data」分配图档。

萤幕快照 2018-06-24 下午11.52.42

中间的训练过程快转,并改写了一下程式,只要输出结果不是换电站的,通通显示「不是换电站」的结果标签。跳转到验证模型...结果悲剧了!网路上随便找一张有建筑物的街景图,通通判定为「gogorostation」,准确率还高到吓人,几乎都有 99% 以上。

检查拿来训练的图档内容,我大概知道原因在哪了。

0161_台北捷运民权西路站(25.061359,121.520027)_3

0171_台塑福华加油站(25.000692,121.553902)_1

有些训练图档照片的换电站主体比例太小,小到看不到换电站在哪,有些照片周遭有太多「不是换电站该有的东西」,能一眼看出「是换电站主体照片」的图档不到一半,这些一股脑全丢进去训练,当然会干扰学习的效果,只好再花了不少时间把一些「看起来有问题」的训练照片删除,再训练,效果不佳再删除,再训练、再删除、再训练(GPU 快烧起来了)...反复几次之后,勉强有了「稍微比较满意」的辨识结果。

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.16.22

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.13.24

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.42.17

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.13.11

然后找几张日前另一家机车大厂发表的电动机车换电站照片,来考验一下模型:

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.15.06

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.15.16

看起来很成功啊~是吗?老实讲,这两张机车厂的换电站照片,准确率还有 98% 与 97 %,所以判定标准设定在 99% 以上才让它「看起来有效果」。而这么高标准,当然也会造成错误的结果。

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.33.09

这张是官方的换电站宣传图,准确率 97.8%。

Simulator Screen Shot - iPhone 5s - 2018-06-25 at 00.33.55

不知为何这张只被判定 94.5 %,准确度比竞争对手还低。

所以大概算了一下,以 99% 准确度为标准,辨识成功大约只有一半...(哭...),所以严格来讲,这个「辨识 Gogoro 换电站」的模型没有练好,不过这成绩也只花了短短一个晚上,比我写这边文章的时间还短。

延伸阅读官网文件:提升模型的准确度

后记

近几年来一直尝试踏入机械学习的坑,也一路走得跌跌撞撞,直到苹果去年发表 Core ML 与今年的 Create ML,将机械学习的门槛一下子从天际拉到了脚边,可想而知,不久的将来「机械学习」将是一门人人可触及、实作的议题。然而苹果拉低门槛也只是个开端,也不代表所有的机械学习基础都能抛开艰涩的数理知识与资料收集,现在可以训练机械学会认识换电站,那么接下来,要怎么训练从图片里明确标示出换电站在图片中哪个位置,找到换电站后如何从外观辨识机器有几个充电孔,有哪几个充电孔是可用的?后面还有一大堆的学习挖坑,永无止境的机械学习过程,延伸至深度学习、人工智慧的领域。

再者,训练机械学习的演算理论、程式撰写功力似乎不太是重点,真正的重点在于:准备、标注资料、整理资料,如何利用演算法的特性提升准确度,否则机械学习到的也是不可信任,很难发挥真正的用处。

不论如何,还是很感恩如今有了简单的训练机械方法,至少在建立某些机械学习模型时,有机会绕过如博士论文般艰深难懂的演算逻辑,建立符合个人目的应用,或许有朝一日,每个人都可以透过如教育人类般的互动过程,训练出完全属于自己使用、符合自己生活习惯的人工机械助理,期待这天能在有生之日实现。

继续阅读:教你的 iPhone 认识 Gogoro 换电站(Part 2) - 用黑苹果电脑玩转最夯的机械学习

相关文章