Swift核心ML
你好 ! Core ML通过为您的应用启用快速和私有的设备上机器学习功能,已经彻底改变了应用从机器学习中受益的方式。 核心ML框架可用于Apple产品,包括Siri,Camera和QuickType。
Core ML SDK的一项重要新功能是Create ML。 使用Swift和macOS游乐场,开发人员可以在Mac上创建和训练自定义机器学习模型。 然后,他们可以使用Core ML将模型集成到他们的应用程序中。
今天,我们将使用Core ML和iPhone Camera。 通过使用开发人员apple’s网站上可用的Core ML Models进行实时对象检测的应用程序。
我们将使用ResNet-50 Core ML模型。 ResNet 50是一个预训练的卷积神经网络。 ResNet-50是一个卷积神经网络,对来自ImageNet数据库的一百万个图像进行了训练。 该网络深度为50层,可以将图像分类为1000个对象类别,例如键盘,鼠标,铅笔和许多动物。
设置相机:
首先,我们需要设置一个摄像头,通过将其发送到Core ML模型来检测对象。 让我们开始。
1.创建一个Camera View Controller:
创建一个名为CameraViewController的视图控制器,该视图控制器符合UIViewController和AVCaptureVideoDataOutputSampleBufferDelegate。
导入UIKit
导入AVKit
导入视觉
类CameraViewController:UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate {
2.以编程方式创建UILabel:
摄像机前面需要一个UILabel( identifierLabel ),以便每当摄像机检测到对象时,它都会通过在模型中搜索对象来显示其名称,并显示置信度。
置信度值表示模型对对象的置信度。 置信度值在0–1之间, 0表示最不准确 , 1表示最准确 。 每当在模型中传递对象时,都会作为响应接收标识符和置信度。
让 identifierLabel:UILabel = {
让标签= UILabel()
label.backgroundColor = .white
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
返回标签
}()
3.编写setupCamera函数:
在setupCamera函数中,我们将设置摄像机及其捕获会话,并在最后添加dataOutput 。
数据输出捕获记录视频的输出,并提供对视频帧的访问以进行处理。 有关更多详细信息,请参阅Apple的文档。
fileprivate func setupCamera(){
让 captureSession = AVCaptureSession()
captureSession.sessionPreset = .high //用于全屏显示
后卫 让 captureDevice = AVCaptureDevice.default(for:.video)
否则 { return }
守卫 让输入=
尝试吗? AVCaptureDeviceInput(device:captureDevice) else { return }
captureSession.addInput(输入)
captureSession.startRunning()
让 PreviewLayer =
AVCaptureVideoPreviewLayer(会话:captureSession)
view.layer.addSublayer(previewLayer)
PreviewLayer.frame = view.frame
让 dataOutput = AVCaptureVideoDataOutput()
dataOutput.setSampleBufferDelegate( self ,队列:DispatchQueue(label:“ videoQueue”))
captureSession.addOutput(dataOutput)
setupIdentifierConfidenceLabel()//设置UILabel
}
4.编写setupIdentifierConfidenceLabel函数:
在此函数中,我们最终将设置指向上面声明的标签的标识符。 我们还将设置在每个屏幕尺寸上运行应用程序的约束。
fileprivate func setupIdentifierConfidenceLabel(){
//将其添加到视图上方
view.addSubview(identifierLabel)
//设置约束,使其适用于所有屏幕尺寸
identifierLabel.bottomAnchor.constraint(等于:view.bottomAnchor,常数:-32).isActive = true
identifierLabel.leftAnchor.constraint(equalTo:view.leftAnchor).isActive = true
identifierLabel.rightAnchor.constraint(equalTo:view.rightAnchor).isActive = true
identifierLabel.heightAnchor.constraint(equalToConstant:50).isActive = true
}
5.在viewDidLoad中调用setupCamera函数:
需要在相机视图控制器的viewLoad中调用setupCamera函数才能启动
覆盖func viewDidLoad(){
super.viewDidLoad()
_ = setupCamera()//在加载视图时开始运行摄像头
}
6. FINAL&CHEIF功能:
captureOutput函数会通知委托人已写入新的视频帧。 有关更多详细信息,请查阅Apple的文档。
func captureOutput( _输出:AVCaptureOutput,didOutput sampleBuffer:CMSampleBuffer,来自连接:AVCaptureConnection){
守护 让 pixelBuffer:CVPixelBuffer =
CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
//不要忘记!
//确保下载并导入项目中的模型
//下载链接:https://developer.apple.com/machine-learning/ 滚动到底部并查找ResNet50
守卫 让模型= 尝试 ? VNCoreMLModel(用于:Resnet50()。model)
否则 { return }
让请求= VNCoreMLRequest(模型:模型)
{(finishedReq,err) 在
守卫结果=
finishReq.results 为 ? [VNClassificationObservation]
否则 { return }
守卫 let firstObservation = results.first
否则 { return }
打印(firstObservation.identifier,firstObservation.confidence)
DispatchQueue.main.async {
让confidenceRate = firstObservation.confidence * 100
让objectName = firstObservation.identifier
self .identifierLabel.text =“ \(objectName)\(confidenceRate)”
}
}
尝试吗? VNImageRequestHandler(cvPixelBuffer:pixelBuffer,选项:[:])。perform([request])
}
7.隐私权限设置:
不要忘记添加摄像头访问权限。 在Swift 4中,无需编程即可添加权限的最简单方法是打开info.plist文件。
1.选择“信息属性”列表旁边的+ 。
2.在下拉列表中滚动至“ 隐私”选项,然后选择“ 隐私摄像机使用说明”以访问摄像机 。
3.做出选择后,在右侧填写String值 ,以包括在警报弹出窗口询问权限时想要显示给用户的文本。
8.最终应用启动:
在可用的设备(模拟器/物理设备)上运行应用程序。 权限警报将弹出,按“是”以允许应用访问相机并开始使用Core ML ResNet-50通过相机检测对象。
您可以在我的GitHub存储库中找到源代码,但不要忘记从开发人员Apple的网站下载ResNet-50模型。 并将其导入项目中。
编码愉快!