⛳️ 需求来源
好友 A:橡皮擦,行代现键可否提供网页,码实上传带人像的抠图图片,然后可以直接抠图,收费最好直接生成 PNG 图片下载。应用
橡皮擦:每天需要调用多少次?
好友 A:大概 100 次吧。行代现键
橡皮擦:妥了,码实给你写个免费的抠图吧。
本案例的收费实战需求是对图片进行抠图,每日请求量为 100,应用来源依旧是行代现键好友求助,既然日请求量不大,码实那某智能云的抠图人像分隔接口就可以使用了,申请之后,收费其赠送了 10000 次,应用每秒限制 2 次请求,足够使用。
从官方下载 Python API SDK 之后,得到下图所示目录:
然后进入该目录执行下述命令安装 SDK
python setup.py buildpython setup.py install
安装成功之后就可以通过 pip list
查看相关数据。
接下来需要创建一个 AipBodyAnalysis
,该对象是后续处理人像分析的核心对象。
新建 show_people.py
文件,输入如下代码:
from aip import AipBodyAnalysis""" 你的 APPID AK SK """APP_ID = '你的 App ID'API_KEY = '你的 Api Key'SECRET_KEY = '你的 Secret Key'client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)
其中 App ID
,Api Key
,Secret Key
都需要提前在平台方申请使用。
接下来就可以使用人像分隔主体函数了,代码如下:
client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)""" 读取图片 """def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read()image = get_file_content('./demo.png')""" 调用人像分割 """ret = client.bodySeg(image)print(ret)
代码用到的测试图为:
运行后提示 ModuleNotFoundError: No module named 'chardet'
,使用 pip install chardet
安装缺少模块。
上述 client.bodySeg(image)
函数的参数如下所示:
image
:图像数据,base64 编码,要求 base64 编码后大小不超过 4M,最短边至少 15px,最长边最大 4096px,支持 jpg/png/bmp 格式;type
:可以通过设置 type 参数,自主设置返回哪些结果图,避免造成带宽的浪费- 可选值说明:
- labelmap - 二值图像,需二次处理方能查看分割效果
- scoremap - 人像前景灰度图
- foreground - 人像前景抠图,透明背景
- type 参数值可以是可选值的组合,用逗号分隔;如果无此参数默认输出全部 3 类结果图
- 可选值说明:
基于上述配置,在方法调用时添加参数,获取人像前景抠图。
""" 如果有可选参数 """options = { }options["type"] = "foreground"""" 带参数调用人像分割 """ret = client.bodySeg(image, options)print(ret)
返回参数列表如下所示:
labelmap
:分割结果图片,base64 编码之后的二值图像,需二次处理方能查看分割效果scoremap
:分割后人像前景的 scoremap,归一到 0-255,不用进行二次处理,直接解码保存图片即可。Base64 编码后的灰度图文件,图片中每个像素点的灰度值 = 置信度 * 255,置信度为原图对应像素点位于人体轮廓内的置信度,取值范围[0, 1]foreground
:分割后的人像前景抠图,透明背景,Base64 编码后的 png 格式图片,不用进行二次处理,直接解码保存图片即可。将置信度大于 0.5 的像素抠出来,并通过 image matting 技术消除锯齿person_num
:检测到的人体框数目person_info
:人体框信息
此时输出 person_num
就可以获得人像数量,测试代码如下所示。
ret = client.bodySeg(image, options)print(ret["person_num"]) # 输出 1
接下来直接保存前景抠图,导入 base64 模块,直接解码保存即可。
""" 带参数调用人像分割 """ret = client.bodySeg(image, options)data = ret["foreground"]data = base64.b64decode(data)# 生成图片with open("./fore.png",'wb') as f: f.write(data)
最后在使用一张复杂些的图片进行测试,背景去除的非常干净。
📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 713 篇原创博客
从订购之日起,案例 5 年内保证更新
- ⭐️ Python 爬虫 120,点击订购 ⭐️
- ⭐️ 爬虫 100 例教程,点击订购 ⭐️