美文网首页iOS学习开发iOS开发技术分享
想学习高级的机械学习技术吗,iOS新产品技术的两大基石之一Cor

想学习高级的机械学习技术吗,iOS新产品技术的两大基石之一Cor

作者: iOS雯Ping | 来源:发表于2018-12-11 18:54 被阅读5次

    最近学习了下CoreML,然后参照资料做了一个简单的图片识别,然后参照资料做了一个简单的图片识别,虽然网上有很多类似的资料,但是还是自己做一做来的实在。
    首先,先简单的介绍下

    Core ML简介

    Core ML框架
    iOS11推出了Core ML框架,极大地降低了开发者在iphone上使用机器学习的门槛。
    苹果文档给出了如下的描述:
    Core ML is the foundation for domain-specific frameworks and functionality.Core ML supports Vision for image analysis, Foundation for natural language processing (for example, the NSLinguisticTagger class), and GameplayKit for evaluating learned decision trees. Core ML itself builds on top of low-level primitives like Accelerate and BNNS, as well as Metal Performance Shaders.


    然后
    Core ML使得模型能在设备上高效地运行,主要有以下几个优点:
    1、较低的内存占用
    2、较低的电池消耗
    3、更快的计算速度
    4、本地计算,不需要网络的支持

    最后
    功能就是选择一张图片或者排照然后对图片进行识别。

    github地址

    1.在项目开始之前首先得下载一个用来进行识别的CoreML model,在苹果官网就可以下载了
    2.然后把下载下来mlmodel导入到项目中去,现在xcode9会有一个bug导入的资源不会被自动添加到copy bundleResource里面,所以需要在Build Phases里面手动导入下。 image.png
    3.设置成swift之后,mlmodel会自动生成一个类。前提是mlmodel需要添加到copy Bundle,然后也必须导入到Compile Sources,因为这个它要处理编译文件,如果没有导入的话mlmodel,在编译之后你会发现生成类会消失。 image.png
    4.最后我们就可以开始我们的代码了,一些准备的代码,选择图片,处理猜测过后的就过等信息。
    import UIKit
    import CoreML
    import Vision
    
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var imageView: UIImageView!
        
        @IBOutlet weak var labelPercent: UILabel!
        
        @IBOutlet weak var labelDesc: UILabel!
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            imageView.layer.masksToBounds = true
        }
    
        @IBAction func chooseImage(_ sender: Any) {
            let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
            
            let cameraAction = UIAlertAction(title: "拍照", style: .default) { _ in
                self.takePhoto(from: .camera)
            }
            
            let photoLibray = UIAlertAction(title: "相册", style: .default) { _ in
                self.takePhoto(from: .photoLibray)
            }
            
            let cancel = UIAlertAction(title: "cancel", style: .cancel, handler: nil)
            
            actionSheet.addAction(cameraAction)
            actionSheet.addAction(photoLibray)
            actionSheet.addAction(cancel)
            
            present(actionSheet, animated: true, completion: nil)
        }
        
    }
    
    5.在mlmodel里面input image 支持224*224大小的图片所以我们的有个重新绘制图片大小的一个方法
    extension ViewController{
        func resize(image:UIImage, newSize:CGSize) -> UIImage?{
            UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
            let size = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
            image.draw(in: size)
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage
        }
    }
    

    6.然后是选择图片的方法,就直接调用系统的图片或者拍照。

    extension ViewController{
        enum PhotoSource {
            case camera,photoLibray
        }
        
        func takePhoto(from source:PhotoSource){
            let imagePicker = UIImagePickerController()
            
            imagePicker.sourceType = (source == .camera ? .camera : .photoLibrary)
            imagePicker.delegate = self
            imagePicker.allowsEditing = true
            
            present(imagePicker, animated: true, completion: nil)
        }
    }
    

    7.最后是图片选择完成时候进行图片猜测。

    extension ViewController: UIImagePickerControllerDelegate,UINavigationControllerDelegate{
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            dismiss(animated: true, completion: nil)
        }
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
            dismiss(animated: true, completion: nil)
            if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
                imageView.image = image
                // mlmodel input image 提示支持224*224大小的图片
                let fixSize = CGSize(width: 224, height: 224)
                if let newImage = resize(image: image, newSize: fixSize){
                    guess(image: newImage)
                }
            }
        }
        
        
        ///图片猜测方法
        func guess(image:UIImage){
            
            guard let ciImage = CIImage(image:image) else{
                fatalError("不能创建image")
            }
            
            guard let model = try? VNCoreMLModel(for: VGG16().model) else{
                fatalError("不能加载model")
            }
            
            let request = VNCoreMLRequest(model: model) { (request, error) in
                guard let results = request.results as? [VNClassificationObservation], let first = results.first else{
                    fatalError("不能匹配结果")
                }
                DispatchQueue.main.async {
                    self.labelDesc.text = first.identifier
                    self.labelPercent.text = "\(first.confidence * 100)%"
                }
            }
    

    这是我的一个技术交流群:691040931有兴趣的话可以加入 群里只聊技术 内推 广告忽进 进一次踢一次

    相关文章

      网友评论

        本文标题:想学习高级的机械学习技术吗,iOS新产品技术的两大基石之一Cor

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