iOS机器学习

机器学习是一种人工智能,计算机在没有明确编程的情况下进行“学习”。机器学习工具并不是编码一个算法,而是通过在大量数据中查找模式,使计算机能够开发和优化算法。

发展历程

Apple最早在 iOS 5 中引入了 NSLinguisticTagger 来分析自然语言,将文本分段为段落、句子或单词,并标记有关信息,如词性(动词、名词、形容词)。

在 iOS 8 中,引入了 Metal,提供了对设备 GPU 底层访问接口,为机器学习提供强大的计算能力。

2016年,Apple 在其 Accelerate 框架中添加了 BNNS,使开发人员能够为已经训练过的神经网络提供非常高的性能推断(而不是训练)。

虽然机器学习和计算机视觉在 iOS 上早已有了系统级的支持,但直到2017年,Apple 推出了 Core ML 和 Vision之后,由于其设计合理且容易上手的API,使得使用门槛大大降低。

层级结构

Core ML简介

Core ML能够将数据经过预处理后输入MLMODEL文件,输出为模型的预测结果。使用 Core ML 只需要很少的代码就可以构建起一个机器学习的应用。只需关注代码即可,无需关注模型的定义、网络的构成。Core ML 使得开发者能够将各种各样的机器学习模型集成到应用程序中。它除了支持超过 30 层类型的广泛深度学习,还支持如树集成、SVMs 和广义线性模型等标准模型。因为苹果制定了自己的模型文件格式,使得Core ML支持苹果生态下多个平台(macOS,iOS,watchOS,TVOS)。

MLMODEL

此外,苹果还提供了一个 Python 工具,可以将业内一些常用的机器学习框架导出的 Model 转成 MLMODEL 文件,如DNN,RNN,CNN,SVM,Tree ensembles,Generalized linear models,Pipeline models等。

model转换

Vision简介

Vision是一个高性能的图片分析库,它能识别在图片和视频中的人脸、特征、场景分类等。它包含的分类有Face Detection and Recognition(人脸检测识别)、Machine Learning Image Analysis(机器学习图片分析)、Barcode Detection(条形码检测)、Text Detection(文本检测)等。Vision 操作流水线分为两类:分析图片和跟踪队列。可以使用图片检测出的物体或矩形结果(Observation)来作为跟踪队列请求(Request)的参数。

分析图片
跟踪队列

使用方法

下面就以一个图片检测识别的例子展开讲解使用方法。
Demo地址:https://github.com/luyalin/CoreMLAndVision
1、获取模型。从官网下载(https://developer.apple.com/machine-learning/build-run-models/)或使用Core ML Tools转化第三方框架生成的模型,也可以使用2018年推出的原生Create ML 框架来直接从数据生成 Core ML 模型。这里直接下载官网提供的Places205-GoogLeNet为例子。

GoogLeNet

2、导入并生成接口。获取到模型后直接拖拽导入Xcode,Xcode会自动生成相应的机器学习模型接口。无需任何手动或其他操作,十分方便友好。

Model Class

上图中Model Class中可以看到,Xcode会自动生成Swift model类,点击箭头就能查看模型接口。

API

3、使用编程接口。根据生成的 API 进行编程。首先需要在控制器中导入两个框架:

import CoreML
import Vision

接着,通过懒加载创建一个请求,并在回调中处理结果。VNCoreMLModel是与 Vision 请求一起使用的 Core ML 模型的容器。Vision的工作流程就是:
1、创建模型
2、创建一个或多个请求
3、创建并运行请求处理程序。

    lazy var classificationRequest: VNCoreMLRequest = {
        guard let model = try? VNCoreMLModel(for: GoogLeNetPlaces().model) else {
            fatalError("load GoogLeNetPlaces model error")
        }
        
        let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] (request, error) in
            self?.processClassifications(for: request, error: error)
        })
        request.imageCropAndScaleOption = .centerCrop
        return request
    }()

然后,使用Vision框架请求处理程序。将一个表示图像的参数传递给VNImageRequestHandler,然后调用它的perform方法并传递一组请求对象,来运行处理程序。

     DispatchQueue.global(qos: .userInitiated).async {
         let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])
            do {
                try handler.perform([self.classificationRequest])
            } catch {
                print("Failed to perform classification.\n\(error.localizedDescription)")
            } 
     }

当请求完成后,就会执行之前回调中的处理结果的逻辑,即processClassifications方法。在这个方法中,通过参数resquest.results会得到一组VNClassificationObservation对象,这个对象有两个属性是confidence和identifier,分别表示信任值和类别名,信任值是范围0~1之间。

func processClassifications(for request: VNRequest, error: Error?) {
        DispatchQueue.main.async {
            guard let results = request.results else {
                let result = "Unable to classify image.\n\(error!.localizedDescription)"
                self.showAnalysisResultOnMainQueue(with: result)
                return
            }
            let classifications = results as! [VNClassificationObservation]
            if classifications.isEmpty {
                let result = "Nothing recognized."
                self.showAnalysisResultOnMainQueue(with: result)
            } else {
                let topClassifications = classifications.prefix(2)
                let descriptions = topClassifications.map { classification in
                    return String(format: "  (%.2f) %@", classification.confidence, classification.identifier)
                }
                let result = "Classification:\n" + descriptions.joined(separator: "\n")
                self.showAnalysisResultOnMainQueue(with: result)
            }
        }
 }

因为results数组是按照信任值降序排列的,所以代码中直接取前两个结果展示出来。
demo给出的两张图片检测结果:


demo1
demo2

总结

苹果通过把复杂的事情简单化,降低使用门槛,并且对一些高频场景进行了封装,比如人脸、条形码、文字等,很容易激发开发者的热情。另外,因为移动端训练模型意义较小,它选择另辟蹊径,将模型训练交给服务端去做,使得它能够更大发挥硬件上性能的优势。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容