diff --git a/app.py b/app.py
index a318e525..fc2880bf 100644
--- a/app.py
+++ b/app.py
@@ -52,7 +52,7 @@
demo.launch(
server_name=args.host,
server_port=args.port,
- show_api=False,
favicon_path=os.path.join(root_dir, "assets/hivision_logo.png"),
root_path=args.root_path,
+ show_api=False,
)
diff --git a/assets/title.md b/assets/title.md
index 78b5cfdc..1c197c9d 100644
--- a/assets/title.md
+++ b/assets/title.md
@@ -1,11 +1,10 @@
-
-
+
\ No newline at end of file
+
+
diff --git a/demo/assets/color_list_CN.csv b/demo/assets/color_list_CN.csv
index 056ef425..76e411f6 100644
--- a/demo/assets/color_list_CN.csv
+++ b/demo/assets/color_list_CN.csv
@@ -3,4 +3,5 @@ Name,Hex
白色,ffffff
红色,d74532
黑色,000000
-深蓝色,4b6190
\ No newline at end of file
+深蓝色,4b6190
+浅灰色,f2f0f0
\ No newline at end of file
diff --git a/demo/assets/color_list_EN.csv b/demo/assets/color_list_EN.csv
index c8376beb..c31873af 100644
--- a/demo/assets/color_list_EN.csv
+++ b/demo/assets/color_list_EN.csv
@@ -3,4 +3,5 @@ Blue,628bce
White,ffffff
Red,d74532
Black,000000
-Dark Blue,4b6190
\ No newline at end of file
+Dark Blue,4b6190
+Light Gray,f2f0f0
\ No newline at end of file
diff --git a/demo/locals.py b/demo/locals.py
index b83439ce..400c7532 100644
--- a/demo/locals.py
+++ b/demo/locals.py
@@ -252,6 +252,14 @@
"label": "高清照",
},
},
+ "hd_photo_png": {
+ "en": {
+ "label": "Matting photo",
+ },
+ "zh": {
+ "label": "透明图",
+ },
+ },
"layout_photo": {
"en": {
"label": "Layout photo",
diff --git a/demo/processor.py b/demo/processor.py
index 499522ec..85fea304 100644
--- a/demo/processor.py
+++ b/demo/processor.py
@@ -137,6 +137,7 @@ def process(
return [
gr.update(value=None), # img_output_standard
gr.update(value=None), # img_output_standard_hd
+ gr.update(value=None), # img_output_standard_hd_png
gr.update(visible=False), # img_output_layout
gr.update( # notification
value=LOCALES["notification"][language]["face_error"],
@@ -147,6 +148,7 @@ def process(
else:
(result_image_standard, result_image_hd, _, _) = result
+ result_image_hd_png = np.uint8(result_image_hd)
if (
idphoto_json["render_mode"]
== LOCALES["render_mode"][language]["choices"][0]
@@ -272,6 +274,7 @@ def process(
return [
result_image_standard, # img_output_standard
result_image_hd, # img_output_standard_hd
+ result_image_hd_png, # img_output_standard_hd_png
result_layout_image, # img_output_layout
gr.update(visible=False), # notification
gr.update(visible=True, value=output_image_path), # file_download
@@ -280,6 +283,7 @@ def process(
return [
result_image_standard, # img_output_standard
result_image_hd, # img_output_standard_hd
+ result_image_hd_png, # img_output_standard_hd_png
result_layout_image, # img_output_layout
gr.update(visible=False), # notification
gr.update(visible=False), # file_download
diff --git a/demo/ui.py b/demo/ui.py
index 9c3462f9..49d6af54 100644
--- a/demo/ui.py
+++ b/demo/ui.py
@@ -22,29 +22,7 @@ def create_ui(
human_matting_models.remove(DEFAULT_HUMAN_MATTING_MODEL)
human_matting_models.insert(0, DEFAULT_HUMAN_MATTING_MODEL)
- css = """
- #col-left {
- margin: 0 auto;
- max-width: 430px;
- }
- #col-mid {
- margin: 0 auto;
- max-width: 430px;
- }
- #col-right {
- margin: 0 auto;
- max-width: 430px;
- }
- #col-showcase {
- margin: 0 auto;
- max-width: 1100px;
- }
- #button {
- color: blue;
- }
- """
-
- demo = gr.Blocks(title="HivisionIDPhotos", css=css)
+ demo = gr.Blocks(title="HivisionIDPhotos")
with demo:
gr.HTML(load_description(os.path.join(root_dir, "assets/title.md")))
@@ -237,7 +215,9 @@ def update_watermark_text_visibility(choice, language):
],
)
- img_but = gr.Button(LOCALES["button"][DEFAULT_LANG]["label"])
+ img_but = gr.Button(
+ LOCALES["button"][DEFAULT_LANG]["label"], elem_id="btn"
+ )
example_images = gr.Examples(
inputs=[img_input],
@@ -267,6 +247,13 @@ def update_watermark_text_visibility(choice, language):
height=350,
format="jpeg",
)
+ img_output_standard_hd_png = gr.Image(
+ label=LOCALES["hd_photo_png"][DEFAULT_LANG]["label"],
+ height=350,
+ format="png",
+ elem_id="hd_photo_png",
+ )
+
img_output_layout = gr.Image(
label=LOCALES["layout_photo"][DEFAULT_LANG]["label"],
height=350,
@@ -323,6 +310,9 @@ def change_language(language):
img_output_standard_hd: gr.update(
label=LOCALES["hd_photo"][language]["label"]
),
+ img_output_standard_hd_png: gr.update(
+ label=LOCALES["hd_photo_png"][language]["label"]
+ ),
img_output_layout: gr.update(
label=LOCALES["layout_photo"][language]["label"]
),
@@ -422,6 +412,7 @@ def change_image_kb(image_kb_option):
notification,
img_output_standard,
img_output_standard_hd,
+ img_output_standard_hd_png,
img_output_layout,
file_download,
head_measure_ratio_option,
@@ -484,6 +475,7 @@ def change_image_kb(image_kb_option):
outputs=[
img_output_standard,
img_output_standard_hd,
+ img_output_standard_hd_png,
img_output_layout,
notification,
file_download,
diff --git a/docs/api_CN.md b/docs/api_CN.md
index 96734c11..470d7469 100644
--- a/docs/api_CN.md
+++ b/docs/api_CN.md
@@ -1,6 +1,7 @@
# API Docs
-中文 | [English](api_EN.md)
+[English](api_EN.md) / 中文 / [日本語](api_JP.md) / [한국어](api_KO.md)
+
## 目录
diff --git a/docs/api_EN.md b/docs/api_EN.md
index 45215614..1d75308b 100644
--- a/docs/api_EN.md
+++ b/docs/api_EN.md
@@ -1,6 +1,7 @@
# API Docs
-[中文](api_CN.md) | English
+English / [中文](api_CN.md) / [日本語](api_JP.md) / [한국어](api_KO.md)
+
## Table of Contents
diff --git a/docs/api_JP.md b/docs/api_JP.md
new file mode 100644
index 00000000..2cc65710
--- /dev/null
+++ b/docs/api_JP.md
@@ -0,0 +1,513 @@
+# API Docs
+
+[English](api_EN.md) / [中文](api_CN.md) / 日本語 / [한국어](api_KO.md)
+
+## 目次
+
+- [始める前に:バックエンドサービスを起動する](#始める前にバックエンドサービスを起動する)
+- [インターフェース機能説明](#インターフェース機能説明)
+- [cURL リクエスト例](#curl-リクエスト例)
+- [Python リクエスト例](#python-リクエスト例)
+ - [Python Requests リクエスト方法](#1️⃣-python-requests-リクエスト方法)
+ - [Python スクリプトリクエスト方法](#2️⃣-python-スクリプトリクエスト方法)
+- [Java リクエスト例](#java-リクエスト例)
+- [Javascript リクエスト例](#javascript-リクエスト例)
+
+## 始める前に:バックエンドサービスを起動する
+
+API をリクエストする前に、バックエンドサービスを実行してください。
+
+```bash
+python deploy_api.py
+```
+
+
+
+## インターフェース機能説明
+
+### 1.証明写真を生成する(透明な背景)
+
+インターフェース名:`idphoto`
+
+`証明写真を生成する`インターフェースのロジックは、RGB画像を送信し、標準の証明写真と高解像度の証明写真を出力します:
+
+- **高解像度の証明写真**:`size`のアスペクト比に基づいて作成された証明写真で、ファイル名は`output_image_dir`に`_hd`という接尾辞が追加されます。
+- **標準の証明写真**:サイズは`size`と等しく、高解像度の証明写真からスケーリングされ、ファイル名は`output_image_dir`です。
+
+生成される2枚の写真はどちらも透明です(RGBA 4チャンネル画像)ので、完全な証明写真を生成するには、以下の`背景色を追加する`インターフェースが必要です。
+
+> 質問:なぜこのように設計されているのですか?
+> 答え:実際の製品では、ユーザーが頻繁に背景色を切り替えてプレビュー効果を確認するため、透明な背景画像を直接提供し、フロントエンドのjsコードで色を合成する方がより良い体験となります。
+
+### 2.背景色を追加する
+
+インターフェース名:`add_background`
+
+`背景色を追加する`インターフェースのロジックは、RGBA画像を送信し、`color`に基づいて背景色を追加し、JPG画像を合成します。
+
+### 3.六寸レイアウト写真を生成する
+
+インターフェース名:`generate_layout_photos`
+
+`六寸レイアウト写真を生成する`インターフェースのロジックは、RGB画像(一般的には背景色を追加した後の証明写真)を送信し、`size`に基づいて写真を配置し、六寸レイアウト写真を生成します。
+
+### 4.人物切り抜き
+
+インターフェース名:`human_matting`
+
+`人物切り抜き`インターフェースのロジックは、RGB画像を送信し、標準の切り抜き人物写真と高解像度の切り抜き人物写真(背景が何も填充されていない)を出力します。
+
+
+
+## cURL リクエスト例
+
+cURLは、さまざまなネットワークプロトコルを使用してデータを転送するためのコマンドラインツールです。以下は、cURLを使用してこれらのAPIを呼び出す例です。
+
+### 1. 証明写真を生成する(透明な背景)
+
+```bash
+curl -X POST "http://127.0.0.1:8080/idphoto" \
+-F "input_image=@demo/images/test.jpg" \
+-F "height=413" \
+-F "width=295" \
+-F "human_matting_model=hivision_modnet" \
+-F "face_detect_model=mtcnn"
+```
+
+### 2. 背景色を追加する
+
+```bash
+curl -X POST "http://127.0.0.1:8080/add_background" \
+-F "input_image=@test.png" \
+-F "color=638cce" \
+-F "kb=200" \
+-F "render=0"
+```
+
+### 3. 六寸レイアウト写真を生成する
+
+```bash
+curl -X POST "http://127.0.0.1:8080/generate_layout_photos" \
+-F "input_image=@test.jpg" \
+-F "height=413" \
+-F "width=295" \
+-F "kb=200"
+```
+
+### 4. 人物切り抜き
+
+```bash
+curl -X POST "http://127.0.0.1:8080/human_matting" \
+-F "input_image=@demo/images/test.jpg" \
+-F "human_matting_model=hivision_modnet"
+```
+
+
+
+## Python リクエスト例
+
+### 1️⃣ Python Requests リクエスト方法
+
+#### 1.証明写真を生成する(透明な背景)
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/idphoto"
+input_image_path = "images/test.jpg"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"height": 413, "width": 295, "human_matting_model": "hivision_modnet", "face_detect_model": "mtcnn"}
+
+response = requests.post(url, files=files, data=data).json()
+
+# responseはjson形式の辞書で、status、image_base64_standard、image_base64_hdの3項目を含みます
+print(response)
+
+```
+
+#### 2.背景色を追加する
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/add_background"
+input_image_path = "test.png"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"color": '638cce', "kb": None, "render": 0}
+
+response = requests.post(url, files=files, data=data).json()
+
+# responseはjson形式の辞書で、statusとimage_base64を含みます
+print(response)
+```
+
+#### 3.六寸レイアウト写真を生成する
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/generate_layout_photos"
+input_image_path = "test.jpg"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"height": 413, "width": 295, "kb": 200}
+
+response = requests.post(url, files=files, data=data).json()
+
+# responseはjson形式の辞書で、statusとimage_base64を含みます
+print(response)
+```
+
+#### 4.人物切り抜き
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/human_matting"
+input_image_path = "test.jpg"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"human_matting_model": "hivision_modnet"}
+
+response = requests.post(url, files=files, data=data).json()
+
+# responseはjson形式の辞書で、statusとimage_base64を含みます
+print(response)
+```
+
+### 2️⃣ Python スクリプトリクエスト方法
+
+```bash
+python requests_api.py -u
-t -i -o [--height ] [--width ] [-c ] [-k ]
+```
+
+#### パラメータ説明
+
+##### 基本パラメータ
+
+- `-u`, `--url`
+
+ - **説明**: APIサービスのURL。
+ - **デフォルト値**: `http://127.0.0.1:8080`
+
+- `-t`, `--type`
+
+ - **説明**: APIをリクエストする種類。
+ - **デフォルト値**: `idphoto`
+
+- `-i`, `--input_image_dir`
+
+ - **説明**: 入力画像のパス。
+ - **必須**: はい
+ - **例**: `./input_images/photo.jpg`
+
+- `-o`, `--output_image_dir`
+ - **説明**: 画像の保存パス。
+ - **必須**: はい
+ - **例**: `./output_images/processed_photo.jpg`
+
+##### オプションパラメータ
+
+- `--face_detect_model`
+ - **説明**: 顔検出モデル
+ - **デフォルト値**: mtcnn
+
+- `--human_matting_model`
+ - **説明**: 人物切り抜きモデル
+ - **デフォルト値**: hivision_modnet
+
+- `--height`,
+ - **説明**: 標準証明写真の出力サイズの高さ。
+ - **デフォルト値**: 413
+
+- `--width`,
+ - **説明**: 標準証明写真の出力サイズの幅。
+ - **デフォルト値**: 295
+
+- `-c`, `--color`
+ - **説明**: 透明画像に背景色を追加する、形式はHex(例:#638cce)、typeが`add_background`のときのみ有効
+ - **デフォルト値**: `638cce`
+
+- `-k`, `--kb`
+ - **説明**: 出力写真のKB値、typeが`add_background`と`generate_layout_photos`のときのみ有効、値がNoneのときは設定しません。
+ - **デフォルト値**: `None`
+ - **例**: 50
+
+- `-r`, `--render`
+ - **説明**: 透明画像に背景色を追加する際のレンダリング方式、typeが`add_background`と`generate_layout_photos`のときのみ有効
+ - **デフォルト値**: 0
+
+### 1.証明写真を生成する(透明な背景)
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t idphoto \
+ -i ./photo.jpg \
+ -o ./idphoto.png \
+ --height 413 \
+ --width 295 \
+ --face_detect_model mtcnn \
+ --human_matting_model hivision_modnet
+```
+
+### 2.背景色を追加する
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t add_background \
+ -i ./idphoto.png \
+ -o ./idphoto_with_background.jpg \
+ -c 638cce \
+ -k 50 \
+ -r 0
+```
+
+### 3.六寸レイアウト写真を生成する
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t generate_layout_photos \
+ -i ./idphoto_with_background.jpg \
+ -o ./layout_photo.jpg \
+ --height 413 \
+ --width 295 \
+ -k 200
+```
+
+### 4.人物切り抜き
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t human_matting \
+ -i ./photo.jpg \
+ -o ./photo_matting.png \
+ --human_matting_model hivision_modnet
+```
+
+### リクエスト失敗の状況
+
+- 写真に検出された顔が1つを超える場合、失敗します。
+
+
+
+## Java リクエスト例
+
+### Maven依存関係を追加
+
+```java
+
+ cn.hutool
+ hutool-all
+ 5.8.16
+
+
+
+ commons-io
+ commons-io
+ 2.6
+
+```
+
+### コードを実行する
+
+#### 1.証明写真を生成する(透明な背景)
+
+```java
+/**
+ * 証明写真を生成する(透明な背景) /idphoto インターフェース
+ * @param inputImageDir ファイルのパス
+ * @return
+ * @throws IOException
+ */
+public static String requestIdPhoto(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/idphoto";
+ // ファイルオブジェクトを作成
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ paramMap.put("height","413");
+ paramMap.put("width","295");
+ // status、image_base64_standard、image_base64_hdの3項目を含みます
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+#### 2.背景色を追加する
+
+```java
+/**
+ * 背景色を追加する /add_background インターフェース
+ * @param inputImageDir ファイルのパス
+ * @return
+ * @throws IOException
+ */
+public static String requestAddBackground(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/add_background";
+ // ファイルオブジェクトを作成
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ paramMap.put("color","638cce");
+ paramMap.put("kb","200");
+ // responseはjson形式の辞書で、statusとimage_base64を含みます
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+#### 3.六寸レイアウト写真を生成する
+
+```java
+/**
+ * 六寸レイアウト写真を生成する /generate_layout_photos インターフェース
+ * @param inputImageDir ファイルのパス
+ * @return
+ * @throws IOException
+ */
+public static String requestGenerateLayoutPhotos(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/generate_layout_photos";
+ // ファイルオブジェクトを作成
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ paramMap.put("height","413");
+ paramMap.put("width","295");
+ paramMap.put("kb","200");
+ // responseはjson形式の辞書で、statusとimage_base64を含みます
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+#### 4.人物切り抜き
+
+```java
+/**
+ * 人物切り抜き写真を生成する /human_matting インターフェース
+ * @param inputImageDir ファイルのパス
+ * @return
+ * @throws IOException
+ */
+public static String requestHumanMattingPhotos(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/human_matting";
+ // ファイルオブジェクトを作成
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ // status、image_base64を含みます
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+
+
+## JavaScript リクエスト例
+
+JavaScriptでは、`fetch` APIを使用してHTTPリクエストを送信できます。以下は、JavaScriptでこれらのAPIを呼び出す方法の例です。
+
+### 1. 証明写真を生成する(透明な背景)
+
+```javascript
+async function generateIdPhoto(inputImagePath, height, width) {
+ const url = "http://127.0.0.1:8080/idphoto";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
+ formData.append("height", height);
+ formData.append("width", width);
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json();
+ console.log(result);
+ return result;
+}
+
+// サンプル呼び出し
+generateIdPhoto("images/test.jpg", 413, 295).then(response => {
+ console.log(response);
+});
+```
+
+### 2. 背景色を追加する
+
+```javascript
+async function addBackground(inputImagePath, color, kb) {
+ const url = "http://127.0.0.1:8080/add_background";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.png"));
+ formData.append("color", color);
+ formData.append("kb", kb);
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json();
+ console.log(result);
+ return result;
+}
+
+// サンプル呼び出し
+addBackground("test.png", "638cce", 200).then(response => {
+ console.log(response);
+});
+```
+
+### 3. 六寸レイアウト写真を生成する
+
+```javascript
+async function generateLayoutPhotos(inputImagePath, height, width, kb) {
+ const url = "http://127.0.0.1:8080/generate_layout_photos";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
+ formData.append("height", height);
+ formData.append("width", width);
+ formData.append("kb", kb);
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json();
+ console.log(result);
+ return result;
+}
+
+// サンプル呼び出し
+generateLayoutPhotos("test.jpg", 413, 295, 200).then(response => {
+ console.log(response);
+});
+```
+
+### 4. 人物切り抜き
+
+```javascript
+async function uploadImage(inputImagePath) {
+ const url = "http://127.0.0.1:8080/human_matting";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json(); // 応答がJSON形式であると仮定
+ console.log(result);
+ return result;
+}
+
+// サンプル呼び出し
+uploadImage("demo/images/test.jpg").then(response => {
+ console.log(response);
+});
+```
\ No newline at end of file
diff --git a/docs/api_KO.md b/docs/api_KO.md
new file mode 100644
index 00000000..c4925ef0
--- /dev/null
+++ b/docs/api_KO.md
@@ -0,0 +1,515 @@
+# API 문서
+
+[English](api_EN.md) / [中文](api_CN.md) / [日本語](api_JP.md) / 한국어
+
+
+## 목차
+
+- [시작하기: 백엔드 서비스 시작하기](#시작하기-백엔드-서비스-시작하기)
+- [인터페이스 기능 설명](#인터페이스-기능-설명)
+- [cURL 요청 예시](#curl-요청-예시)
+- [Python 요청 예시](#python-요청-예시)
+ - [Python Requests 요청 방법](#1️⃣-python-requests-요청-방법)
+ - [Python 스크립트 요청 방법](#2️⃣-python-스크립트-요청-방법)
+- [Java 요청 예시](#java-요청-예시)
+- [JavaScript 요청 예시](#javascript-요청-예시)
+
+## 시작하기: 백엔드 서비스 시작하기
+
+API를 요청하기 전에 백엔드 서비스를 먼저 실행하세요.
+
+```bash
+python deploy_api.py
+```
+
+
+
+## 인터페이스 기능 설명
+
+### 1. 증명사진 생성(투명 배경)
+
+인터페이스 이름: `idphoto`
+
+`증명사진 생성` 인터페이스의 논리는 RGB 이미지를 전송하고 표준 증명사진과 고해상도 증명사진을 출력하는 것입니다:
+
+- **고해상도 증명사진**: `size`의 가로 세로 비율에 따라 제작된 증명사진, 파일 이름은 `output_image_dir`에 `_hd` 접미사를 추가한 것입니다.
+- **표준 증명사진**: 크기가 `size`와 같으며, 고해상도 증명사진에서 축소된 것입니다, 파일 이름은 `output_image_dir`입니다.
+
+생성된 두 장의 사진은 모두 투명합니다(RGBA 4채널 이미지), 완전한 증명사진을 생성하려면 아래의 `배경색 추가` 인터페이스가 필요합니다.
+
+> 질문: 왜 이렇게 디자인했나요?
+> 답변: 실제 제품에서는 사용자가 배경색 미리보기를 자주 변경하므로, 투명 배경 이미지를 제공하고 프론트엔드 js 코드로 색상을 합성하는 것이 더 나은 경험을 제공합니다.
+
+### 2. 배경색 추가
+
+인터페이스 이름: `add_background`
+
+`배경색 추가` 인터페이스의 논리는 RGBA 이미지를 전송하고 `color`에 따라 배경색을 추가하여 JPG 이미지를 합성하는 것입니다.
+
+### 3. 6인치 레이아웃 사진 생성
+
+인터페이스 이름: `generate_layout_photos`
+
+`6인치 레이아웃 사진 생성` 인터페이스의 논리는 RGB 이미지를 전송하고(일반적으로 배경색 추가 후의 증명사진), `size`에 따라 사진을 배치한 다음 6인치 레이아웃 사진을 생성하는 것입니다.
+
+### 4. 인물 추출
+
+인터페이스 이름: `human_matting`
+
+`인물 추출` 인터페이스의 논리는 RGB 이미지를 전송하고 표준 인물 사진과 고해상도 인물 사진(배경이 없는)을 출력하는 것입니다.
+
+
+
+## cURL 요청 예시
+
+cURL은 다양한 네트워크 프로토콜을 사용하여 데이터를 전송하는 명령줄 도구입니다. 다음은 cURL을 사용하여 이 API를 호출하는 예시입니다.
+
+### 1. 증명사진 생성(투명 배경)
+
+```bash
+curl -X POST "http://127.0.0.1:8080/idphoto" \
+-F "input_image=@demo/images/test.jpg" \
+-F "height=413" \
+-F "width=295" \
+-F "human_matting_model=hivision_modnet" \
+-F "face_detect_model=mtcnn"
+```
+
+### 2. 배경색 추가
+
+```bash
+curl -X POST "http://127.0.0.1:8080/add_background" \
+-F "input_image=@test.png" \
+-F "color=638cce" \
+-F "kb=200" \
+-F "render=0"
+```
+
+### 3. 6인치 레이아웃 사진 생성
+
+```bash
+curl -X POST "http://127.0.0.1:8080/generate_layout_photos" \
+-F "input_image=@test.jpg" \
+-F "height=413" \
+-F "width=295" \
+-F "kb=200"
+```
+
+### 4. 인물 추출
+
+```bash
+curl -X POST "http://127.0.0.1:8080/human_matting" \
+-F "input_image=@demo/images/test.jpg" \
+-F "human_matting_model=hivision_modnet"
+```
+
+
+
+## Python 요청 예시
+
+### 1️⃣ Python Requests 요청 방법
+
+#### 1. 증명사진 생성(투명 배경)
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/idphoto"
+input_image_path = "images/test.jpg"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"height": 413, "width": 295, "human_matting_model": "hivision_modnet", "face_detect_model": "mtcnn"}
+
+response = requests.post(url, files=files, data=data).json()
+
+# response는 status, image_base64_standard 및 image_base64_hd를 포함하는 JSON 형식의 사전입니다.
+print(response)
+
+```
+
+#### 2. 배경색 추가
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/add_background"
+input_image_path = "test.png"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"color": '638cce', "kb": None, "render": 0}
+
+response = requests.post(url, files=files, data=data).json()
+
+# response는 status와 image_base64를 포함하는 JSON 형식의 사전입니다.
+print(response)
+```
+
+#### 3. 6인치 레이아웃 사진 생성
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/generate_layout_photos"
+input_image_path = "test.jpg"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"height": 413, "width": 295, "kb": 200}
+
+response = requests.post(url, files=files, data=data).json()
+
+# response는 status와 image_base64를 포함하는 JSON 형식의 사전입니다.
+print(response)
+```
+
+#### 4. 인물 추출
+
+```python
+import requests
+
+url = "http://127.0.0.1:8080/human_matting"
+input_image_path = "test.jpg"
+
+files = {"input_image": open(input_image_path, "rb")}
+data = {"human_matting_model": "hivision_modnet"}
+
+response = requests.post(url, files=files, data=data).json()
+
+# response는 status와 image_base64를 포함하는 JSON 형식의 사전입니다.
+print(response)
+```
+
+### 2️⃣ Python 스크립트 요청 방법
+
+```bash
+python requests_api.py -u -t -i -o [--height ] [--width ] [-c ] [-k ]
+```
+
+#### 매개변수 설명
+
+##### 기본 매개변수
+
+- `-u`, `--url`
+
+ - **설명**: API 서비스의 URL입니다.
+ - **기본값**: `http://127.0.0.1:8080`
+
+- `-t`, `--type`
+
+ - **설명**: 요청 API의 종류입니다.
+ - **기본값**: `idphoto`
+
+- `-i`, `--input_image_dir`
+
+ - **설명**: 입력 이미지 경로입니다.
+ - **필수**: 예
+ - **예시**: `./input_images/photo.jpg`
+
+- `-o`, `--output_image_dir`
+ - **설명**: 저장 이미지 경로입니다.
+ - **필수**: 예
+ - **예시**: `./output_images/processed_photo.jpg`
+
+##### 선택적 매개변수
+
+- `--face_detect_model`
+ - **설명**: 얼굴 인식 모델입니다.
+ - **기본값**: mtcnn
+
+- `--human_matting_model`
+ - **설명**: 인물 추출 모델입니다.
+ - **기본값**: hivision_modnet
+
+- `--height`
+ - **설명**: 표준 증명사진의 출력 사이즈 높이입니다.
+ - **기본값**: 413
+
+- `--width`
+ - **설명**: 표준 증명사진의 출력 사이즈 너비입니다.
+ - **기본값**: 295
+
+- `-c`, `--color`
+ - **설명**: 투명 이미지에 배경색을 추가합니다, 형식은 Hex(#638cce)입니다, type이 `add_background`일 때만 유효합니다.
+ - **기본값**: `638cce`
+
+- `-k`, `--kb`
+ - **설명**: 출력 사진의 KB 값입니다, type이 `add_background`와 `generate_layout_photos`일 때만 유효하며, 값이 None일 때는 설정하지 않습니다.
+ - **기본값**: `None`
+ - **예시**: 50
+
+- `-r`, `--render`
+ - **설명**: 투명 이미지에 배경색을 추가할 때의 렌더링 방식입니다, type이 `add_background`와 `generate_layout_photos`일 때만 유효합니다.
+ - **기본값**: 0
+
+### 1. 증명사진 생성(투명 배경)
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t idphoto \
+ -i ./photo.jpg \
+ -o ./idphoto.png \
+ --height 413 \
+ --width 295 \
+ --face_detect_model mtcnn \
+ --human_matting_model hivision_modnet
+```
+
+### 2. 배경색 추가
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t add_background \
+ -i ./idphoto.png \
+ -o ./idphoto_with_background.jpg \
+ -c 638cce \
+ -k 50 \
+ -r 0
+```
+
+### 3. 6인치 레이아웃 사진 생성
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t generate_layout_photos \
+ -i ./idphoto_with_background.jpg \
+ -o ./layout_photo.jpg \
+ --height 413 \
+ --width 295 \
+ -k 200
+```
+
+
+### 4. 인물 추출
+
+```bash
+python requests_api.py \
+ -u http://127.0.0.1:8080 \
+ -t human_matting \
+ -i ./photo.jpg \
+ -o ./photo_matting.png \
+ --human_matting_model hivision_modnet
+```
+
+### 요청 실패의 경우
+
+- 사진에서 감지된 얼굴이 1개 이상일 경우 실패합니다.
+
+
+
+## Java 요청 예시
+
+### Maven 의존성 추가
+
+```java
+
+ cn.hutool
+ hutool-all
+ 5.8.16
+
+
+
+ commons-io
+ commons-io
+ 2.6
+
+```
+
+### 코드 실행
+
+#### 1. 증명사진 생성(투명 배경)
+
+```java
+/**
+ * 증명사진 생성(투명 배경) /idphoto 인터페이스
+ * @param inputImageDir 파일 주소
+ * @return
+ * @throws IOException
+ */
+public static String requestIdPhoto(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/idphoto";
+ // 파일 객체 생성
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ paramMap.put("height","413");
+ paramMap.put("width","295");
+ // status, image_base64_standard 및 image_base64_hd를 포함합니다.
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+#### 2. 배경색 추가
+
+```java
+/**
+ * 배경색 추가 /add_background 인터페이스
+ * @param inputImageDir 파일 주소
+ * @return
+ * @throws IOException
+ */
+public static String requestAddBackground(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/add_background";
+ // 파일 객체 생성
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ paramMap.put("color","638cce");
+ paramMap.put("kb","200");
+ // response는 status와 image_base64를 포함하는 JSON 형식의 사전입니다.
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+#### 3. 6인치 레이아웃 사진 생성
+
+```java
+/**
+ * 6인치 레이아웃 사진 생성 /generate_layout_photos 인터페이스
+ * @param inputImageDir 파일 주소
+ * @return
+ * @throws IOException
+ */
+public static String requestGenerateLayoutPhotos(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/generate_layout_photos";
+ // 파일 객체 생성
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ paramMap.put("height","413");
+ paramMap.put("width","295");
+ paramMap.put("kb","200");
+ // response는 status와 image_base64를 포함하는 JSON 형식의 사전입니다.
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+#### 4. 인물 추출
+
+```java
+/**
+ * 인물 추출 사진 생성 /human_matting 인터페이스
+ * @param inputImageDir 파일 주소
+ * @return
+ * @throws IOException
+ */
+public static String requestHumanMattingPhotos(String inputImageDir) throws IOException {
+ String url = BASE_URL+"/human_matting";
+ // 파일 객체 생성
+ File inputFile = new File(inputImageDir);
+ Map paramMap=new HashMap<>();
+ paramMap.put("input_image",inputFile);
+ // status와 image_base64를 포함합니다.
+ return HttpUtil.post(url, paramMap);
+}
+```
+
+
+
+## JavaScript 요청 예시
+
+JavaScript에서는 `fetch` API를 사용하여 HTTP 요청을 보낼 수 있습니다. 다음은 JavaScript를 사용하여 이 API를 호출하는 예시입니다.
+
+### 1. 증명사진 생성(투명 배경)
+
+```javascript
+async function generateIdPhoto(inputImagePath, height, width) {
+ const url = "http://127.0.0.1:8080/idphoto";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
+ formData.append("height", height);
+ formData.append("width", width);
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json();
+ console.log(result);
+ return result;
+}
+
+// 예시 호출
+generateIdPhoto("images/test.jpg", 413, 295).then(response => {
+ console.log(response);
+});
+```
+
+### 2. 배경색 추가
+
+```javascript
+async function addBackground(inputImagePath, color, kb) {
+ const url = "http://127.0.0.1:8080/add_background";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.png"));
+ formData.append("color", color);
+ formData.append("kb", kb);
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json();
+ console.log(result);
+ return result;
+}
+
+// 예시 호출
+addBackground("test.png", "638cce", 200).then(response => {
+ console.log(response);
+});
+```
+
+### 3. 6인치 레이아웃 사진 생성
+
+```javascript
+async function generateLayoutPhotos(inputImagePath, height, width, kb) {
+ const url = "http://127.0.0.1:8080/generate_layout_photos";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
+ formData.append("height", height);
+ formData.append("width", width);
+ formData.append("kb", kb);
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json();
+ console.log(result);
+ return result;
+}
+
+// 예시 호출
+generateLayoutPhotos("test.jpg", 413, 295, 200).then(response => {
+ console.log(response);
+});
+```
+
+### 4. 인물 추출
+
+```javascript
+async function uploadImage(inputImagePath) {
+ const url = "http://127.0.0.1:8080/human_matting";
+ const formData = new FormData();
+ formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
+
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData
+ });
+
+ const result = await response.json(); // 응답이 JSON 형식이라고 가정합니다.
+ console.log(result);
+ return result;
+}
+
+// 예시 호출
+uploadImage("demo/images/test.jpg").then(response => {
+ console.log(response);
+});
+```
\ No newline at end of file