Spaces:
Running
Running
from fastapi import FastAPI, UploadFile, Form | |
import onnxruntime | |
from src.face_judgement_align import IDphotos_create | |
from src.layoutCreate import generate_layout_photo, generate_layout_image | |
from hivisionai.hycv.vision import add_background | |
import base64 | |
import numpy as np | |
import cv2 | |
import ast | |
app = FastAPI() | |
# 将图像转换为Base64编码 | |
def numpy_2_base64(img: np.ndarray): | |
retval, buffer = cv2.imencode('.png', img) | |
base64_image = base64.b64encode(buffer).decode('utf-8') | |
return base64_image | |
# 证件照智能制作接口 | |
async def idphoto_inference(input_image: UploadFile, | |
size: str = Form(...), | |
head_measure_ratio=0.2, | |
head_height_ratio=0.45, | |
top_distance_max=0.12, | |
top_distance_min=0.10): | |
image_bytes = await input_image.read() | |
nparr = np.frombuffer(image_bytes, np.uint8) | |
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) | |
# 将字符串转为元组 | |
size = ast.literal_eval(size) | |
result_image_hd, result_image_standard, typography_arr, typography_rotate, \ | |
_, _, _, _, status = IDphotos_create(img, | |
size=size, | |
head_measure_ratio=head_measure_ratio, | |
head_height_ratio=head_height_ratio, | |
align=False, | |
beauty=False, | |
fd68=None, | |
human_sess=sess, | |
IS_DEBUG=False, | |
top_distance_max=top_distance_max, | |
top_distance_min=top_distance_min) | |
# 如果检测到人脸数量不等于1(照片无人脸 or 多人脸) | |
if status == 0: | |
result_messgae = { | |
"status": False | |
} | |
# 如果检测到人脸数量等于1, 则返回标准证和高清照结果(png 4通道图像) | |
else: | |
result_messgae = { | |
"status": True, | |
"img_output_standard": numpy_2_base64(result_image_standard), | |
"img_output_standard_hd": numpy_2_base64(result_image_hd), | |
} | |
return result_messgae | |
# 透明图像添加纯色背景接口 | |
async def photo_add_background(input_image: UploadFile, | |
color: str = Form(...)): | |
# 读取图像 | |
image_bytes = await input_image.read() | |
nparr = np.frombuffer(image_bytes, np.uint8) | |
img = cv2.imdecode(nparr, cv2.IMREAD_UNCHANGED) | |
# 将字符串转为元组 | |
color = ast.literal_eval(color) | |
# 将元祖的0和2号数字交换 | |
color = (color[2], color[1], color[0]) | |
# try: | |
result_messgae = { | |
"status": True, | |
"image": numpy_2_base64(add_background(img, bgr=color)), | |
} | |
# except Exception as e: | |
# print(e) | |
# result_messgae = { | |
# "status": False, | |
# "error": e | |
# } | |
return result_messgae | |
# 六寸排版照生成接口 | |
async def generate_layout_photos(input_image: UploadFile, size: str = Form(...)): | |
try: | |
image_bytes = await input_image.read() | |
nparr = np.frombuffer(image_bytes, np.uint8) | |
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) | |
size = ast.literal_eval(size) | |
typography_arr, typography_rotate = generate_layout_photo(input_height=size[0], | |
input_width=size[1]) | |
result_layout_image = generate_layout_image(img, typography_arr, | |
typography_rotate, | |
height=size[0], | |
width=size[1]) | |
result_messgae = { | |
"status": True, | |
"image": numpy_2_base64(result_layout_image), | |
} | |
except Exception as e: | |
result_messgae = { | |
"status": False, | |
} | |
return result_messgae | |
if __name__ == "__main__": | |
import uvicorn | |
# 加载权重文件 | |
HY_HUMAN_MATTING_WEIGHTS_PATH = "./hivision_modnet.onnx" | |
sess = onnxruntime.InferenceSession(HY_HUMAN_MATTING_WEIGHTS_PATH) | |
# 在8080端口运行推理服务 | |
uvicorn.run(app, host="0.0.0.0", port=8080) | |