用Vision和Core ML对图片进行分类

概览

使用Core ML框架,你可以使用经过机器训练了的模型来对输入数据进行分类。

Vision框架与Core ML共同协作,将分类模型应用到图像上,并对这些图像进行预处理,使机器学习更容易、更可靠。

该示例应用程序使用了开源的MobileNet模型,同事也是几个可用的分类模型之一,可以用1000个分类类别来识别一个图像,如下图所示:

demo.png

该示例是通过从图片库中选择一张图片,然后通过Vision和Core ML的技术,将获取到的分类标签以及可信度的值。

使用Core ML模型配置Vision

Core ML自动生成一个Swift的类--MobileNet类,它可以很访问地访问你的ML模型。要使用该模型配置一个Vision请求,需要创建该类的一个实例,并使用它的model属性创建一个VNCoreMLRequest对象。再添加一个request对象的完成后的回调来处理请求完成之后的事情。

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属性来匹配模型所能接受的图像布局。对于可用的分类模型,除非另外说明外,centerCrop选项是最合适的。

运行Vision Request

使用要处理的图片创建一个VNImageRequestHandler对象,并将request传给对象的perform(_:)方法。改方法是同步执行的--使用了一个后台队列,以至于当request执行的时候不阻塞主线程。

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)")
    }
}

大多数模型都是针对已经正确显示的图像进行训练的。为了确保正确处理任意方向的图像输入,将图像的方向传递给图像请求处理器。(该示例添加了一个初始化方法init(_:),需要将UIImageOrientationlie类型的值转换为CGImagePropertyOrientation类型)

处理图像分类结果

Vision的请求完成处理会告诉我们请求是成功还是失败。如果成功了,它的results属性包含VNClassificationObservation的对象,描述了可能分类识别的对象。

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]

你可能感兴趣的:(用Vision和Core ML对图片进行分类)