从菜鸟到高手, HMS Core图像分割服务教你如何在复杂背景里精细抠图
2021年以来,自动驾驶赛道进入爆发期,该行业成为大厂以及初创企业的必争之地。其中众多公司都采用了计算机视觉作为自动驾驶的技术底座,通过图像分割技术,汽车才能够有效理解道路场景,分清楚哪里是路,哪里是人。除了自动驾驶领域,图像分割技术也常出现在其他重要的场景中,比如:
-
医疗图像分割:帮助医生进行诊断测试
-
卫星图像分析:适合深入研究大量图像数据
-
影像娱乐类App:人像抠图、避免视频弹幕遮住人脸
因此,图像分割技术的应用十分重要且广泛。HMS Core机器学习服务图像分割服务采用了具有创新意义的语义分割框架。这种框架将图像中的每个像素点都标签化,即使是发丝细节都可以清晰完整的保留。另外,图像分割服务还提升了对于不同画质、不同尺寸图片的处理能力,针对分割算法常常出现的白边,采用更加结构化学习的训练方式,使边缘更加自然。
那么如此稳定、精细化的分割能力,到底如何实现?
开发实战
一、开发准备
Maven仓和SDK的配置步骤可以参考开发者网站中的应用开发介绍: https://developer.huawei.com/consumer/cn/doc/development/hiai-Guides/image-segmentation-0000001050040109#section1658976113112?ha_source=hms1
1 配置华为Maven仓地址。
buildscript { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } dependencies { ... classpath 'com.huawei.agconnect:agcp:1.4.1.300' } } allprojects { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } }
2 添加编译SDK依赖
dependencies { // 引入基础SDK implementation 'com.huawei.hms:ml-computer-vision-segmentation:2.1.0.301' // 引入人像分割模型包 implementation 'com.huawei.hms:ml-computer-vision-image-segmentation-body-model:2.1.0.303' }
3 在AndroidManifest.xml中添加权限
// 使用存储权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
二、开发步骤
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (!allPermissionsGranted()) { getRuntimePermissions(); } } private boolean allPermissionsGranted() { for (String permission : getRequiredPermissions()) { if (!isPermissionGranted(this, permission)) { return false; } } return true; } private void getRuntimePermissions() { List<String> allNeededPermissions = new ArrayList<>(); for (String permission : getRequiredPermissions()) { if (!isPermissionGranted(this, permission)) { allNeededPermissions.add(permission); } } if (!allNeededPermissions.isEmpty()) { ActivityCompat.requestPermissions( this, allNeededPermissions.toArray(new String[0]), PERMISSION_REQUESTS); } } private static boolean isPermissionGranted(Context context, String permission) { if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) { return true; } return false; } private String[] getRequiredPermissions() { try { PackageInfo info = this.getPackageManager() .getPackageInfo(this.getPackageName(), PackageManager.GET_PERMISSIONS); String[] ps = info.requestedPermissions; if (ps != null && ps.length > 0) { return ps; } else { return new String[0]; } } catch (RuntimeException e) { throw e; } catch (Exception e) { return new String[0]; } }
2 创建图片分割检测器
MLImageSegmentationSetting setting = new MLImageSegmentationSetting.Factory() // 设置为人像分割 .setAnalyzerType(MLImageSegmentationSetting.BODY_SEG) .create(); this.analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);
3 通过android.graphics.Bitmap创建“MLFrame”对象用于分析器检测图片
MLFrame mlFrame = new MLFrame.Creator().setBitmap(this.originBitmap).create();
4 调用“asyncAnalyseFrame ”方法进行图像分割
// 创建一个task,处理图像分割检测器返回的结果。 Task<MLImageSegmentation> task = this.analyzer.asyncAnalyseFrame(mlFrame); // 异步处理图像分割检测器返回的结果。 task.addOnSuccessListener(new OnSuccessListener<MLImageSegmentation>() { @Override public void onSuccess(MLImageSegmentation mlImageSegmentationResults) {. if (mlImageSegmentationResults != null) { //获得从图片中分割出的人像前景图 foreground = mlImageSegmentationResults.getForeground(); preview.setImageBitmap(MainActivity.this.foreground); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { return; } });
5 更换图片背景
// 从相册中获取图片 backgroundBitmap = Utils.loadFromPath(this, id, targetedSize.first, targetedSize.second); BitmapDrawable drawable = new BitmapDrawable(backgroundBitmap); preview.setBackground(drawable); preview.setImageBitmap(this.foreground);
6 更换图片背景
MLFrame mlFrame = new MLFrame.Creator().setBitmap(this.originBitmap).create();
(demo演示视频如下)
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
大规模异构数据的线索列表进化之路
导读:「以客户为中心,技术为产品服务」是爱番番线索管家团队一贯遵循的原则。技术架构规划首先应该围绕业务诉求展开,用合理的技术赋能产品,产品在不断的演进中又对技术提出更高的标准和要求。作为爱番番PV最高的页面,本文将详细介绍线索列表如何从快速交付的刀耕火种原始状态,逐步走向“高可用、高质量、高体验“的成熟期。 全文9355字,预计阅读时间24分钟。 在后台系统中,列表是最常见的数据展示方式之一,它就像系统的水电煤一样平常,以至于你可能会问列表开发能有什么技术挑战呢? 一、列表应该提供什么能力? 列表页有三个基本模块: 搜索 搜索框(定向查找某条数据) 筛选项(预置搜索条件快速找到符合条件的结果) 数据呈现 表头 数据 分页器 操作项 操作按钮(对整行数据),比如线索列表的分配、打电话 修改数据(对某个字段),比如添加标签 列表承载着业务上的数据,列表的设计体验关乎用户对业务数据的处理和管理效率,最终的目标是为了能提高客户使用数据及决策的效率。 二、技术落地演进 随着爱番番产品的快速迭代与演进,线索列表也从快速交付的刀耕火种原始状态,逐步走向“高可用、高质量、高体验”的成熟期。下面将逐一介...
- 下一篇
如何处理大体积 XLSX/CSV/TXT 文件?
在开发过程中,可能会遇到这样的需求,我们需要从本地的 Excel 或 CSV 等文件中解析出信息,这些信息可能是考勤打卡记录,可能是日历信息,也可能是近期账单流水。但是它们共同的特点是数据多且繁杂,人工录入的工作量庞大容易出错,需要花费大量时间。那有没有什么方法能自动解析文件并获取有用信息呢? 当这个文件数据量也不是很多的时候,有很多前端工具可供选择。例如SheetJS,就提供了从Excel、CSV中解析出用信息的很多方法,十分方便。 当数据量只是几千条的程度的,选择的余地很多,但是一旦数据量级增加,处理就变得复杂。如果XLSX/CSV数据量达到了 100w+ 条,Office、WPS 想打开看一下,都会需要很长的时间。 那又该如何从这样大体积的Excel/CSV/TXT 中解析出数据呢? 背景 下面我们通过一个假设的需求,来讲述理解整个过程。假设我们需求是从本地 Excel、CSV、TXT(或者其他格式的)文件中解析出数据,并经过清洗后存入本地数据库文件中。但是这些文件体积可能是 5M、50M、500M 甚至更大。那么在浏览器环境下如何上传?Node 环境下应该如何解析? 首先,我们...
相关文章
文章评论
共有0条评论来说两句吧...