一、官方Demo下载地址
二、简介
该例子功能是:使用Vision框架对图片进行预处理,并使用Core ML 模型对图片进行分类。
三、概述
使用Core ML框架,你可以使用经过训练的机器学习模型对输入的数据进行分类。Vision框架和Core ML合作,把分类模型应用于图片,并对这些图片进行预处理,使机器学习任务更简单、更可靠。
这个示例应用程序使用开源的MobileNet
模型(几种可用分类模型
之一),用1000个分类类别来识别一个图像,如下面截图所示:
四、示例app简介
想要查看示例app的实际运行情况,请构建并运行这个项目,然后使用app中工具栏中的按钮来拍摄或者从相册中选取一个图片。然后示例应用使用Vision将Core ML模型作用于所选取的图像,并将结果显示在分类标签上并且显示每个分类标签前有其置信级别的数字。它按照分类模型分配给每个分类的置信度,显示置信度靠前的两个分类。
五、结合Core ML Model 建立Vision
Core ML 自动生成一个Swift类,提供方便访问您的ML模型的方法;在这个示例中,Core ML根据MobileNet模型自动生成了MobileNet类。用这个模型创建一个Vision request,请创建该类的一个实例,并用它的model属性来创建和一个VNCoreMLRequest对象。使用请求对象的完成处理程序指定一个执行请求后从模型接收结果的方法。
let model = try VNCoreMLModel(for: MobileNet().model)
let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
self?.processClassifications(for: request, error: error)
})
request.imageCropAndScaleOption = .centerCrop
return request
ML模型是以固定宽高比来处理图像,但是输入的图像可能是任意宽高比,所以Vision必须对图像进行缩放或者裁剪来进行适配。为了获得最佳效果,设置request的imageCropAndScaleOption属性来匹配模型所训练的图像布局。对于可用分类模型,除非有其他说明,否则VNImageCropAndScaleOption.centerCrop选项是合适的。
六、运行Vision Request
使用要处理的图像创建VNImageRequestHandler对象,并把requests作为参数传给这个对象的perform(_:)方法。这个方法同步运行,使用后台队列,这样当你执行请求的时候不会阻塞主队列。
DispatchQueue.global(qos: .userInitiated).async {
let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
do {
try handler.perform([self.classificationRequest])
} catch {
/*
This handler catches general image processing errors. The `classificationRequest`'s
completion handler `processClassifications(_:error:)` catches errors specific
to processing that request.
*/
print("Failed to perform classification.\n\(error.localizedDescription)")
}
}
大部分图像都针对已经正确定位显示的图像进行训练的。要确保正确处理输入的具有任意方向的图片,请将图像的方向传递给图像请求的处理程序。(这个示例app将CGImagePropertyOrientation类型作为初始值设定项添加到初始化器init(_:)
,用于从UIImage.Orientation的方向值进行转换。
七、处理图像分类结果
Vision 请求的完成处理程序会指示请求是成功还是错误。如果成功,它的results属性包含VNClassificationObservation对象,该对象描述ML模型识别出的可能分类。
func processClassifications(for request: VNRequest, error: Error?) {
DispatchQueue.main.async {
guard let results = request.results else {
self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)"
return
}
// The `results` will always be `VNClassificationObservation`s, as specified by the Core ML model in this project.
let classifications = results as! [VNClassificationObservation]
网友评论