人类即将进入人工智能时代,作为一个普通程序员我们除了增删改查之外,还应接触一下新的技术与事物。本文我将带领大家做个小demo,用SwiftUI和CoreML组件来制作一个识别物体的智能App
人人都能学会人工智能
其实我开始想写机器学习,但是担心把大家都吓跑了。请大家放心,本文保证绝不出现一个公式,也不讲深奥的理论,将通过一个实实在在的小例子让大家掌握制作智能应用的方法。
我争取在300行代码以内,完成智能识别App的制作。
先看后学真把式
我们在学之前先看看最终效果
如你所见,我们创建一个滚动视图,视图里面罗列待识别的照片。我们找了一些牛、猫、狗、山的照片,用来测试App识别效果。
打铁还须自身硬
接下来,我们来逐步实现这个app吧!
第一步:我们首先来创建一个滚动视图,用于让用户选择识别的照片。
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人工智能项目完整代码
下载地址:
https://www.jianshu.com/p/f7c...
更多SwiftUI教程和代码关注专栏
QQ:3365059189
SwiftUI技术交流QQ群:518696470
- 请关注我的专栏icloudend, SwiftUI教程与源码
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。