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 @@ -
-
+
+
HivisionIDPhotos -
-
- Github   - Static Badge   - Static Badge -
-
\ No newline at end of file +
+ Github   + Static Badge   + Static Badge +
+
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