• 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就开发完了。

    准确来说不到十行代码。

    完整代码

  • 相关阅读:
    请问发表的文章如何备份?
    .NET中利用XML来自动生成代码策略
    XPO使用随笔
    为方便做封包分析,做了个十六进制和字符互转的网页小工具
    前端人员如何模拟慢网速环境
    补充《动态加载外部.js文件时候,javascript的执行顺序问题》
    凡客诚品官方网站的前端改进建议
    "Cachecontrol”常见的取值private、nocache、maxage、mustrevalidate及其用意
    javascript跨域操作cookie的点滴记录
    HTTPS的七个误解(译文转载)
  • 原文地址:https://www.cnblogs.com/dinghing154/p/6959265.html
Copyright © 2020-2023  润新知