再升级!机器学习服务打造“发丝”级图像分割能力

原创
2023/05/25 09:48
阅读数 3.6K

电子证件照需要换底时,如何简单高效将人像边缘切割得顺滑自然?视频弹幕太多挡住了人物的脸,想要实现“弹幕蒙版”又该如何解决?

想要实现以上操作,传统的方式我们需要依赖专业的图像处理软件在电脑端进行手动裁剪人物、添加蒙版、替换画布等,如果人物边缘细节非常丰富,则需要耗费巨大的工作量。那么,有没有操作简单又能实现自然替换的方法呢?

华为机器学习服务提供优秀的静态和动态图像分割能力。基于深度学习框架,结合检测识别技术,实现高精视觉分割能力,可实现秒级全自动主体、场景像素级识别。通过使用具有创新意义的语义分割框架,将图像中的每个像素都进行标签化,可支持人像、天空、植物、美食、建筑、山峰等11大类元素的分割。

图像分割能力可以广泛应用于影像娱乐类App。例如,图像编辑类App集成该服务,可以快速更换图像背景。拍照类App集成该服务,可以识别不同的元素进行不同的优化,例如对植物元素的优化,让植物显得更加青翠。

虽然目前图像抠图市场持续火热,但市面上的一些抠图算法效果在人像发丝细节处理均不是很好,华为机器学习服务针对这一问题,不断深化发丝和高度镂空相关算法,无论是在直播还是图片编辑的人像处理中,都可保留发丝级的边缘细节,呈现出更好的抠图效果。

开发步骤

在进行开发之前,您需要完成必要的开发准备工作,同时请确保您的工程中已经配置HMS Core SDK的Maven仓地址,并且完成了本服务的SDK集成

华为机器学习服务提供人像分割、多类别分割和头发分割三种能力。

人像分割模型包用于分割人像和背景,支持视频流和图片分割。如果您只需要分割人像和背景,建议使用人像分割模型包。人像分割返回值包括:人像元素的坐标数组、背景透明的人像前景图以及人像为白色,背景为黑色的灰度图。您的App可以在此返回值的基础上做进一步处理,如视频背景替换、人像抠图等。

多类别分割返回值为各元素的坐标数组。例如:一张图像中包含人像、天空、植物、猫狗这4种元素,返回值为这4种元素的坐标数组,以便后续进一步处理不同的元素,如替换天空元素。

头发分割模型包用于分割头发和背景,当前仅支持图片分割,不支持视频流分割,头发分割返回值为头发元素的坐标数据。例如:一张自拍图,返回值为头发元素的坐标数组,以便后续进一步处理,如头发染色等。

静态图像分割

  1. 创建图像分割器。

集成人像分割模型包

// 方式一:使用默认参数配置图像分割检测器。
// 默认模式为:人像分割模式+精度模式,返回人像分割的所有分割结果(像素级标记信息、背景透明的人像图、人像为白色,背景为黑色的灰度图以及被分割的原图)。
MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(); 
// 方式二:使用自定义参数MLImageSegmentationSetting配置图像分割检测器。 
MLImageSegmentationSetting setting = new MLImageSegmentationSetting.Factory() 
    // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。 
    .setExact(false) 
    // 设置分割模式为人像分割。 
    .setAnalyzerType(MLImageSegmentationSetting.BODY_SEG) 
    // 设置返回结果种类。
    // MLImageSegmentationScene.ALL: 返回所有分割结果,包括:像素级标记信息、背景透明的人像图和人像为白色,背景为黑色的灰度图以及被分割的原图。
    // MLImageSegmentationScene.MASK_ONLY: 只返回像素级标记信息和被分割的原图。
    // MLImageSegmentationScene.FOREGROUND_ONLY: 只返回背景透明的人像图和被分割的原图。
    // MLImageSegmentationScene.GRAYSCALE_ONLY: 只返回人像为白色,背景为黑色的灰度图和被分割的原图。 
    .setScene(MLImageSegmentationScene.FOREGROUND_ONLY) 
    .create(); 
MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);

集成多类型分割模型包

使用多类型分割模型包对图像进行多类别分割时,只支持通过图像分割检测配置器MLImageSegmentationSetting创建图像分割检测器。

MLImageSegmentationSetting setting = new MLImageSegmentationSetting 
    .Factory()
    // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。
    .setExact(true) 
    // 设置分割模式为图像分割。
    .setAnalyzerType(MLImageSegmentationSetting.IMAGE_SEG)
    .create(); 
MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);

集成头发分割模型包

使用头发分割模型包对图像进行头发分割时,只支持通过头发分割检测配置器MLImageSegmentationSetting创建头发分割检测器。

MLImageSegmentationSetting setting = new MLImageSegmentationSetting 
    .Factory()
    // 设置分割模式为头发分割。
    .setAnalyzerType(MLImageSegmentationSetting.HAIR_SEG)
    .create(); 
MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);
  1. 通过android.graphics.Bitmap创建MLFrame对象用于分析器检测图片,支持的图片格式包括:jpg/jpeg/png,建议图片尺寸不小于224224像素,不大于12801280像素。
// 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。 
MLFrame frame = MLFrame.fromBitmap(bitmap);
  1. 调用asyncAnalyseFrame方法进行图像分割。
// 创建一个task,处理图像分割检测器返回的结果。
Task<MLImageSegmentation> task = analyzer.asyncAnalyseFrame(frame); 
// 异步处理图像分割检测器返回结果。
task.addOnSuccessListener(new 
OnSuccessListener<MLImageSegmentation>() {
    @Override
    public void onSuccess(MLImageSegmentation segmentation) {
        // 检测成功处理。
    }})
    .addOnFailureListener(new OnFailureListener() {
    @Override 
    public void onFailure(Exception e) {
        // 检测失败处理。
}});
  1. 检测完成,停止分析器,释放检测资源。
if (analyzer != null) {
    try {
        analyzer.stop(); 
    } catch (IOException e) {
        // 异常处理。
    }
}

以上示例代码中使用了异步调用方式,图像分割还支持同步调用使用analyseFrame函数获取检测结果:

SparseArray<MLImageSegmentation> segmentations = analyzer.analyseFrame(frame);

了解更多详情>>

访问机器学习服务联盟官网

获取机器学习服务开发指导文档

访问HMS Core 联盟官网

获取HMS Core 开发指导文档

关注我们,第一时间了解 HMS Core 最新技术资讯~

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部