Skip to content

Commit

Permalink
feat: idphoto crop api (#109)
Browse files Browse the repository at this point in the history
* only crop api

* Update api_CN.md
  • Loading branch information
Zeyi-Lin authored Sep 11, 2024
1 parent 0712b78 commit 530481b
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 6 deletions.
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,15 +191,15 @@ 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. 人像抠图

输入 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. 透明图增加底色
Expand All @@ -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
```


<br>

# ⚡️ 部署 API 服务
Expand Down
48 changes: 48 additions & 0 deletions deploy_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
65 changes: 61 additions & 4 deletions docs/api_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.图像加水印

Expand All @@ -69,6 +69,12 @@ python deploy_api.py

`设置图像KB大小`接口的功能是接收一张图像和目标文件大小(以KB为单位),如果设置的KB值小于原文件,则调整压缩率;如果设置的KB值大于源文件,则通过给文件头添加信息的方式调大KB值,目标是让图像的最终大小与设置的KB值一致。

### 7.证件照裁切

接口名:`idphoto_crop`

`证件照裁切`接口的功能是接收一张 RBGA 图像(透明图),输出一张标准证件照和一张高清证件照。

<br>

## cURL 请求示例
Expand Down Expand Up @@ -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'
```

<br>

Expand Down Expand Up @@ -236,7 +254,8 @@ else:
```

### 6. 设置图像KB大小
```bash

```python
import requests

# 设置请求的 URL
Expand All @@ -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}")
```

<br>

## Java 请求示例
Expand Down
18 changes: 18 additions & 0 deletions inference.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"add_background",
"generate_layout_photos",
"watermark",
"idphoto_crop",
]
MATTING_MODEL = [
"hivision_modnet",
Expand Down Expand Up @@ -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)

0 comments on commit 530481b

Please sign in to comment.