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()