swift-CoreML-猫狗识别

一:我们需要在Main.storyboard中拉出来label和button和imageView

如下图所示 :

1:在红框的位置选取button和label和imageView

image

2:之后将imageView拖拉进去,如下图所示

image

3:接下来,我们按照上面的方法来把button和label也放到imageView的上面,最终的效果图如下:

image

4:然后我们为了适配大多数的iphone机型,我们来给button添加限制条件

我们先给imageView添加限制条件吧!

在左下角的第二个按钮我们限制图片的width和height分别为374和816,距离手机上部距离为40,下部距离为6,左右距离为20

image

5:我们给label和button也加上这样的限制

image
image

6:为了能够直观地看到button和label我们来改变这两个控件的颜色

在background中设置它的属性

image

7:完成之后,我们点击那个双圆圈按钮切换到双页面,按住control键拖拉storyboard中的控件到代码里面,并且设置按钮的名字。

image
image

完成了storyboard之后,在代码端是下面这个样式

image

二:接下来我们的操作

(1):我们把训练好的模型导入到我们的project中(拖拉到页面右端)

image

(2):接下来我们给两个button添加点击事件

//当点击拍照时调用takephoto这个方法
camer_button.addTarget(self, action: #selector(takephoto), for: .touchUpInside)
//当点击从相册中选择的时候调用chooseImageFromLibrary这个方法
photos_button.addTarget(self, action: #selector(chooseImageFromLibrary), for: .touchUpInside)

(4):接着我们在chooseImageFromLibrary中实现从相册中获取图片的功能

@objc func chooseImageFromLibrary(_ sender: Any) {
   //判断是否可以打开相册
       if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) {
           //调用打开相册权限的函数
           let imagePicker = UIImagePickerController()
           //设置代理
           imagePicker.delegate = self
           //设置控制器的类型---相册
           imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
           //图片不允许编辑
           imagePicker.allowsEditing = false
           //跳转到控制器---相册
           self.present(imagePicker,animated: true,completion: nil)
       }
   }

三:我们选取图片之后,开始通过我们导入的模型来分析选中的图片,我们在imagePickerController这个函数中实现

//获取图片后的操作
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        //获取图像
        if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            display_label.text = "分析中"
            //图片填充模式--等比例缩放图片
            image.contentMode = .scaleToFill
            image.layer.masksToBounds = true
            //在imageView上显示获取到的图片
            image.image = pickedImage
            //加载模型
            guard let model = try? VNCoreMLModel(for:ImageClassifier().model) else {
                fatalError("无法加载训练模型")
            }
            //创建一个模型请求
            let requset = VNCoreMLRequest(model: model) {
                [weak self] requesst,error in guard let results = requesst.results as? [VNClassificationObservation],
                    let topResult = results.first else {
                        fatalError("失败")
                }
                //主线程更新UI
                DispatchQueue.main.async {
                    print(topResult)
                    //显示识别的结果
                    self!.display_label.text = "识别的结果是:\(Int(topResult.confidence*100))%是\(topResult.identifier)"
                    //if topResult.confidence < 0.99{
                       // self!.display_label.text = "识别的结果是:\(Int(topResult.confidence*100))%是\(topResult.identifier)"
                    //}
                    //else {
                       // self!.display_label.text = "识别的结果是:非猫非狗"
                    }
                    
                }
            }
            //将获取到的图片转换为CIImage类型作为参数传递给模型
            guard let ciImage = CIImage(image: pickedImage) else {
                fatalError("不能获取选择到的图片")
            }
            //运行图片分类识别器
            let handler = VNImageRequestHandler(ciImage: ciImage)
            DispatchQueue.global().async {
                do {
                    try handler.perform([requset])
                }
                catch {
                    print(error)
                }
            }
            
        }
        picker.dismiss(animated: true, completion: nil)
}

最后,也是最重要的事情,需要在Info.plist中加入调用相机的权限

image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。