iOS开发者的出路在哪里?从Swift到机器学习

内容来源:2018 年 9 月 15 日,iOS职业开发者王巍在“2018@swift 第三届 Swift 开发者大会”进行《从Swift到机器学习》演讲分享。IT 大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:3628 | 10分钟阅读

摘要

如何评价2017年初华为开始“清理”34岁以上的职员?程序员能纯靠技术渡过中年危机吗?iOS末路了吗,我找工作两个月,没人要。35岁做不到管理就等于失业。程序员30岁之前年薪不到40W,再不转行都晚了?

在深入本次主题之前我们先来看下目前iOS开发的现状,上图为在google Trends中搜索iOS Develop的热度图,可以看到当前已经处于顶峰的50%以下了。

这个顶峰是在2013年的6月份,恰好是WWDC 2013的时候,正是这一年iOS 7发布,iOS系统的UI发生了非常大的变化。

这里有一个关键词就是"转变"。转变一般会带来痛苦,但同时它也是一定会发生的,而重点在于如何应对。

近年来我经常会看到一些类似上图的问题,很多时候我们很难去改变潮流,只能去适应它。而作为一个iOS开发者需要考虑的是我们的出路在哪,对此我做了下简单的总结。

一个方向是以React Native、Flutter等为主的大前端;另一个方向就是机器学习,自从阿法狗打败了柯洁、李世石之后,该领域就成为了一个相当火热的话题。

其实还有两种不费劲,来钱快的途径(笑)。他们分别是区块链和p2p信贷。不过仔细考虑了下,好像都不太靠谱。

综合考量了这4条出路之后,我决定还是做一个快乐的肥仔吧!并为此付出了实际行动,我买了一台switch搭配着肥仔水(笑)。

前一段时候一直沉迷在塞尔达游戏中,对于游戏中的角色很多人喜欢的不是女主就是女配。而我相对比较特别,喜欢的角色是一个路人NPC,名字叫做普尔亚,她有一个非常经典的手势。

作为一个iOS开发,我觉得该为偶像做点什么,并为此开发了一款识别普尔亚手势的App。用户可以使用相机或者照片库提供图片,当识别到有3张手势的图片后即可获得奖励。不过很可惜的是,由于苹果觉得这个App用处不大,所以无法上架,只能作为一个demo存在(笑)。

How

那么这个看似简单的App要如何实现呢,显然在传统编程方式领域中实现起来有些困难,即使是用Opencv识别也非常麻烦。不过这恰好是机器学习中的计算机视觉所擅长的领域,使用深度学习的方法可以很容易解决。

本次由于时间问题,并不会深入到深度学习的细节或概念中,而是直接上手训练一个可以使用的模型。最初的模型效果可能不会很好,当随着对模型的深入讨论,以及对CreateML框架背后做的事情的了解,应该可以给出优化的方案。

机器学习流程

一般的机器学习流程,先是要准备数据,然后做模型训练,最后进行模型评估。

这次的准备的数据包括图片和分类标签(有无手势)。训练模型的时候我们会将人工标注过的正确图片分为训练集和验证集,然后放入神经网络中进行参数调整,寻找使训练数据具有最小误差值的一组参数。最后使用Test数据进行模型评估和迭代。

实际演示(本段有DEMO)

DEMO请看嘉宾现场演讲回放视频:http://t.cn/ELlFgiI

createML到底做了什么

可以看到在Demo演示中我们大多数时间都是花费在准备数据上,后续的部分基本上没有太多可控要素,createML对整个机器学习流程进行了大幅简化。

ML Model

在深入之前我们先来看下ML Model。ML Model是一个Protocol Buffers序列化的模型描述,内容包括模型版本号、结构、layer类型、权重等。

CreateML使用的模型训练方法被称为迁移学习,其训练速度之所以怎么快,一方面是因为可以利用GPU加速,另一方面是因为所训练的模型其实只是最后的ML model这一小部分。而在此之前的部分是VisionFeaturePrint_Scene,这是预先内嵌在iOS 12和macOS 10.14中的特征提取框架,它基于imageNet数据集提取出了2048个特征,createML仅负责训练出最后一层。

Core ML Community Tools

要深入探究ML Model的细节,我们可以使用python安装苹果开源的coremltools。它原本是用来转换其他学习框架的模型到ML,但由于也定义了ML protobuf结构,所以可以用来探索模型。

这是我们之前训练模型的大致结构,首先是输入image;然后是visionFeaturePrint,这部分细节无法看到,已被编译到系统中;最后是广义线性模型分类器,它会在特征提取的基础上进行矩阵运算以得到了classLabelProbs和classLabel。

上图为具体代码结构。定义的pipeline version为3,表示iOS版本必须为11之前。输入限定为299乘299像素,这样就在保留特性的同时可以限制处理时间。内置特征提取就是前面提到的visionFeaturePrint。最后的(2048,1)矩阵与上面的(1,2048)进行点乘之后就得到了最终结果。

Turi

整个过程背后负责的其实是Turi,它是基于学习任务的"傻瓜式"机器学习框架。2013年成立,2016年被apple收购,2017年开源,支持Metal和macOS GPU加速,2018年部分集成入Xcode。

问题

前面提到我们是要改进原有模型的效果的,那么首先要理清其中所存在的各种问题。

visionFeaturePrint

原模型第一个问题在于visionFeaturePrint只能存在于iOS 12和macOS 10.14中,而要想使用apple内嵌的Core ML至少要从iOS 11开始。

由于无法读取createML创建的带有visionFeaturePrint的模型,所以最终方案是直接使用TuriCreate的其他模型进行特征提取,这样可以得到和CreateML相近的结果。

原本有一个使用TuriCreate训练模型的演示Demo,但考虑到时间问题就不展示了。其实核心部分就是上图中的这段代码,这里的model默认是resnet-50。而CreateML所做的仅仅是在load image之后,将这个model换成了visionFeaturePrint。

这是最终训练出来的模型结构,展示部分大概为整个模型的十分之一,大小在90M左右。

过拟合,准确率

之前训练出来的其实是一个高度过拟合的模型,它并不是通用的普尔亚手势识别器,而是我个人专用的普尔亚手势识别器。

过拟合指的是由于数据点不够多,而可以调整的参数又过多,使得预期中的线性趋势转换成了一条完美符合训练数据的曲线。这也是为什么之前训练数据和验证数据都能达到100%,但实际测试数据却并不理想的原因。

简单来说就是训练数据严重不足,只来源于单一人员和单一场景,对于非该人员的识别相当低效。而默认的训练方式又只对最后一层进行训练,特征提取模型中不包含对应特征。

以上是在50人200张图片(1人4张,2张有手势)的测试集下的准确率曲线图。最初只有我一个人的时候,测试集的准确率只有50%左右。随着采集人数的上升和训练数据的丰富,准确率逐渐提升到了80%多。

特征提取

CreateML默认的特征提取实际上是属于卷积神经网络的范畴。为了便于理解,这里简单介绍下卷积神经网络。

对于一张图片,如果只关注一个像素,那么得到的信息会非常有限。为了获取更多信息,我们需要同时考虑多个像素点,比如一个3乘3的矩阵,然后将这些矩阵映射缩小到下一层,在下一层继续设置矩阵。

这样就可以综合考虑图片上的信息,一步步从最初的抽象特征(边缘、线条、角度)走向具体特征(眼睛、鼻子、耳朵)。也就是说在卷积神经网络中,卷积层越深特征越具体。

CreateML的迁移学习只对最后一层进行训练,面对的是更具体专用特征,我们无法改动前面的抽象特征。于是问题就出现了,imageNet数据集中包含的图片毕竟是有限的,可能模型训练的目标图片它并没有。

如果使用泛用性特征进行训练应该能够得到更好的模型,遗憾的CreateML没有这种能力。但我们可以引入keras框架来实现,它也提供了迁移学习的方法,同时还有调整可训练卷积层的能力。

图为经过多次迭代后的数据,Training准确率几乎达到了100%,不过validation的准确率仅在92%左右。

不过Keras的问题在于训练时间很长,它用的是tensorflow的后端,不支持mac的GPU加速,且要训练多层。基本上600多张图片要训练3到4个小时。

客户端ML的实际应用

Super-Resolution

Super-Resolution超级分辨率,是将低分辨率图片经过机器学习算法在客户端转换为高分辨率图片。这种技术有效的减少了用户的流量消耗,服务端只需发送原图几分之一大小的图片,客户端使用CoreML将图片放大即可。

音乐情绪识别

音乐情绪识别是从音乐的曲调和节奏中识别出音乐情绪,如图中所示。我们据此在直播中实现了这样一个功能,根据主播当前播放的音乐,识别出音乐情绪,然后推荐合适的快速聊天文本。

当然还有一些其他的应用场景,比如本地垃圾软件识别、游戏AI、专用图像分类/识别、etc等。

总结

优势

CreateML提供了非常小的模型,容易集成在Client端口,不过需要iOS 12支持。对于既有特征表现很出色,简单、无脑,拖拽式得到可用模型。且对工程师友好,可以在Client本机编译。

缺陷

CreateML只适用于特定任务,图片分类、自然语言处理、回归分析等。TruiCreat只能有限扩展,无法使用第三方模型做迁移学习或者其他相关事情。无法处理自定义模型,或者更一般化的任务。

一些资源

Machine Learning for iOS:https://github.com/alexsosn/iOS_ML

Awesome Core ML Models:https://github.com/likedan/Awesome-CoreML-Models

Apple Machine Learning Journal:https://machinelearning.apple.com

Kraggle:https://www.kaggle.com

Machine Learning (Turi) - Coursera:https://coursera.org/specializations/machine-learning

Deep Learning with Python:https://www.manning.com/books/deep-learning-with-python

以上为今天的分享内容,谢谢大家!

IT大咖说 | 关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

原文发布于微信公众号 - IT大咖说(itdakashuo)

原文发表时间:2018-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券