iOS SwiftUI整合人工智能制作照片识别App(2020教程)

619 阅读2分钟

人类即将进入人工智能时代,作为一个普通程序员我们除了增删改查之外,还应接触一下新的技术与事物。本文我将带领大家做个小demo,用SwiftUI和CoreML组件来制作一个识别物体的智能App

人人都能学会人工智能

其实我开始想写机器学习,但是担心把大家都吓跑了。请大家放心,本文保证绝不出现一个公式,也不讲深奥的理论,将通过一个实实在在的小例子让大家掌握制作智能应用的方法。

我争取在300行代码以内,完成智能识别App的制作。

先看后学真把式

我们在学之前先看看最终效果

智能视图.gif

如你所见,我们创建一个滚动视图,视图里面罗列待识别的照片。我们找了一些牛、猫、狗、山的照片,用来测试App识别效果。

打铁还须自身硬

接下来,我们来逐步实现这个app吧!

第一步:我们首先来创建一个滚动视图,用于让用户选择识别的照片。

滚动.gif

1、定义一个数组存储待识别照片名称

//定义一个数组存储待识别照片名称
 let images = ["niu","cat1","dog","tree","mountains"]

2、


//
 VStack {
                    ScrollView([.horizontal]) {
                        HStack {
                            ForEach(self.images,id: \.self) { name in
                                Image(name)
                                    .resizable()
                                    .frame(width: 300, height: 300)
                                    .padding()
                                    .onTapGesture {
                                        self.selectedImage = name
                                }.border(Color.orange, width: self.selectedImage == name ? 10 : 0)
                            }
                        }
                    }

第二步 完善整个页面

import SwiftUI

struct ContentView: View {
    
    let images = ["niu","cat1","dog","tree","mountains"]
    @State private var selectedImage = ""
    
    @ObservedObject private var imageDetectionVM: ImageDetectionViewModel
    private var imageDetectionManager: ImageDetectionManager
    
    init() {
        self.imageDetectionManager = ImageDetectionManager()
        self.imageDetectionVM = ImageDetectionViewModel(manager: self.imageDetectionManager)
    }
    
    var body: some View {
        NavigationView {
            VStack{
                HStack{
                    Text("识别结果:")
                        .font(.system(size: 26))
                        .padding()
                    
                    Text(self.imageDetectionVM.predictionLabel)
                        .font(.system(size: 26))
                }
                
                VStack {
                    ScrollView([.horizontal]) {
                        HStack {
                            ForEach(self.images,id: \.self) { name in
                                Image(name)
                                    .resizable()
                                    .frame(width: 300, height: 300)
                                    .padding()
                                    .onTapGesture {
                                        self.selectedImage = name
                                }.border(Color.orange, width: self.selectedImage == name ? 10 : 0)
                            }
                        }
                    }
                    
                    Button("智能识别") {
                        self.imageDetectionVM.detect(self.selectedImage)
                    }.padding()
                        .background(Color.orange)
                        .foregroundColor(Color.white)
                        .cornerRadius(10)
                        .padding()
                    
                    Text(self.imageDetectionVM.predictionLabel)
                        .font(.system(size: 26))
                    
                    
                }
            }
                
            .navigationBarTitle("Core ML")
            
        }
    }
}

第三步 将MVVM进行到底,构建一个照片识别的model

import Foundation
import SwiftUI
import Combine

class ImageDetectionViewModel: ObservableObject {
    
    var name: String = ""
    var manager: ImageDetectionManager
    
    @Published var predictionLabel: String = ""
    
    init(manager: ImageDetectionManager) {
        self.manager = manager
    }
    
    func detect(_ name: String) {
        
        let sourceImage = UIImage(named: name)
        
        guard let resizedImage = sourceImage?.resizeImage(targetSize: CGSize(width: 224, height: 224)) else {
            fatalError("Unable to resize the image!")
        }
        
        if let label = self.manager.detect(resizedImage) {
            self.predictionLabel = label
        }
      
    }
    
}

第四步 识别业务逻辑

import Foundation
import CoreML
import UIKit

class ImageDetectionManager {
    
    let model = Resnet50()
    
    func detect(_ img: UIImage) -> String? {
        
        guard let pixelBuffer = img.toCVPixelBuffer(),
            let prediction = try? model.prediction(image: pixelBuffer) else {
                return nil
        }
        
        return prediction.classLabel
        
    }
    
}

iOS人工智能项目完整代码

下载地址: www.jianshu.com/p/f7cbf5e72…

更多SwiftUI教程和代码关注专栏

QQ:3365059189 SwiftUI技术交流QQ群:518696470