gordonchan's picture
Upload 49 files
c5819e3 verified
import requests, os
import json
import hashlib, base64, hmac
import sys
import oss2
from aliyunsdkimageseg.request.v20191230.SegmentBodyRequest import SegmentBodyRequest
from aliyunsdkimageseg.request.v20191230.SegmentSkinRequest import SegmentSkinRequest
from aliyunsdkfacebody.request.v20191230.DetectFaceRequest import DetectFaceRequest
from aliyunsdkcore.client import AcsClient
# 头像抠图参数配置
def params_of_head(photo_base64, photo_type):
print ('测试头像抠图接口 ...')
host = 'https://person.market.alicloudapi.com'
uri = '/segment/person/headrgba' # 头像抠图返回透明PNG图
# uri = '/segment/person/head' # 头像抠图返回alpha图
# uri = '/segment/person/headborder' # 头像抠图返回带白边的透明PNG图
return host, uri, {
'photo': photo_base64,
'type': photo_type,
'face_required': 0, # 可选,检测是否必须带有人脸才进行抠图处理,0为检测,1为不检测,默认为0
'border_ratio': 0.3, # 可选,仅带白边接口可用,
# 在头像边缘增加白边(或者其他颜色)宽度,取值为0-0.5,
# 这个宽度是相对于图片宽度和高度最大值的比例,
# 比如原图尺寸为640x480,border_ratio为0.2,
# 则添加的白边的宽度为:max(640,480) * 0.2 = 96个像素
'margin_color': '#ff0000' # 可选,仅带白边接口可用,
# 在头像边缘增加边框的颜色,默认为白色
}
# 头像抠图API
def wanxing_get_head_api(file_name='/home/parallels/Desktop/change_cloth/input_image/03.jpg',
output_path="./head.png",
app_key='204014294',
secret="pI2uo7AhCFjnaZWYrCCAEjmsZJbK6vzy",
stage='RELEASE'):
info = sys.version_info
if info[0] < 3:
is_python3 = False
else:
is_python3 = True
with open(file_name, 'rb') as fp:
photo_base64 = base64.b64encode(fp.read())
if is_python3:
photo_base64 = photo_base64.decode('utf8')
_, photo_type = os.path.splitext(file_name)
photo_type = photo_type.lstrip('.')
# print(photo_type)
# print(photo_base64)
# host, uri, body_json = params_of_portrait_matting(photo_base64, photo_type)
# host, uri, body_json = params_of_object_matting(photo_base64)
# host, uri, body_json = params_of_idphoto(photo_base64, photo_type)
host, uri, body_json = params_of_head(photo_base64, photo_type)
# host, uri, body_json = params_of_crop(photo_base64)
api = host + uri
body = json.dumps(body_json)
md5lib = hashlib.md5()
if is_python3:
md5lib.update(body.encode('utf8'))
else:
md5lib.update(body)
body_md5 = md5lib.digest()
body_md5 = base64.b64encode(body_md5)
if is_python3:
body_md5 = body_md5.decode('utf8')
method = 'POST'
accept = 'application/json'
content_type = 'application/octet-stream; charset=utf-8'
date_str = ''
headers = ''
string_to_sign = method + '\n' \
+ accept + '\n' \
+ body_md5 + '\n' \
+ content_type + '\n' \
+ date_str + '\n' \
+ headers \
+ uri
if is_python3:
signed = hmac.new(secret.encode('utf8'),
string_to_sign.encode('utf8'),
digestmod=hashlib.sha256).digest()
else:
signed = hmac.new(secret, string_to_sign, digestmod=hashlib.sha256).digest()
signed = base64.b64encode(signed)
if is_python3:
signed = signed.decode('utf8')
headers = {
'Accept': accept,
'Content-MD5': body_md5,
'Content-Type': content_type,
'X-Ca-Key': app_key,
'X-Ca-Stage': stage,
'X-Ca-Signature': signed
}
#print signed
resp = requests.post(api, data=body, headers=headers)
# for u,v in resp.headers.items():
# print(u+": " + v)
try:
res = resp.content
res = json.loads(res)
# print ('res:', res)
if str(res['status']) == '0':
# print ('成功!')
file_object = requests.get(res["data"]["result"])
# print(file_object)
with open(output_path, 'wb') as local_file:
local_file.write(file_object.content)
# image = cv2.imread("./test_head.png", -1)
# return image
else:
pass
# print ('失败!')
except:
print('failed parse:', resp)
# 阿里云抠图API
def aliyun_human_matting_api(input_path, output_path, type="human"):
auth = oss2.Auth('LTAI5tP2NxdzSFfpKYxZFCuJ', 'VzbGdUbRawuMAitekP3ORfrw0i3NEX')
bucket = oss2.Bucket(auth, 'https://oss-cn-shanghai.aliyuncs.com', 'huanying-api')
key = os.path.basename(input_path)
origin_image = input_path
try:
bucket.put_object_from_file(key, origin_image, headers={"Connection":"close"})
except Exception as e:
print(e)
url = bucket.sign_url('GET', key, 10 * 60)
client = AcsClient('LTAI5tP2NxdzSFfpKYxZFCuJ', 'VzbGdUbRawuMAitekP3ORfrw0i3NEX', 'cn-shanghai')
if type == "human":
request = SegmentBodyRequest()
elif type == "skin":
request = SegmentSkinRequest()
request.set_accept_format('json')
request.set_ImageURL(url)
try:
response = client.do_action_with_exception(request)
response_dict = eval(str(response, encoding='utf-8'))
if type == "human":
output_url = response_dict['Data']['ImageURL']
elif type == "skin":
output_url = response_dict['Data']['Elements'][0]['URL']
file_object = requests.get(output_url)
with open(output_path, 'wb') as local_file:
local_file.write(file_object.content)
bucket.delete_object(key)
except Exception as e:
print(e)
response = client.do_action_with_exception(request)
response_dict = eval(str(response, encoding='utf-8'))
print(response_dict)
output_url = response_dict['Data']['ImageURL']
file_object = requests.get(output_url)
with open(output_path, 'wb') as local_file:
local_file.write(file_object.content)
bucket.delete_object(key)
# 阿里云人脸检测API
def aliyun_face_detect_api(input_path, type="human"):
auth = oss2.Auth('LTAI5tP2NxdzSFfpKYxZFCuJ', 'VzbGdUbRawuMAitekP3ORfrw0i3NEX')
bucket = oss2.Bucket(auth, 'https://oss-cn-shanghai.aliyuncs.com', 'huanying-api')
key = os.path.basename(input_path)
origin_image = input_path
try:
bucket.put_object_from_file(key, origin_image, headers={"Connection":"close"})
except Exception as e:
print(e)
url = bucket.sign_url('GET', key, 10 * 60)
client = AcsClient('LTAI5tP2NxdzSFfpKYxZFCuJ', 'VzbGdUbRawuMAitekP3ORfrw0i3NEX', 'cn-shanghai')
if type == "human":
request = DetectFaceRequest()
request.set_accept_format('json')
request.set_ImageURL(url)
try:
response = client.do_action_with_exception(request)
response_json = json.loads(str(response, encoding='utf-8'))
print(response_json["Data"]["PoseList"][-1])
bucket.delete_object(key)
return response_json["Data"]["PoseList"][-1]
except Exception as e:
print(e)
if __name__ == "__main__":
wanxing_get_head_api()