目录
  1. 1. 机器学习 Machine Learing
    1. 1.1. 使用苹果提供的Core ML2
    2. 1.2. 如何转化网上第三方的Model转化为MLModel 供iOS使用
  2. 2.
  • 什么是coremltools?
    1. 0.1. 开始安装 Python+pip+安装coremltools
  • 1. 📘Python 2.7支持
    1. 1.1. 查找共享模型
    2. 1.2. 如何自己制作MLModel
    3. 1.3. 自然语言Model的处理
  • iOS机器学习

    机器学习 Machine Learing

    项目地址

    ####机器学习的分类

    • 有监督学习 – 准确,但是费时间

      给机器一个对应关系 (指着一个手机 告诉机器他是手机) — 训练 (给训练数据贴标签label)

      训练完成后 指着手机问它是什么 — 输入

      告诉我们它是手机 — 输出 output

    • 无监督学习

      不给出对应关系 只是扔一堆东西给机器, 机器最终只能辨别出哪些东西是一类, 哪些不是一类, 仅此而已

    • 半监督学习

    • 增强学习 alphaGo

    使用苹果提供的Core ML2

    苹果也提供了一些训练好的数据,可以在项目中直接使用

    苹果机器学习官网地址

    image-20200821094834841

    目前苹果开放的一些可用的人工智能库

    我们先用官网提供的一些训练模型尝试下使用,再去网上找一些Pyton训练好的模型来使用

    image-20200821114003817

    我们在官网找到想要使用的模型 MobileNetV2FP16

    然后下载到本地 导入到项目中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    //
    // ViewController.swift
    // ML
    //
    // Created by MoneyLee on 2020/8/21.
    // Copyright © 2020 MoneyLee. All rights reserved.
    //

    import UIKit
    //机器学习必须引用的
    import CoreML
    //视界 图像类的工具
    import Vision

    class ViewController: UIViewController {

    @IBOutlet weak var showImgV: UIImageView!

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    }

    @IBAction func camreClick(_ sender: UIBarButtonItem) {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.sourceType = .camera
    present(picker, animated: true, completion: nil)
    }
    }

    extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    if let img = info[.originalImage] as? UIImage {
    showImgV.image = img
    navigationItem.title = "识别中..."
    //转化为CIImage
    guard let ciImg = CIImage(image: img) else {
    fatalError("不能把图像转化为CIImage")
    }
    //加载训练好的模型
    guard let model = try? VNCoreMLModel(for: MobileNetV2FP16().model) else {
    fatalError("加载ML Model失败")
    }

    //创建识别请求
    let request = VNCoreMLRequest(model: model) { (req, error) in
    //请求的回调 res 识别的结果
    guard let res = req.results else {
    // fatalError("图像识别失败")
    self.navigationItem.title = "图片识别失败"
    return
    }

    let classifcations = res as! [VNClassificationObservation]
    if classifcations.isEmpty {
    print("没有识别成功")
    self.navigationItem.title = "没有识别成功"
    } else {
    //取识别概率最大的结果
    print(classifcations.first!.identifier)
    self.navigationItem.title = classifcations.first!.identifier
    }

    }
    //苹果的model图像是正方型, 我们将获取的图像转换为正方型 有助于识别, 默认是原图
    request.imageCropAndScaleOption = .centerCrop

    //执行识别请求
    do {
    try VNImageRequestHandler(ciImage: ciImg).perform([request])
    } catch {
    print("执行图像识别请求失败, 原因是: \(error.localizedDescription)")
    }
    }
    picker.dismiss(animated: true, completion: nil)
    }
    }

    6401597981163_.pic

    项目地址


    如何转化网上第三方的Model转化为MLModel 供iOS使用

    使用官网提供的 ML Tools转化三方Model

    下载工具地址

    image-20200821123952650

    文档地址

    使用coremltools Python软件包将第三方培训库(例如TensorFlowPyTorch)的模型转换为Core ML格式。然后,您可以使用Core ML将模型集成到您的应用程序中。

    Core ML为所有模型提供统一的表示形式。您的应用程序使用Core ML API和用户数据在用户设备上进行预测并微调模型。严格在用户设备上运行模型将消除对网络连接的任何需求,这有助于保持用户数据的私密性和您的应用程序的响应速度。

    Core ML通过利用CPU,GPU和神经引擎来优化设备上的性能,同时最大程度地减少其内存占用空间和功耗。

    截屏2020-08-21 下午12.41.12

    什么是coremltools?

    coremltools Python包是第三方模型转换到核心ML格式的主要方式。

    使用coremltools,您可以执行以下操作:

    • 将训练有素的模型从TensorFlowPyTorch等框架转换为Core ML格式。
    • 读取,写入和优化Core ML模型。
    • 通过使用Core ML进行预测来验证macOS中的转换/创建。

    您可以将训练有素的模型从以下框架转换为Core ML格式:

    模特家族 支持包
    神经网络 TensorFlow 1(1.14.0+) TensorFlow 2(2.1.0+) PyTorch(1.4.0+,<= 1.6.0) Keras(2.0.4+) ONNX(1.6.0) Caffe(1.0)
    树木乐团 XGboost(1.1.0) scikit学习(0.18.1)
    广义线性模型 scikit学习(0.18.1)
    支持向量机 LIBSVM(3.22) scikit学习(0.18.1)
    管道(预处理和后处理) scikit学习(0.18.1)

    开始安装 Python+pip+安装coremltools

    coremltools支持Python 2和Python3。我们建议您使用Condavirtualenv安装Python 3.6或更高版本。

    📘Python 2.7支持

    由于Python核心团队不再支持Python 2,因此我们建议使用Python 3以获得coremltools的最佳体验。到2020年底,我们将继续完全支持Python 2.7,但是coremltools的未来版本可能不支持Python 2.7。请相应地计划您的迁移。

    跟着这些步骤:

    1. 安装pip软件包安装程序,以便可以使用它安装coremltools。
    2. 安装Python软件包管理器以为coremltools创建一个Python环境。我们建议使用Conda,因为它是安装所有必需依赖项(例如numpy)的最可靠方法。您可以改为使用virtualenv
    3. 使用为其提供的软件包指南安装用于转换的第三方源软件包(例如TensorFlowPyTorch)。该coremltools包中包括第三方源代码包。

    python正常有自带的 但是版本低 建议升级下 再安装个pip包管理工具 都自行百度吧 很简单

    安装转换工具 coremltools

    sudo pip3 install -U coremltools

    我的是pip3

    查找共享模型

    caffe提供的开源模型

    找到可以识别各种花的模型 CaffeNet fine-tuned for Oxford flowers dataset

    image-20200821132600552

    找到其网站上的下载地址 可能需要翻墙 或者下载比较缓慢

    比较大 推荐使用下载工具 Motrix

    我们最终需要三个文件

    image-20200821132924228

    image-20200821132952355

    我们获得下面这3个文件

    image-20200821135022001

    我们需要对其中的 class_labels.py修改下 我们需要一个.txt文件 并且内部的数据需要整理成如下格式

    image-20200821141109996

    我们可以把前后的多余字符去掉,然后利用字符串分隔,再通过控制台打印的方式快速得到这个数据,然后复制到文件内,可以使用我demo内的StringTool工具来处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import UIKit

    struct StringTool {

    func printUsigString(fileName: String, fileType: String) -> String {

    let path = Bundle.main.path(forResource: fileName, ofType: fileType)
    let url = URL(fileURLWithPath: path!)
    do {
    let data = try Data(contentsOf: url)
    let str = NSString(data:data ,encoding: String.Encoding.utf8.rawValue)! as String
    let result : Array = str.components(separatedBy: "', '")
    for item in result {
    print(item)
    }
    return str

    } catch {
    print("读取本地数据出现错误: \(error.localizedDescription)")
    }
    return "获取失败"
    }
    }

    最终我们得到这3个文件

    image-20200821141425152

    oxford102.caffemodel: 被训练好的模型

    class_labels: 转化输出

    deploy.prototxt: 转化输入

    我们该如何转换呢

    转化caffe模型

    ####coremltools.converters.caffe.convert

    • coremltools.converters.caffe.``convert模型image_input_names = []is_bgr = 假red_bias = 0.0blue_bias = 0.0green_bias = 0.0gray_bias = 0.0image_scale = 1.0class_labels = 无predicted_feature_name = 无model_precision = ‘FLOAT32’

      将Caffe模型转换为Core ML格式。参量型号:str | (str,str)| (str,str,str)| (str,str,dict)经过训练的Caffe神经网络模型,可以表示为:磁盘上经过训练的Caffe模型(.caffemodel)的路径两个路径的元组,其中第一个路径是.caffemodel文件的路径,第二个路径是deploy.prototxt的路径。三个路径的元组,其中第一个路径是训练后的.caffemodel文件的路径,第二个路径是deploy.prototxt的路径,而第三个路径是平均图像二进制文件的路径,从输入中减去数据图像作为预处理步骤。.caffemodel和.prototxt的两个路径的元组,以及以图像输入名称为键的dict和以图像binaryprotos为值的路径。键应与通过参数“ image_input_name”提供的输入名称相同。

    1
    coremltools.converters.caffe.convert(model, image_input_names=[], class_labels=None, predicted_feature_name=None, model_precision='float32')

    image_input_names=[]

    这个参数是什么呢 打开deploy.prototxt文件

    image-20200821143122524

    这里的input对应的参数就是我们要传入的

    class_labels=None

    这个参数放什么呢 就是我们class_labels文件的路径

    再python环境下执行转换操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Python 3.7.9 (v3.7.9:13c94747c7, Aug 15 2020, 01:31:08) 
    [Clang 6.0 (clang-600.0.57)] on darwin
    >>> import coremltools
    >>>
    >>> coreml_model = coremltools.converters.caffe.convert(('oxford102.caffemodel','deploy.prototxt'), image_input_names='data', class_labels='class_labels.txt')

    ================= Starting Conversion from Caffe to CoreML ======================
    Layer 0: Type: 'Input', Name: 'input'. Output(s): 'data'.
    Ignoring batch size and retaining only the trailing 3 dimensions for conversion.
    Layer 1: Type: 'Convolution', Name: 'conv1'. Input(s): 'data'. Output(s): 'conv1'.
    Layer 2: Type: 'ReLU', Name: 'relu1'. Input(s): 'conv1'. Output(s): 'conv1'.
    Layer 3: Type: 'Pooling', Name: 'pool1'. Input(s): 'conv1'. Output(s): 'pool1'.
    Layer 4: Type: 'LRN', Name: 'norm1'. Input(s): 'pool1'. Output(s): 'norm1'.
    Layer 5: Type: 'Convolution', Name: 'conv2'. Input(s): 'norm1'. Output(s): 'conv2'.
    Layer 6: Type: 'ReLU', Name: 'relu2'. Input(s): 'conv2'. Output(s): 'conv2'.

    注意在三个文件所在的文件夹路径内操作终端, 因为其中有个属性是文件路径, 因为我们在当前的文件夹内 所以可以输入文件名就行了

    指定完成后

    1
    2
    3
    4
    5
    6
    7
    8
    ================= Summary of the conversion: ===================================
    Detected input(s) and shape(s) (ignoring batch size):
    'data' : 3, 227, 227

    Network Input name(s): 'data'.
    Network Output name(s): 'prob'.

    >>>

    给model取个名字

    1
    >>> coreml_model.save('oxford102.mlmodel')

    查看文件内是否生成成功

    image-20200821145629077

    把这个模型导入到项目内

    使用到的资源文件 因为下载比较慢可以在百度云下载

    1
    链接:https://pan.baidu.com/s/1_WXy4jiTOkusapYv37S3rw  密码:8bvu

    如何自己制作MLModel

    苹果为我们提供了这个方式

    创建ML

    我们将要构建一个model 来区分狗和猫

    首先我们需要获取大量狗和猫的图片

    image-20200821152656460

    Test文件夹是存放我们用来验证结果的猫狗图片, 训练数据和测试数据分别占比 80% 20%

    我们收集猫狗图片分别导入到4个文件夹内

    训练及测试数据下载地址

    1
    链接:https://pan.baidu.com/s/1aUDT5HbXgjEOmAuOluY9DA  密码:rvae

    创建一个playground, 必须是mac的 而且左下角切换为手动执行模式

    image-20200821153106861

    image-20200821154808500

    我们将两个包图片的文件夹整合到一个文件夹内拖拽到里面

    image-20200821161037029

    再将测试的数据文件夹同样拖拽到里面 就完成了制作

    image-20200821161220775

    识别成功率100%

    其实上面的方法即将被弃用了, 苹果已经在新版的XCode中集成了 create ML这个工具

    image-20200821161648758

    通过这个工具更简单方便

    image-20200821162013682

    然后点击上方的 Train开始训练

    然后怎么将训练好的mode导出呢 我找了找没找到. 我勒个去. 只好这么做了, 找到工程文件, 右键显示包内容

    image-20200821162506782

    这在里面呢

    image-20200821162538660

    为什么如此简单呢, CreateMLUI这个库利用苹果的照片app和siri等苹果产品优化好的机器学习架构和一些优化好的算法已经提供给了我们, 使我们训练模型变得异常简单.我们只需要使用这个平台就可以实现一些需求 比如汽车识别,车牌识别和表情识别等等

    如何提高我们的准确率呢?

    可以利用各种角度 各种光线将测试数据图片进行旋转 或者明暗调节

    有很多网站已经为我们提供了测试数据集 datasets

    比较出名的是 Kaggle 谷歌旗下的 各行各业的数据集供我们使用 地址

    自然语言Model的处理

    我们这次搞一个自然语言的项目, 分辨好坏话, 比如美团的评论, 通过顾客的评语, 自动分类出是好评还是差评

    但是因为中文的训练很麻烦, 对电脑的要求也很高,我们用英文进行编写

    我们分辨是否是垃圾短信

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import Cocoa
    import CreateML

    //总数据
    let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/moneylee/Documents/Temp/spam.csv"))

    //把总数据分为训练数据和测试数据
    let (trainingData,testingData) = data.randomSplit(by: 0.8, seed: 5)

    //开始训练--并得出情感识别器(sentimentClassifier)-也就是训练出来的mlmodel
    let sentimentClassifier = try MLTextClassifier(trainingData: trainingData, textColumn: "text", labelColumn: "label")


    //设置mlmodel元数据
    let metadata = MLModelMetadata(author: "Lebus", shortDescription: "A model trained to classify spam SMS", version: "1.0")
    //保持mlmodel
    try sentimentClassifier.write(to: URL(fileURLWithPath: "/Users/moneylee/Documents/Temp/spam.mlmodel"), metadata: metadata)

    //识别是否是垃圾短信
    try sentimentClassifier.prediction(from: "hi,how are you?")
    try sentimentClassifier.prediction(from: "Had your mobile 11 months or more? U R entitled to Update to the latest colour mobiles with camera for Free! Call The Mobile Update Co FREE on 08002986030")

    如何使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import UIKit
    import NaturalLanguage

    class ViewController: UIViewController {

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    guard let model = try? NLModel(mlModel: spam().model) else{
    fatalError("加载mlmodel失败")
    }
    if let str = model.predictedLabel(for: "feel free to call 021-55558888 for more information"){
    print(str)
    }

    }
    }

    中文情感语录数据集

    自然语言关联项目的数据集下载地址

    1
    链接:https://pan.baidu.com/s/1axNkcjwNE4bkpFPFJXYhLQ  密码:ubti
    文章作者: 李财
    文章链接: http://moneylee.cn/2020/08/21/iOS%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/
    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MoneyLee’s Blog
    打赏
    • 微信
    • 支付宝

    评论