|
|
import gradio as gr |
|
|
import base64 |
|
|
import json |
|
|
import pandas as pd |
|
|
from openai import OpenAI |
|
|
import tempfile |
|
|
import os |
|
|
import io |
|
|
|
|
|
|
|
|
|
|
|
UPSTAGE_API_KEY = "" |
|
|
|
|
|
|
|
|
def encode_img_to_base64(img_path): |
|
|
with open(img_path, "rb") as img_file: |
|
|
return base64.b64encode(img_file.read()).decode("utf-8") |
|
|
|
|
|
|
|
|
def flatten_to_rows(data): |
|
|
flat = {} |
|
|
for key, value in data.items(): |
|
|
if isinstance(value, list): |
|
|
for i, item in enumerate(value): |
|
|
if isinstance(item, dict): |
|
|
for sub_key, sub_val in item.items(): |
|
|
flat[f"{key}[{i}].{sub_key}"] = sub_val |
|
|
else: |
|
|
flat[f"{key}[{i}]"] = item |
|
|
elif isinstance(value, dict): |
|
|
for sub_key, sub_val in value.items(): |
|
|
flat[f"{key}.{sub_key}"] = sub_val |
|
|
else: |
|
|
flat[key] = value |
|
|
return flat |
|
|
|
|
|
|
|
|
def extract_info(image_path, UPSTAGE_API_KEY): |
|
|
|
|
|
|
|
|
|
|
|
schema_client = OpenAI( |
|
|
api_key=UPSTAGE_API_KEY, |
|
|
base_url="https://api.upstage.ai/v1/information-extraction/schema-generation" |
|
|
) |
|
|
|
|
|
|
|
|
extraction_client = OpenAI( |
|
|
api_key=UPSTAGE_API_KEY, |
|
|
base_url="https://api.upstage.ai/v1/information-extraction" |
|
|
) |
|
|
|
|
|
base64_data = encode_img_to_base64(image_path) |
|
|
|
|
|
|
|
|
schema_response = schema_client.chat.completions.create( |
|
|
model="information-extract", |
|
|
messages=[{ |
|
|
"role": "user", |
|
|
"content": [{ |
|
|
"type": "image_url", |
|
|
"image_url": {"url": f"data:image/jpeg;base64,{base64_data}"} |
|
|
}] |
|
|
}] |
|
|
) |
|
|
schema = json.loads(schema_response.choices[0].message.content) |
|
|
|
|
|
|
|
|
extraction_response = extraction_client.chat.completions.create( |
|
|
model="information-extract", |
|
|
messages=[{ |
|
|
"role": "user", |
|
|
"content": [{ |
|
|
"type": "image_url", |
|
|
"image_url": {"url": f"data:image/jpeg;base64,{base64_data}"} |
|
|
}] |
|
|
}], |
|
|
response_format={ |
|
|
"type": "json_schema", |
|
|
"json_schema": { |
|
|
"name": "business_card_schema", |
|
|
"schema": schema["json_schema"]["schema"] |
|
|
} |
|
|
} |
|
|
) |
|
|
|
|
|
result = json.loads(extraction_response.choices[0].message.content) |
|
|
json_result = json.dumps(result, indent=2, ensure_ascii=False) |
|
|
|
|
|
|
|
|
flat_dict = flatten_to_rows(result) |
|
|
df_result = pd.DataFrame([flat_dict]).T.reset_index() |
|
|
df_result.columns = ["Field", "Value"] |
|
|
|
|
|
|
|
|
return json_result, df_result |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("## ๐ ๋ช
ํจ ์ ๋ณด ์๋ ์ถ์ถ๊ธฐ") |
|
|
gr.Markdown("๋ช
ํจ ์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ๋ฉด ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ , ๋ค์ด๋ก๋ ๋ฒํผ์ ๋๋ฌ CSV๋ก ์ ์ฅํ ์ ์์ต๋๋ค.") |
|
|
|
|
|
with gr.Row(): |
|
|
api_key_input = gr.Textbox(label="๐ Upstage API Key", type="password", placeholder="Paste your API key here") |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
image_input = gr.Image(type="filepath", label="๋ช
ํจ ์ด๋ฏธ์ง ์
๋ก๋") |
|
|
extract_btn = gr.Button("๐ค ์ ๋ณด ์ถ์ถํ๊ธฐ") |
|
|
|
|
|
with gr.Column(): |
|
|
json_output = gr.Textbox(label="๐ ์ถ์ถ๋ JSON", lines=20) |
|
|
table_output = gr.Dataframe(label="๐ ์ถ์ถ๋ ์ ๋ณด (ํ ํํ)", interactive=False) |
|
|
|
|
|
extract_btn.click( |
|
|
fn=extract_info, |
|
|
inputs=[image_input, api_key_input], |
|
|
outputs=[json_output, table_output] |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|
|
|
|