File size: 3,974 Bytes
390599a d5af5de 390599a a4fb696 390599a a4fb696 390599a 9ab4541 390599a 9ab4541 390599a 9ab4541 390599a e537503 8f43717 390599a a4fb696 390599a a4fb696 390599a a4fb696 2dadf80 9ab4541 5fd9d56 a4fb696 2dadf80 5fd9d56 390599a 8f43717 390599a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | 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 = ""
# ์ด๋ฏธ์ง ํ์ผ์ base64 ๋ฌธ์์ด๋ก ์ธ์ฝ๋ฉํ๋ ํจ์
def encode_img_to_base64(img_path):
with open(img_path, "rb") as img_file:
return base64.b64encode(img_file.read()).decode("utf-8")
# ์ค์ฒฉ๋ JSON์ ํํํํ์ฌ ํ
์ด๋ธ๋ก ๋ณํํ ์ ์๋๋ก ์ฒ๋ฆฌํ๋ ํจ์
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
# ๋ช
ํจ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ ์ ๋ณด ์ถ์ถ ๋ฐ CSV ์ ์ฅ์ ์ฒ๋ฆฌํ๋ ํต์ฌ ํจ์
def extract_info(image_path, UPSTAGE_API_KEY):
# Upstage API ํด๋ผ์ด์ธํธ ์ค์ (์คํค๋ง ์์ฑ์ฉ)
schema_client = OpenAI(
api_key=UPSTAGE_API_KEY,
base_url="https://api.upstage.ai/v1/information-extraction/schema-generation"
)
# Upstage API ํด๋ผ์ด์ธํธ ์ค์ (์ ๋ณด ์ถ์ถ์ฉ)
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
# Gradio UI
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()
|