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的视图控制器,该视图控制器符合UIViewControllerAVCaptureVideoDataOutputSampleBufferDelegate。

 导入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模型。 并将其导入项目中。

编码愉快!