diff --git a/README.md b/README.md index 20815e81..157d8c78 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,7 @@ python app.py 输入 1 张照片,获得 1 张标准证件照和 1 张高清证件照的 4 通道透明 png ```python -python inference.py -i demo/images/test.jpg -o ./idphoto.png --height 413 --width 295 +python inference.py -i demo/images/test0.jpg -o ./idphoto.png --height 413 --width 295 ``` ## 2. 人像抠图 @@ -199,7 +199,7 @@ python inference.py -i demo/images/test.jpg -o ./idphoto.png --height 413 --widt 输入 1 张照片,获得 1张 4 通道透明 png ```python -python inference.py -t human_matting -i demo/images/test.jpg -o ./idphoto_matting.png --matting_model hivision_modnet +python inference.py -t human_matting -i demo/images/test0.jpg -o ./idphoto_matting.png --matting_model hivision_modnet ``` ## 3. 透明图增加底色 @@ -218,6 +218,15 @@ python inference.py -t add_background -i ./idphoto.png -o ./idphoto_ab.jpg -c 4 python inference.py -t generate_layout_photos -i ./idphoto_ab.jpg -o ./idphoto_layout.jpg --height 413 --width 295 -k 200 ``` +## 5. 证件照裁剪 + +输入 1 张 4 通道照片(抠图好的图像),获得 1 张标准证件照和 1 张高清证件照的 4 通道透明 png + +```python +python inference.py -t idphoto_crop -i ./idphoto_matting.png -o ./idphoto_crop.png --height 413 --width 295 +``` + +
# ⚡️ 部署 API 服务 diff --git a/deploy_api.py b/deploy_api.py index b05e1bda..c2f9054a 100644 --- a/deploy_api.py +++ b/deploy_api.py @@ -252,6 +252,54 @@ async def set_kb( return result_messgae +# 证件照智能裁剪接口 +@app.post("/idphoto_crop") +async def idphoto_crop_inference( + input_image: UploadFile, + height: int = Form(413), + width: int = Form(295), + face_detect_model: str = Form("mtcnn"), + hd: bool = Form(True), + head_measure_ratio: float = 0.2, + head_height_ratio: float = 0.45, + top_distance_max: float = 0.12, + top_distance_min: float = 0.10, +): + + image_bytes = await input_image.read() + nparr = np.frombuffer(image_bytes, np.uint8) + img = cv2.imdecode(nparr, cv2.IMREAD_UNCHANGED) # 读取图像(4通道) + + # ------------------- 选择抠图与人脸检测模型 ------------------- + choose_handler(creator, face_detect_option=face_detect_model) + + # 将字符串转为元组 + size = (int(height), int(width)) + try: + result = creator( + img, + size=size, + head_measure_ratio=head_measure_ratio, + head_height_ratio=head_height_ratio, + head_top_range=(top_distance_max, top_distance_min), + crop_only=True, + ) + except FaceError: + result_message = {"status": False} + # 如果检测到人脸数量等于1, 则返回标准证和高清照结果(png 4通道图像) + else: + result_message = { + "status": True, + "image_base64_standard": numpy_2_base64(result.standard), + } + + # 如果hd为True, 则增加高清照结果(png 4通道图像) + if hd: + result_message["image_base64_hd"] = numpy_2_base64(result.hd) + + return result_message + + if __name__ == "__main__": import uvicorn diff --git a/docs/api_CN.md b/docs/api_CN.md index b6c4a5b9..8963d847 100644 --- a/docs/api_CN.md +++ b/docs/api_CN.md @@ -42,19 +42,19 @@ python deploy_api.py 接口名:`add_background` -`添加背景色`接口的逻辑是发送一张 RGBA 图像,根据`color`添加背景色,合成一张 JPG 图像。 +`添加背景色`接口的逻辑是接收一张 RGBA 图像(透明图),根据`color`添加背景色,合成一张 JPG 图像。 ### 3.生成六寸排版照 接口名:`generate_layout_photos` -`生成六寸排版照`接口的逻辑是发送一张 RGB 图像(一般为添加背景色之后的证件照),根据`size`进行照片排布,然后生成一张六寸排版照。 +`生成六寸排版照`接口的逻辑是接收一张 RGB 图像(一般为添加背景色之后的证件照),根据`size`进行照片排布,然后生成一张六寸排版照。 ### 4.人像抠图 接口名:`human_matting` -`人像抠图`接口的逻辑是发送一张 RGB 图像,输出一张标准抠图人像照和高清抠图人像照(无任何背景填充)。 +`人像抠图`接口的逻辑是接收一张 RGB 图像,输出一张标准抠图人像照和高清抠图人像照(无任何背景填充)。 ### 5.图像加水印 @@ -69,6 +69,12 @@ python deploy_api.py `设置图像KB大小`接口的功能是接收一张图像和目标文件大小(以KB为单位),如果设置的KB值小于原文件,则调整压缩率;如果设置的KB值大于源文件,则通过给文件头添加信息的方式调大KB值,目标是让图像的最终大小与设置的KB值一致。 +### 7.证件照裁切 + +接口名:`idphoto_crop` + +`证件照裁切`接口的功能是接收一张 RBGA 图像(透明图),输出一张标准证件照和一张高清证件照。 +
## cURL 请求示例 @@ -135,6 +141,18 @@ curl -X 'POST' \ -F 'kb=50' ``` +### 7. 证件照裁切 +```bash +curl -X 'POST' \ + 'http://127.0.0.1:8080/idphoto_crop?head_measure_ratio=0.2&head_height_ratio=0.45&top_distance_max=0.12&top_distance_min=0.1' \ + -H 'accept: application/json' \ + -H 'Content-Type: multipart/form-data' \ + -F 'input_image=@idphoto_matting.png;type=image/png' \ + -F 'height=413' \ + -F 'width=295' \ + -F 'face_detect_model=mtcnn' \ + -F 'hd=true' +```
@@ -236,7 +254,8 @@ else: ``` ### 6. 设置图像KB大小 -```bash + +```python import requests # 设置请求的 URL @@ -259,6 +278,44 @@ else: print(f"Request failed with status code {response.status_code}: {response.text}") ``` +### 7. 证件照裁切 + +```python +import requests + +# 设置请求的 URL +url = "http://127.0.0.1:8080/idphoto_crop" + +# 设置请求参数 +params = { + "head_measure_ratio": 0.2, + "head_height_ratio": 0.45, + "top_distance_max": 0.12, + "top_distance_min": 0.1, +} + +# 设置文件和其他表单数据 +input_image_path = "idphoto_matting.png" +files = {"input_image": ("idphoto_matting.png", open(input_image_path, "rb"), "image/png")} +data = { + "height": 413, + "width": 295, + "face_detect_model": "mtcnn", + "hd": "true" +} + +# 发送 POST 请求 +response = requests.post(url, params=params, files=files, data=data) + +# 检查响应 +if response.ok: + # 输出响应内容 + print(response.json()) +else: + # 输出错误信息 + print(f"Request failed with status code {response.status_code}: {response.text}") +``` +
## Java 请求示例 diff --git a/inference.py b/inference.py index 80596dab..8021b331 100644 --- a/inference.py +++ b/inference.py @@ -19,6 +19,7 @@ "add_background", "generate_layout_photos", "watermark", + "idphoto_crop", ] MATTING_MODEL = [ "hivision_modnet", @@ -149,3 +150,20 @@ ) else: cv2.imwrite(args.output_image_dir, result_layout_image) + +# 如果模式是证件照裁切 +elif args.type == "idphoto_crop": + # 将字符串转为元组 + size = (int(args.height), int(args.width)) + try: + result = creator(input_image, size=size, crop_only=True) + except FaceError: + print("人脸数量不等于 1,请上传单张人脸的图像。") + else: + # 保存标准照 + cv2.imwrite(args.output_image_dir, result.standard) + + # 保存高清照 + file_name, file_extension = os.path.splitext(args.output_image_dir) + new_file_name = file_name + "_hd" + file_extension + cv2.imwrite(new_file_name, result.hd)