zoukankan      html  css  js  c++  java
  • CoreML试水--图片识别

    今年的WWDC上,关于人工智能方面Apple开放了CoreML工具包。

    今天就趁着时间还早果断的尝试了一下到底有多容易。

    import UIKit
    import CoreML
    import Vision

    首先头文件里CoreML和Vision两个新的包都需要引入。

    如果只是模仿Apple官方给出的模型可以不使用Vision包,但是如果要做图片识别那么最好使用Vision的方法。(原因之后会提到)

        @IBAction func openLibrary(_ sender: Any) {
            if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
                let imagePicker = UIImagePickerController()
                imagePicker.delegate = self
                imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary;
                imagePicker.allowsEditing = true
                self.present(imagePicker, animated: true, completion: nil)
            }
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
            if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
                imagePicked.contentMode = .scaleToFill
                imagePicked.image = pickedImage
            }
            picker.dismiss(animated: true, completion: nil)
        }

    简单的导入图片过程,在此不做解释。

        @IBAction func saveImage(_ sender: Any) {
            let imageData = imagePicked.image?.cgImage
            let model = try! VNCoreMLModel(for: Resnet50().model)
            let request = VNCoreMLRequest(model: model, completionHandler: myResultsMethod)
            let handler = VNImageRequestHandler(cgImage: imageData!)
            try! handler.perform([request])
            
        }
    let model = try! VNCoreMLModel(for: Resnet50().model)//1
    

     这是一个选择模型个的方法,模型我直接选用的Apple推荐的Resnet50()。(其实有了第三方模型转换之后自己编译也很简单)

    let handler = VNImageRequestHandler(cgImage: imageData!)//2
    

     将文件转换成模型识别可支持的数据类型(CVPixelBuffer)当然也有别的可转换方法,但是直接使用Vision的方法更容易实现。

    let request = VNCoreMLRequest(model: model, completionHandler: myResultsMethod)//3
    

     读取模型并返回结果至myResultsMethod方法中。

     guard let results = request.results as? [VNClassificationObservation]//4

     返回结果存储在results中(数组型数据)

    for classification in results {    
        print(classification.identifier, // the scene label
                classification.confidence)
    }

    至此一个带有人工智能的App就开发完了。

    准确来说不到十行代码。

    完整代码

  • 相关阅读:
    C++中所有的变量和函数都必须有类型
    C++中struct类型增强
    C++对C语言的变量检测增强
    C++对C语言register的增强
    C++对C的实用性增强
    namespace命名空间
    文件操作:fseek函数和ftell函数
    最大子序和
    雪花雪花雪花(Hash思想)
    暑假集训-8.01总结
  • 原文地址:https://www.cnblogs.com/dinghing154/p/6959265.html
Copyright © 2011-2022 走看看