美文网首页
iOS Core ML 机器学习入门

iOS Core ML 机器学习入门

作者: 七里田间的守望者 | 来源:发表于2020-01-04 10:28 被阅读0次

    前言
    机器学习的分类:

    • 有监督学习
      准确 但是 比较费时间
      给机器一个对应关系(训练数据)
      比如告诉它手机是什么(给训练的数据贴标签label)input
      然后通过训练后输出output
    • 无监督学习
      不是特别准备 不需要给对应的数据关系
      只需要给它一堆数据让它自己去做训练,最后分辨出哪些是一类,哪些不是一类。

    开始构建代码

    • 准备控制器 获取手机拍摄的图片
    class ViewController: UIViewController {
    
        
        @IBOutlet weak var imageView: UIImageView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
        @IBAction func pickImage(_ sender: Any) {
            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 image = info[.originalImage] as? UIImage {
                imageView.image = image // 展示拍摄的图片
            }
            picker.dismiss(animated: true, completion: nil)
        }
    }
    
    • 去苹果官网下载已经训练好的机器学习的模型
      Inceptionv3.mlmodel 拖拽到项目中
      然后在要使用地方引入下面这个两个框架
    import Vision
    import CoreML
    
    • 开始进行图片识别
      1.先把要识别的图片拍摄的图片转化为CIImage
      2.加载MLModel模型VNCoreMLModel
      3.构建模型请求VNCoreMLRequest
      4.构建VNImageRequestHandler并传入模型请求

    然后 转化modle VNCoreMLModel(for: MobileNetV2Int8LUT())

    //1.转化图像
    guard let ciImage = CIImage(image: image) else{
        fatalError("不能把图像转化为CIImage")
    }
    
    //2.加载MLModel(训练好的模型),并做了一个让MLModel识别图像的请求
    guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else{
        fatalError("加载MLmodel失败")
    }
    //模型请求
    let request = VNCoreMLRequest(model: model) { (request, error) in
        //图像识别结果--output
        guard let res = request.results else{
            print("图像识别失败")
            return
        }
        let classifications = res as! [VNClassificationObservation]
        if classifications.isEmpty{
            print("不知道是什么")
        }else{
          print("识别结果\(classifications.first!.identifier)")
        }
    }
    //把要识别的图片转化为正方形 (因为这个模型要求图片最好是正方形的)
    request.imageCropAndScaleOption = .centerCrop
    
    //执行这个请求--input进需要识别的图像
    do{
       try VNImageRequestHandler(ciImage: ciImage).perform([request])
    }catch{
        print("执行图片识别请求失败,原因是:\(error.localizedDescription)")
    }
    

    安装 coremltools
    这个工具主要就是为了转化第三方的训练数据转化为iOS需要的mlmodel

    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    python get-pip.py
    
    pip install -U coremltools
    

    ps: 如果是pip3 就使用pip3

    开始转化模型
    主要就是使用coremltools

    coremltools详细的用法

    • 先在终端进入python编辑器
      然后写下下面代码
    import coremltools
    
    # Convert a Caffe model to a classifier in Core ML
    # bvlc_alexnet 要转化的模型
    # deploy.prototxt 输入
    # class_labels 输出
    coreml_model = coremltools.converters.caffe.convert(
        ('bvlc_alexnet.caffemodel', 'deploy.prototxt'),image_input_names='data', class_labels='class_labels.txt'
    )
    
    # Now save the model
    coreml_model.save('BVLCObjectClassifier.mlmodel')
    

    至此python训练的模型就成功的转化为coreml模型了,注意在使用coremltools的过程中,要看相关的操作文档

    如何制作一个图像识别的 CoreML

    • 第一步准备要训练的数据
      官方教程
      github上的资料
      比如狗的图片
      要新建一个文件夹取名为Dog并且文件夹里面的狗狗的图片不少于10张
      还要有测试数据进行训练

    然后 用 xcode 新建 playground

    import CreateMLUI
    MLImageClassifierBuilder().showInLiveView()
    

    就会在右侧显示制作模型的界面,把要训练的数据直接拖进去开始训练。然后保存模型即可。

    相关文章

      网友评论

          本文标题:iOS Core ML 机器学习入门

          本文链接:https://www.haomeiwen.com/subject/lgetactx.html