In iOS 17 you get great results with VNGenerateForegroundInstanceMaskRequest() - make your image a CVPixelBuffer, then feed it into something like this:
var maskRequest = VNGenerateForegroundInstanceMaskRequest()
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
do {
try handler.perform([maskRequest])
if let observation = maskRequest.results?.first {
let allInstances = observation.allInstances
do {
let maskedImage = try observation.generateMaskedImage(ofInstances: allInstances, from: handler, croppedToInstancesExtent: false)
let maskImage = imageFromCVPixelBuffer(maskedImage)
sceneView.scene.background.contents = maskImage
} catch {
print("Error: \(error.localizedDescription)")
}
}
} catch {
print("Failed to perform Vision request: \(error)")
}