如何使用苹果的机器学习将主体从背景中提炼出来?

Dan*_*iel 5 macos image-processing vision ios

在 iOS 16 中,您可以从图像中提升主体或通过移除背景来隔离主体。

您可以在这里看到它的实际效果:https://developer.apple.com/wwdc22/101?time =1101

我想知道这个功能是否也可供开发者在自己的应用程序中使用。人们或许可以训练一种机器学习模型并将其与视觉框架一起使用。

这里有一个关于如何实现这一点的例子,但是苹果的解决方案已经很好了,我不想在有捷径的情况下花时间重新发明轮子。

Meh*_*lan 5

Apple\xe2\x80\x99sCoreML库和DeepLabV3图像分割模型就是您正在寻找的东西。

\n

DeepLabV3模型经过训练可以识别和分割这些项目:

\n
    \n
  • 飞机
  • \n
  • 自行车
  • \n
  • \n
  • \n
  • 瓶子
  • \n
  • 公共汽车
  • \n
  • \n
  • \n
  • 椅子
  • \n
  • 奶牛
  • \n
  • 餐桌
  • \n
  • \n
  • \n
  • 摩托车
  • \n
  • \n
  • 盆栽
  • \n
  • \n
  • 沙发
  • \n
  • 火车
  • \n
  • 电视或显示器
  • \n
\n

VNCoreMLRequest是要使用的API CoreML。它接受一个回调函数,用于获取图像的特征,即对象VNCoreMLFeatureValueObservation

\n

VNCoreMLFeatureValueObservation对象给出了图片的分割图,这正是您正在寻找的。删除背景就是掩盖这些片段之一。

\n

这里有一份完整的、写得很好的分步指南。

\n

从该链接的主要部分如下:

\n
\n// use DeepLabV3\nfunc runVisionRequest() {\n        \n        guard let model = try? VNCoreMLModel(for: DeepLabV3(configuration: .init()).model)\n        else { return }\n        \n        let request = VNCoreMLRequest(model: model, completionHandler: visionRequestDidComplete)\n        request.imageCropAndScaleOption = .scaleFill\n        DispatchQueue.global().async {\n\n            let handler = VNImageRequestHandler(cgImage: inputImage.cgImage!, options: [:])\n            \n            do {\n                try handler.perform([request])\n            }catch {\n                print(error)\n            }\n        }\n    }\n\n// extract the segmentation map and convert to an image using a third party library\n\nfunc visionRequestDidComplete(request: VNRequest, error: Error?) {\n            DispatchQueue.main.async {\n                if let observations = request.results as? [VNCoreMLFeatureValueObservation],\n                    let segmentationmap = observations.first?.featureValue.multiArrayValue {\n                    \n                    let segmentationMask = segmentationmap.image(min: 0, max: 1)\n\n                    self.outputImage = segmentationMask!.resizedImage(for: self.inputImage.size)!\n\n                    maskInputImage()\n                }\n            }\n    }\n\n
Run Code Online (Sandbox Code Playgroud)\n