其他
用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
The following article is from 数据分析与统计学之美 Author 黄伟呢
来源 | 数据分析与统计学之美
效果展示
原图和动漫图:
原理分析
这里首先给大家提供下面的一个网址,这就是百度AI开放平台关于人像动漫化特效的网页:http://suo.im/64FNvD。
Access_token参数的获取
获取 Access_token 参数,需要使用百度的鉴权认证机制。下面就是鉴权认证机制的网址,在该网页上,详细介绍了我们怎么获取自己的 Access_token 参数。
寻找API Key和Secret Key
首先登陆百度智能云的网址。这个网址需要我们扫码登陆,我们按照提示进行登陆即可。
代码展示
1)单纯的人像动漫化,不为人像戴口罩
# 这个函数的操作是为了获取access_token参数
def get_access_token():
url = 'https://aip.baidubce.com/oauth/2.0/token'
data = {
'grant_type': 'client_credentials', # 固定值
'client_id': '3j8EWb6rgg..SPY2X693LBy', # 在开放平台注册后所建应用的API Key
'client_secret': 'Px9KZuU0Gl...jTKktoCopnIWEiF57gf' # 所建应用的Secret Key
}
res = requests.post(url, data=data)
res = res.json()
#print(res)
access_token = res['access_token']
return access_token
# 下面的代码就是API文档中的代码,直接搬过来使用即可。
request_url = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime"
f = open('zhao.jpg', 'rb') # 二进制方式打开图片文件
img = base64.b64encode(f.read()) # 图像转为base64的格式,这是百度API文档中要求的
params = {"image":img}
access_token = '24.11731cd1f0...9f9b3a930f917f3681b.2592000.1596894747.282335-21221990'
request_url = request_url + "?access_token=" + get_access_token()
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
res = response.json()
# 前面我们讲述了这个请求返回的是一个字典,其中一个键就是image,代表的是处理后的图像信息。
# 将这个图像信息写入,得到最终的效果图。
if res:
f = open("kouzhao4.jpg", 'wb')
after_img = res['image']
after_img = base64.b64decode(after_img)
f.write(after_img)
f.close()
2)人像动漫化,并为人像戴口罩
# 这个函数的操作是为了获取access_token参数
def get_access_token():
url = 'https://aip.baidubce.com/oauth/2.0/token'
data = {
'grant_type': 'client_credentials', # 固定值
'client_id': '3j8EWb6rgg...SPY2X693LBy', # 在开放平台注册后所建应用的API Key
'client_secret': 'Px9KZuU0Gl...jTKktoCopnIWEiF57gf' # 所建应用的Secret Key
}
res = requests.post(url, data=data)
res = res.json()
#print(res)
access_token = res['access_token']
return access_token
request_url = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime"
# 二进制方式打开图片文件
f = open('zhao.jpg', 'rb')
img = base64.b64encode(f.read())
# 注意:这里就是多了type参数和mask_id参数,都是在源文档中可以查看的参数。
# type的值为anime或者anime_mask。前者生成二次元动漫图,后者生成戴口罩的二次元动漫人像。
# 1~8之间的整数,用于指定所使用的口罩的编码。大家可以自行下去尝试。
params = {"image":img,"type":'anime_mask',"mask_id":"2"}
access_token = '24.11731cd1f0...9f9b3a930f917f3681b.2592000.1596894747.282335-21221990'
request_url = request_url + "?access_token=" + get_access_token()
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
res = response.json()
# print(res)
if res:
f = open("kouzhao5.jpg", 'wb')
after_img = res['image']
after_img = base64.b64decode(after_img)
f.write(after_img)
f.close()
更多精彩推荐
☞我的程序跑了 60 多小时,就是为了让你看一眼 JDK 的 BUG 导致的内存泄漏