开发者学堂课程【达摩院视觉AI课:分割抠图功能讲解及演示】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/335/detail/3836
分割抠图功能讲解及演示
一、相关的基础概念
首先介绍图像相关的基础概念,其次会介绍我们视觉智能开放平台、图像分割接口的使用方法,最后介绍在我们的图像分割结果上进行二次加工的一些例子。
最常用的图像格式都是3通道的 BGR 格式,第一张图可以分为BGR 3个颜色分量。4通道图常见格式为PNG,区别于三通道图,它的背景除了人物以外的背景区域是半透明的状况,图像可视化边界可以支持不规则的一些边缘,三通道只能是矩形。
多出来的第四个通道,阿尔法通道则用来控制对应像素的透明程度,零表示全透,255表示不透。
如果阿尔法通道为全255,这张图视觉上就和3通道图没有差别。后面统称阿尔法通道为 master 。
在三通道图片的基础上融合对应的 master 图层,就可以得到抠图后的 PNG 图片,那我们平台的能力主要是预测图像主体的master 图层。
二、如何使用上述能力
首先进入阿里云官网:https:vision.aliyun.com/ 。并登录阿里云账号,在广场分割抠图内幕下找到自己需要的接口,这里以人体分割作为样例。
点击人体分割进入到试用界面。进入试用界面之后,可以先试用,满意后再开通服务,点击上传图片。
上传成功之后,点击发起调用。
右边是算法结果,对于结果的好坏,强烈建议大家在这里点击反馈,方便后续做进一步的优化。点击代码展示,这里展示的为抠图服务返回的json结果。
Imageurl 表示的就是刚才结果图的图片地址,点击帮助文档,这里有更多服务的详情介绍。
如何开通,点击免费开通,在这里选择需要开通的接口,然后点击立即购买,再点击确认付款,
然后会提示跳转到控制台。在控制台模块可以看到已经开发的能力,那么分割抠图模块相关的信息,我们也是可以看到的。
目前人体分割、商品分割和通用分割已经进入了商业化流程,如果需
要更高的QBS支持,可以点击这里进行购买。
三、开通对应的API 服务
回到上一级界面,这里有示例代码以及开通需要的 SDK ,这里需要提醒大家,我们仅支持 OSS 图片地址。
所以需要事先开通好 OSS 服务,并创建好相应的AK,具体操作方式可以在该界面进行跳转。点击python对应的SDK界面。
首先,需要安装阿里云SDK核心库。
pip install aliyun-python-sdk-core
其次,安装对应的分割接口。SDK。
pip install aliyun-python-sdk-imageseg
然后就可以开始写代码了。首先返回上一级目录。
选择 python 事例。代码进行复制,然后粘贴到对应的编辑器中。这里是已经事先编辑好的,需要修改三个部分,一个是 AK 里面的 keyId ,另外一个是 AK 里面 secret ,
client=AcsClient(accessKeyId,accessSecret, 'cn-shanghai')
还有一个是图片的地址。
图片地址演示:
这里需要图片必须存放在上海的oss bucket 里面。先打开一个 bucket ,新建完成并上传了一张图片,
点击详情复制。
然后粘贴到 url 地址处。点击运行。可以看到服务器返回的结果。基于服务器返回的josn 结果,解析后到的结果,图片url。以及把该 url 对应的图片写到本地的结果。
四、基于分割结果再加工的示例代码
接下来提供一些基于分割结果再加工的示例代码,我们来看一下示例代码的结构,一个是downloadData.sh 用来下载图片素材,另外一个是python代码用来展示如何进行合图。首先我们运行sh downloadData.sh 进行下载,图片下载完之后会出现一个date目录,下面有多素材,source.jpg 表示的是原始图片,viapi_mask.png 表示的是通过API平台调用返回的图片,
background.jbg表示要进行融合的背景图片,
在下载好图片之后,就可以运行脚本进行合图。
运行代码:python backGroundMergeDemo.py pic
Pic 表示的是图片合图,vid 表示的是视频合图。合图效果result.jpg 如下所示:
五、合图代码的基础逻辑
简单介绍一下合图代码的基础逻辑
def picture mergeBG(args):
assert (args.files is not None and len(args.files)>3),"parameters wrong, use -h for details!"
ofr_file=args.files[3] //存储合图后的文件地址
[sc_image, viari_image, bg_image] = [cv2.imread(img_file, cv2.IMREAD
_UNCHANGED) //第一个原始图片,第二个 viari 返回的 PNG 图片,第三个参数是带融合的背景图片。
for img file in args.files[0:3]]
assert (sc image is not None and viapi image is not None and
bg image is not None), "read image files error!"
h,wc=sc image.shape
viapi image = cv2.resize(viapi image, (w, h)) bg image=cv2.resize(bg image, (w, h)) //将PNG 图片和背景图片进行resize,保证和source 图片一致。
if len(viapi image.shape)==2:
mask=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("invalid image mask!")
//提取 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 + image
of image = np.clip(of image 0 255) cv2.imwrite(of file, of image)
//此处为核心代码,他是上一个公司的一个变种,可以减少一次float计算。然后把图片写回到输出文件地址,本次视频教程到此结束。