开发者学堂课程【达摩院视觉 AI 精品课:第二节课——【分割抠图功能讲解及演示】】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/912/detail/14419
第二节课——【分割抠图功能讲解及演示】
内容介绍:
一、一些图像相关的基础概念
二、智能视觉开放平台图像分割的使用方法
三、在图像分割结果上进行二次加工的例子
一、一些图像相关的基础概念
最常用的图像格式一般是3通道的 BGR 格式,即一张图可以分为B(蓝)、G(绿)、R(红)三个颜色分量;
4通道图片格式为 PNG,区别于3通道图可以看到除了它的人物以外的背景区域是半透明的状态,那么图像可视化的边界就可以支持一些不规则的边缘,而3通道只能是矩形的。
多出来的4通道 alpha 通道则用来控制对应像素的透明程度:0表示全透,255表示不透。
如果 alpha 通道为全255,那么这张图片视觉上和3通道就没有差别了(后面统称alpha 通道为 mask)。在3通道图片的基础上,融合对应的 mask 图层,就可以得到抠图后的 png 图片,平台的能力主要是用来预测图片主体的 mask 图层。接下来介绍如何使用该能力。
二、智能视觉开放平台图像分割的使用方法
首先进入智能视觉开放平台官网:http://vision.aliyun.com/并登录阿里云账号,在能力广场-分割抠图类目下找到自己需要的接口。这里以人体分割作为样例,进入到试用界面,可以先试用,满意后再开通服务。
点击上传图片,上传成功后点击发起调用,可以看到右边就是算法结果。对于结果的满意程度这里强烈建议点击反馈,方便购物做进一步的优化。
点击代码展示,这里展示的为抠图服务反回的阶层结果,ImageURL 表示的就是刚才结果图的图片地址了。点击帮助文档,这里有更多服务的详情介绍。
下一步讲述如果免费开通:点击免费开通,选择需要开通的接口,点击立即购买,再点击确认付款。点击提示到跳转控制台,在控制台可以看到已经开通的能力。在分割抠图模块的相关信息也是可以看到的,如果需要更高的 QPS 支持,可以点击这里进行购买
接下来看如何开通对应的 API 服务:回到上一级界面往下滑,这里有示例代码以及开通需要接入的 SDK。
提醒在使用 SDK 前需要提前开通 OSS 服务和创建 AccessKey。然后点击 Python 对应的 SDK 界面,
首先需要安装阿里云 SDK 核心库:
pip install aliyun-python-sdk-core,其次再安装对应的分割接口:pip install aliyun-python-sdk-imageseg,然后返回上一级目录,选择 Python 示例,复制代码并粘贴在对应的编辑器中。
图片地址必须存放在 shanghai 的 oss-viapi 里面,点击运行,可以看到服务器反回的结果及服务器反回的解析后到的图片 url,以及把该 url 对应的图片写到本地的结果。
url = "https://viapi-data-shanghai.oss-cn-shanghai,aliyuncs.com/ppt source
client = AcsClient (accessKeyId, accessSeqret, 'cn-shanghai')
request = SegmentBodyRequest()
request.set_accept_format('json')
request.set ImageURL (url)
response = client.do_action_with_exception(request)
resultJson = str(response,eneoding='utf-8')
print(resultJson)
import json
resultUrl = json.loads (resultJson)["Data"]["ImageURL"]
print(resultUrl)
输出结果为:
Process finished with exit code 0
三、在图像分割结果上进行二次加工的例子
示例代码的结构:downloadDate.sh(用来下载图片素材),backgroundMergeDemo.py(用来展示如何抠图)。首先运行downloadDate.sh,运行脚本进行和图,(pic表示的是图片和图,vid表示的是视频和图)出现result.jpg就是和图后的结果。
和图代码的基础逻辑:
首先传进来有4个参数:of_file = arge.files,sc_image, viapi_image,bg_image。然后对 png 图片和背景图片进行 resize,保证和背景图片的尺寸是一致的。
接着提取一下 mask 通道,对于4通道图直接把 alpha 通道提取出来;对于有些可能是把 alpha 通道转换成了一个灰度图,那么这一块也会做一个转换,然后对图像再进行一个规划到0到1,然后再按照之前提到的前景*alpha+背景*(1-alpha)的公式进行计算。
核心代码主要是是:of_image = (sc_image-bg_image)*mask + bg_image
。它是上一个公式的变种可以减少一次 floa t计算。然后把图片写回到输出文件地址,本次教程结束。
if len(viapi_image.shape)
==
2:
ma
s
k = viapi_image[: :
np.newaxis]
if viapi_image.shape[2] == 4:
mask = viapi_ image[: :
3:4]
elif viapi_image.shape[2] == 3:
mask = viapi_image[: : 0:1]
else:
raise Exception( invialld image mask!")
mask = mask/255.0
sc_image = sc_image.astype (np.float)
bg_image = bg_image.astype (np .float)
of image = (sc image-bg image) *mask + bg image