iOS SwiftUI整合人工智能製做照片識別App(2020教程)

人類即將進入人工智能時代,做爲一個普通程序員咱們除了增刪改查以外,還應接觸一下新的技術與事物。本文我將帶領你們作個小demo,用SwiftUI和CoreML組件來製做一個識別物體的智能App

人人都能學會人工智能

其實我開始想寫機器學習,可是擔憂把你們都嚇跑了。請你們放心,本文保證毫不出現一個公式,也不講深奧的理論,將經過一個實實在在的小例子讓你們掌握製做智能應用的方法。程序員

我爭取在300行代碼之內,完成智能識別App的製做。數組

先看後學真把式

咱們在學以前先看看最終效果app

智能視圖.gif

如你所見,咱們建立一個滾動視圖,視圖裏面羅列待識別的照片。咱們找了一些牛、貓、狗、山的照片,用來測試App識別效果。機器學習

打鐵還須自身硬

接下來,咱們來逐步實現這個app吧!學習

第一步:咱們首先來建立一個滾動視圖,用於讓用戶選擇識別的照片。

滾動.gif

一、定義一個數組存儲待識別照片名稱測試

//定義一個數組存儲待識別照片名稱
 let images = ["niu","cat1","dog","tree","mountains"]

二、人工智能

//
 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人工智能項目完整代碼

下載地址:
https://www.jianshu.com/p/f7c...spa

更多SwiftUI教程和代碼關注專欄

QQ:3365059189
SwiftUI技術交流QQ羣:5186964703d

https://www.jianshu.com/c/7b3...code

相關文章
相關標籤/搜索