iOS

Protocol Oriented Programming

从1970开始,面向对象编程(OOP)的思想就已经出现并发展了。它把对象作为程序的基本单元,包含了数据和操作数据的函数。数据封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)是OOP的三大特点。而正如OOP的迅速风靡,它具有许多面向过程等不具备的优点: Encapsulation(封装) Access Control(访问控制) Abstraction(控制) Namespace(命名空间) Expressive Syntax(语法表达) Extensibility(可扩展性) 但是,仔细想想,这些优点只有面向对象才有嘛?不,是抽象的类型带给我们的好处,而不是面向对象的类,类只是抽象类型的一种方式。例如在Swift中,你可以用结构体(struct)和枚举(enum)同样实现这些——除了继承和多态。但是类也有他的缺点(emm, 我不造怎么翻译了): Implicit Sharing Defensive Copying Inefficiency Race Conditions Locks More Inefficiency Deadlock Complexity Bugs! Inheritance All Up In Your Business One superclass — choose well! Single Inheritance weight gain No retroactive modeling Superclass may have stored properties You must accept them Initialization burden Don’t break superclass invariants! Know what/how to override (and when not to) Lost Type Relationships Implicit Sharing 在大部分的面向对象的语言中,对象都是引用类型,在对象的传递时只将引用复制一份并指向原有对象,这就带来许多问题。

Core ML

其实在早在iOS 11之前,Apple就用上了Machine Learning:照片的人脸识别、输入预测,甚至Apple Watch上的手写识别。但现在,开发者终于能在自己的App上使用ML了。 如果之前有大数据计算的iOS开发者可能知道,Apple提供的只有底层的基于CPU实现的 Accelerate(插一句刚刚发现这个framework开始支持watchOS 4了)和GPU实现的MPS,各种C指针的函数,功能少还很难用。所以,支持四大平台iOS、macOS、tvOS和watchOS的Core ML终于补全了这方面的功能。 0 这可不是热狗 当然这并不意味着你可以在一颗小小的A10芯片上炼丹。总的来说,Core ML主要是通过训练好的模型来给出结果。它不需要你手写一个几百行的神经网络,也不需要你去考虑性能和节能,并且从WWDC上的Session来看,似乎表现还不错,至少它不只会像硅谷中的Jian Yang一样告诉你这是不是个热狗。 1 ML Frameworks 下面这张图简洁地展示了整个架构。 最底层的是Accelerate和MPS,这次Apple又把它们封装了一层Core ML,再上面是用于图像处理例如物体追踪、人脸检测的Vision和用于自然语言处理的NLP(Natural Language Processing)。这些可以一起使用,实时使用,并且不用担心用户隐私、流量消耗和服务器的负担,甚至它可以在没有网络的情况下保持工作。 2 Core ML的使用 作为一个2017年的机器学习框架,它当然包含:前馈神经网络(Feed Forward Neural Networks)、卷积神经网络(Convolutional Neural Networks)、循环神经网络(Recurrent Neural Networks)、支持向量机(Support Vector Machines)、广义线性模型(Generalized Linear Models)、组合树(Tree Ensembles)这些常用又有用的模型。 然后你就应该会问怎么用了,别急,当然简单无脑。 Apple预先提供了一些 models供你使用,当然你也可以自己训练以后把它转换成MLMODEL——Apple推出了开源的Core ML Tools,目前支持Caffe、Keras、XGBoost、Scikit Learn、turi、LIBSVM(扎心了,TensorFlow)。 有了MLMODEL之后就方便多了,你可以把它像文件一样导入到你的项目中, 也可以作为一个Bundle使用, 甚至都不用import。 let model = FlowerClassifier() if let prediction = try? model.prediction(image: image) { return prediction.flowerType } 几行代码就可以完成——就是把它当个类嘛😂 3 来个Workflow吧? 这里我们以Caffe为例,来展示一下整个工作流程。 先安装这个tools(我不得不吐槽它竟然不支持Python3) pip install coremltools 然后在Python里导出mlmodel