再升级!机器学习服务打造“发丝”级图像分割能力
电子证件照需要换底时,如何简单高效将人像边缘切割得顺滑自然?视频弹幕太多挡住了人物的脸,想要实现“弹幕蒙版”又该如何解决?
想要实现以上操作,传统的方式我们需要依赖专业的图像处理软件在电脑端进行手动裁剪人物、添加蒙版、替换画布等,如果人物边缘细节非常丰富,则需要耗费巨大的工作量。那么,有没有操作简单又能实现自然替换的方法呢?
华为机器学习服务提供优秀的静态和动态图像分割能力。基于深度学习框架,结合检测识别技术,实现高精视觉分割能力,可实现秒级全自动主体、场景像素级识别。通过使用具有创新意义的语义分割框架,将图像中的每个像素都进行标签化,可支持人像、天空、植物、美食、建筑、山峰等11大类元素的分割。
图像分割能力可以广泛应用于影像娱乐类App。例如,图像编辑类App集成该服务,可以快速更换图像背景。拍照类App集成该服务,可以识别不同的元素进行不同的优化,例如对植物元素的优化,让植物显得更加青翠。
虽然目前图像抠图市场持续火热,但市面上的一些抠图算法效果在人像发丝细节处理均不是很好,华为机器学习服务针对这一问题,不断深化发丝和高度镂空相关算法,无论是在直播还是图片编辑的人像处理中,都可保留发丝级的边缘细节,呈现出更好的抠图效果。
开发步骤
在进行开发之前,您需要完成必要的开发准备工作,同时请确保您的工程中已经配置HMS Core SDK的Maven仓地址,并且完成了本服务的SDK集成。
华为机器学习服务提供人像分割、多类别分割和头发分割三种能力。
人像分割模型包用于分割人像和背景,支持视频流和图片分割。如果您只需要分割人像和背景,建议使用人像分割模型包。人像分割返回值包括:人像元素的坐标数组、背景透明的人像前景图以及人像为白色,背景为黑色的灰度图。您的App可以在此返回值的基础上做进一步处理,如视频背景替换、人像抠图等。
多类别分割返回值为各元素的坐标数组。例如:一张图像中包含人像、天空、植物、猫狗这4种元素,返回值为这4种元素的坐标数组,以便后续进一步处理不同的元素,如替换天空元素。
头发分割模型包用于分割头发和背景,当前仅支持图片分割,不支持视频流分割,头发分割返回值为头发元素的坐标数据。例如:一张自拍图,返回值为头发元素的坐标数组,以便后续进一步处理,如头发染色等。
静态图像分割
- 创建图像分割器。
集成人像分割模型包
// 方式一:使用默认参数配置图像分割检测器。 // 默认模式为:人像分割模式+精度模式,返回人像分割的所有分割结果(像素级标记信息、背景透明的人像图、人像为白色,背景为黑色的灰度图以及被分割的原图)。 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);
- 通过android.graphics.Bitmap创建MLFrame对象用于分析器检测图片,支持的图片格式包括:jpg/jpeg/png,建议图片尺寸不小于224224像素,不大于12801280像素。
// 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。 MLFrame frame = MLFrame.fromBitmap(bitmap);
- 调用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) { // 检测失败处理。 }});
- 检测完成,停止分析器,释放检测资源。
if (analyzer != null) { try { analyzer.stop(); } catch (IOException e) { // 异常处理。 } }
以上示例代码中使用了异步调用方式,图像分割还支持同步调用使用analyseFrame函数获取检测结果:
SparseArray<MLImageSegmentation> segmentations = analyzer.analyseFrame(frame);
了解更多详情>>
关注我们,第一时间了解 HMS Core 最新技术资讯~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python从0到1丨了解图像形态学运算中腐蚀和膨胀
摘要:这篇文章将详细讲解图像形态学知识,主要介绍图像腐蚀处理和膨胀处理。 本文分享自华为云社区《[Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解》,作者: eastmount 。 一.形态学理论知识 数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并出去不相干的结构。数学形态学的算法有天然的并行实现的结构,主要针对的是二值图像(0或1)。在图像处理方面,二值形态学经常应用到对图像进行分割、细化、抽取骨架、边缘提取、形状分析、角点检测,分水岭算法等。由于其算法简单,算法能够并行运算所以经常应用到硬件中[1-2]。 常见的图像形态学运算包括: 腐蚀 膨胀 开运算 闭运算 梯度运算 顶帽运算 底帽运算 这些运算在OpenCV中主要通过MorphologyEx()函数实现,它能利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,如开闭运算、形态学梯度、顶帽、黑帽等,也可以实现最基本的图像膨胀和腐蚀。其函数原型如下: dst = cv2.morphologyEx(src, model, kernel) – src表示原始图像 – model表示图像进行形态学处理,包括...
- 下一篇
如何编写一个健壮的 npm 包 | 京东云技术团队
无脑发布 npm 比如老王我,用npm init新建一个包,改把改把,然后来个npm publish,so easy ✌️! Too young too naive, baby 👶! 请容我讲述一些发布过程中踩过的坑。 首先,算了也可以之后有空再说,我们需要通读npm的配置文档。 package.json doc 通用性👷 指定发布文件 利用package.json中files字段精简发布体积。 { "files": ["dist", "lib", "module"] } 若不指定files,每次发布会把所有不以.开头的文件都发布出去,导致发布体积过大(node_modules默认也不会被发布)。 README.md作为主文档,加不加都会发布,package.json也是。 指定源代码 { "source": "src/index.ts", "repository": { "type": "git", "url": "https://github.com/yourname/yourproject.git" } } 通常来说我是不在npm发布中包括源代码的,因此都...
相关文章
文章评论
共有0条评论来说两句吧...