iOS MachineLearning 系列(9)—— 人物蒙版图生成

简介: 人物蒙版图能力是Vision框架在iOS 15中新增的功能,这个功能可以将图片中的人物按照轮廓生成无光蒙版。无光蒙版在实际业务中非常有用,使用此蒙版可以方便的将人物从图片中提取出来,然后和其他的背景图进行合成。

iOS MachineLearning 系列(9)—— 人物蒙版图生成

人物蒙版图能力是Vision框架在iOS 15中新增的功能,这个功能可以将图片中的人物按照轮廓生成无光蒙版。无光蒙版在实际业务中非常有用,使用此蒙版可以方便的将人物从图片中提取出来,然后和其他的背景图进行合成。

1 - 人物蒙版的提取

首先,人物蒙版的提取非常简单,使用VNGeneratePersonSegmentationRequest创建蒙版分析请求,如下:

private lazy var personRequest: VNGeneratePersonSegmentationRequest = {
    let request = VNGeneratePersonSegmentationRequest { request, error in
        DispatchQueue.main.async {
            self.drawTask(request: request as! VNGeneratePersonSegmentationRequest)
        }
    }
    return request
}()

使用VNImageRequestHandler来触发请求即可:

// 要分析的图片资源
let image = UIImage(named: "image7")!

// 图像分析请求
lazy var imageRequestHandler = VNImageRequestHandler(ciImage: CIImage(cgImage: image.cgImage!),
                                                orientation: .up,
                                                options: [:])

请求的结果VNPixelBufferObservation中会封装蒙版图片CVPixelBuffer数据,如下:

open class VNPixelBufferObservation : VNObservation {
    // 分析出的蒙版数据
    open var pixelBuffer: CVPixelBuffer { get }
    // 分析所使用的模型
    open var featureName: String? { get }
}

处理请求结果如下:

private func drawTask(request: VNGeneratePersonSegmentationRequest) {

    for result in request.results ?? [] {
        // 创建CIImage实例
        let ciImage = CIImage(cvPixelBuffer: result.pixelBuffer)
        // 默认返回的蒙版为黑白两色,这里讲所有黑色替换成透明色
        let filter = CIFilter(name: "CIMaskToAlpha", parameters: [kCIInputImageKey: ciImage])
        guard let outputImage = filter?.outputImage else { return }
        let context = CIContext(options: nil)
        let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
        let uiImage = UIImage(cgImage: cgImage!)
        
        let v = UIImageView(image: uiImage)
        v.frame = imageView.frame
        v.backgroundColor = .black
        v.frame.origin.y += imageView.frame.height
        v.image = uiImage
        view.addSubview(v)
    }
}

效果如下图:

2 - 进行人物提取

获取到了蒙版,提取人物将很简单,修改上述代码如下:

private func drawTask(request: VNGeneratePersonSegmentationRequest) {

    for result in request.results ?? [] {
        print(result.pixelBuffer)
        let ciImage = CIImage(cvPixelBuffer: result.pixelBuffer)
        
        let filter = CIFilter(name: "CIMaskToAlpha", parameters: [kCIInputImageKey: ciImage])
        
        guard let outputImage = filter?.outputImage else { return }
        let context = CIContext(options: nil)
        let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
        let uiImage = UIImage(cgImage: cgImage!)
        
        
        let v = UIImageView(image: uiImage)
        v.frame = imageView.frame
        v.backgroundColor = .blue
        v.frame.origin.y += imageView.frame.height

        v.image = uiImage
        view.addSubview(v)
        
        
        
        let v2 = UIImageView(image: image)
        v2.frame = v.frame
        v2.frame.origin.y += v.frame.height
        
        let mask =  UIImageView(image: uiImage)
        mask.frame = CGRect(x: 0, y: 0, width: v2.frame.size.width, height: v2.frame.size.height)
        mask.backgroundColor = .clear
        // 使用蒙版截取
        v2.mask = mask
        view.addSubview(v2)
    }
}

效果如下:

完整的示例代码可以在如下地址找到:

https://github.com/ZYHshao/MachineLearnDemo

VNGeneratePersonSegmentationRequest结合CIFilter的使用,可以方便的进行背景合成。
目录
相关文章
|
算法 API iOS开发
iOS MachineLearning 系列(3)—— 静态图像分析之区域识别
本系列的前一篇文章介绍了如何使用iOS中自带的API对图片中的矩形区域进行分析。在图像静态分析方面,矩形区域分析是非常基础的部分。API还提供了更多面向应用的分析能力,如文本区域分析,条形码二维码的分析,人脸区域分析,人体分析等。本篇文章主要介绍这些分析API的应用。
298 0
|
机器学习/深度学习 API iOS开发
iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型
上一篇文章中,我们介绍了几个官方的图片分类的模型,图片分类模型的应用场景在于将图片中最主要的事物进行识别,在已有的词库中找到最可能得事物。而对象识别则要更高级一些。再之前的文章,我们介绍过可以使用官方提供的API来进行矩形识别,文本识别,二维码识别以及人脸识别等,这类识别功能的特点是我们不仅可以将图片中的物体位置和尺寸分析出来,还可以对其进行类别的分类。
379 0
|
人工智能 文字识别 API
iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类
本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是Machine Learning领域重要的应用。通过大量的图片数据进行训练后,模型可以轻易的分析出图片的属性以及图片中物体的属性。
393 0
|
人工智能 数据挖掘 API
iOS MachineLearning 系列(20)—— 训练生成CoreML模型
本系列前面的文章详细的介绍了在iOS中与AI能力相关的API的使用,也介绍了如何使用训练好的CoreML模型来实现更强大的AI能力。然而,无论是成熟的API提供的能力,还是各种各样的三方模型,有时候都并不能满足某一领域内的定制化需求。当我们拥有很多的课训练数据,且需要定制化的AI能力时,其实就可以自己训练生成CoreML模型,将此定制化的模型应用到工程中去。
444 0
iOS MachineLearning 系列(20)—— 训练生成CoreML模型
|
自然语言处理 搜索推荐 iOS开发
iOS MachineLearning 系列(19)—— 分析文本中的问题答案
本篇文章将介绍Apple官方推荐的唯一的一个文本处理模型:BERT-SQuAD。此模型用来分析一段文本,并根据提供的问题在文本中寻找答案。需要注意,BERT模型不会生成新的句子,它会从提供的文本中找到最有可能的答案段落或句子。
204 0
iOS MachineLearning 系列(19)—— 分析文本中的问题答案
|
机器学习/深度学习 人工智能 自然语言处理
iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型
本篇文章将是本系列文章的最后一篇。本专题将iOS中有关Machine Learning的相关内容做了整体梳理。下面是专题中的其他文章地址,希望如果你有需要,本专题可以帮助到你。
376 0
|
数据可视化 数据挖掘 iOS开发
iOS MachineLearning 系列(21)——CoreML模型的更多训练模板
前面文章中,有介绍如何训练生成定制化需求的 CoreML 模型,以图像分类为例做了演示.
227 0
|
存储 API vr&ar
iOS MachineLearning 系列(18)—— PoseNet,DeeplabV3与FCRN-DepthPrediction模型
本篇文章将再介绍三个官方的CoreML模型:PoseNet,DeeplabV3和FCRN-DepthPrediction。
339 0
iOS MachineLearning 系列(18)—— PoseNet,DeeplabV3与FCRN-DepthPrediction模型
|
机器学习/深度学习 iOS开发 计算机视觉
iOS MachineLearning 系列(16)—— 几个常用的图片分类CoreML模型
对于图片识别分类的模型来说,其输入和输出都一样,输入都为图像参数,输入为两部分,一部分为最佳预测结果,一部分为可能得预测结果及其可信度。
438 0
|
存储 搜索推荐 iOS开发
iOS MachineLearning 系列(15)—— 可进行个性化更新的CoreML模型
上一篇文章,介绍了使用官方提供的CoreML模型来实现手写数字识别。其实,更多时候我们需要一个更加个性化的模型,对于手写图像来说,每个人的写法可能风格各异,如果可以在用户的使用过程中不断的更新模型,适应更加个性化的场景,就更完美了。幸运的是,CoreML正提供了这样的功能。我们可以创建一个可更新的模型来实现个性化Learning,同样,本文暂无设计模型的训练,我们通过官方的UpdatableDrawingClassifier模型来演示可更新模型的使用。
291 0