Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -19,9 +19,6 @@ def analyze_image(image_path, api_key):
|
|
19 |
if not api_key:
|
20 |
return "API Key を入力してください。", None
|
21 |
|
22 |
-
# OpenAI APIキーを設定
|
23 |
-
openai.api_key = api_key
|
24 |
-
|
25 |
# 画像をbase64に変換
|
26 |
with open(image_path, "rb") as f:
|
27 |
image_data = f.read()
|
@@ -36,6 +33,7 @@ def analyze_image(image_path, api_key):
|
|
36 |
以下の画像に写っている各部位の計測値(首、肩、二の腕L、二の腕R、胸、ウエスト、ヒップ、太腿L、太腿R、ふくらはぎL、ふくらはぎR)を読み取り、
|
37 |
次のCSVフォーマットで出力してください。なお、CSVの1行目には列名を、2行目には画像から抽出した数値を入れてください。
|
38 |
左端のID列には自動生成したUUIDを記載してください。
|
|
|
39 |
|
40 |
- CSVフォーマット例:
|
41 |
ID,首,肩,二の腕L,二の腕R,胸,ウエスト,ヒップ,太腿L,太腿R,ふくらはぎL,ふくらはぎR
|
@@ -46,11 +44,7 @@ ID,首,肩,二の腕L,二の腕R,胸,ウエスト,ヒップ,太腿L,太腿R,ふ
|
|
46 |
|
47 |
try:
|
48 |
# OpenAI API呼び出し
|
49 |
-
client = OpenAI(
|
50 |
-
#事前準備で取得したAPIキー
|
51 |
-
api_key = api_key,
|
52 |
-
base_url = 'https://api.openai.com/v1/chat/completions'
|
53 |
-
)
|
54 |
response = client.chat.completions.create(
|
55 |
model="gpt-4o-mini",
|
56 |
messages=[
|
@@ -77,6 +71,7 @@ ID,首,肩,二の腕L,二の腕R,胸,ウエスト,ヒップ,太腿L,太腿R,ふ
|
|
77 |
|
78 |
# APIの応答(CSVテキスト想定)
|
79 |
csv_text = response.choices[0].message.content.strip()
|
|
|
80 |
|
81 |
# pandasでテーブルに変換を試みる
|
82 |
try:
|
@@ -85,44 +80,39 @@ ID,首,肩,二の腕L,二の腕R,胸,ウエスト,ヒップ,太腿L,太腿R,ふ
|
|
85 |
# CSVとしてパースできなければテキストのみ返す
|
86 |
return f"CSVとして解析できませんでした。応答内容:\n{csv_text}", None
|
87 |
|
88 |
-
# CSV
|
89 |
-
|
90 |
-
df.to_csv(csv_buffer, index=False)
|
91 |
-
csv_buffer.seek(0)
|
92 |
-
csv_bytes = csv_buffer.getvalue().encode("utf-8")
|
93 |
|
94 |
-
|
95 |
-
return df, (csv_bytes)
|
96 |
|
97 |
# Gradioアプリの定義
|
98 |
with gr.Blocks() as demo:
|
99 |
gr.Markdown("# 画像から数値を読み取り、CSVを生成するデモアプリ")
|
100 |
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
)
|
108 |
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
)
|
114 |
|
115 |
-
generate_button = gr.Button("CSV生成")
|
|
|
116 |
|
117 |
# 出力は DataFrame と File (ダウンロード用)
|
118 |
output_table = gr.DataFrame(label="CSVプレビュー")
|
119 |
-
download_file = gr.File(label="CSVダウンロード")
|
120 |
|
121 |
# ボタンクリック時の動作
|
122 |
generate_button.click(
|
123 |
fn=analyze_image,
|
124 |
inputs=[image_input, api_key_input],
|
125 |
-
outputs=[output_table,
|
126 |
)
|
127 |
|
128 |
-
|
|
|
|
19 |
if not api_key:
|
20 |
return "API Key を入力してください。", None
|
21 |
|
|
|
|
|
|
|
22 |
# 画像をbase64に変換
|
23 |
with open(image_path, "rb") as f:
|
24 |
image_data = f.read()
|
|
|
33 |
以下の画像に写っている各部位の計測値(首、肩、二の腕L、二の腕R、胸、ウエスト、ヒップ、太腿L、太腿R、ふくらはぎL、ふくらはぎR)を読み取り、
|
34 |
次のCSVフォーマットで出力してください。なお、CSVの1行目には列名を、2行目には画像から抽出した数値を入れてください。
|
35 |
左端のID列には自動生成したUUIDを記載してください。
|
36 |
+
出力には余計な説明文を加えず、CSVテキストのみとせよ。
|
37 |
|
38 |
- CSVフォーマット例:
|
39 |
ID,首,肩,二の腕L,二の腕R,胸,ウエスト,ヒップ,太腿L,太腿R,ふくらはぎL,ふくらはぎR
|
|
|
44 |
|
45 |
try:
|
46 |
# OpenAI API呼び出し
|
47 |
+
client = openai.OpenAI(api_key=api_key)
|
|
|
|
|
|
|
|
|
48 |
response = client.chat.completions.create(
|
49 |
model="gpt-4o-mini",
|
50 |
messages=[
|
|
|
71 |
|
72 |
# APIの応答(CSVテキスト想定)
|
73 |
csv_text = response.choices[0].message.content.strip()
|
74 |
+
csv_text = csv_text.replace('```', '')
|
75 |
|
76 |
# pandasでテーブルに変換を試みる
|
77 |
try:
|
|
|
80 |
# CSVとしてパースできなければテキストのみ返す
|
81 |
return f"CSVとして解析できませんでした。応答内容:\n{csv_text}", None
|
82 |
|
83 |
+
# CSVをtemp.csvに出力する
|
84 |
+
df.to_csv('temp.csv', index=False)
|
|
|
|
|
|
|
85 |
|
86 |
+
return df, 'temp.csv'
|
|
|
87 |
|
88 |
# Gradioアプリの定義
|
89 |
with gr.Blocks() as demo:
|
90 |
gr.Markdown("# 画像から数値を読み取り、CSVを生成するデモアプリ")
|
91 |
|
92 |
+
api_key_input = gr.Textbox(
|
93 |
+
label="OpenAI API Key",
|
94 |
+
placeholder="sk-...",
|
95 |
+
type="password",
|
96 |
+
show_label=True
|
97 |
+
)
|
|
|
98 |
|
99 |
+
image_input = gr.Image(
|
100 |
+
label="画像アップロード",
|
101 |
+
type="filepath"
|
102 |
+
)
|
|
|
103 |
|
104 |
+
generate_button = gr.Button("CSV生成", variant="primary")
|
105 |
+
download_button = gr.DownloadButton("CSVダウンロード")
|
106 |
|
107 |
# 出力は DataFrame と File (ダウンロード用)
|
108 |
output_table = gr.DataFrame(label="CSVプレビュー")
|
|
|
109 |
|
110 |
# ボタンクリック時の動作
|
111 |
generate_button.click(
|
112 |
fn=analyze_image,
|
113 |
inputs=[image_input, api_key_input],
|
114 |
+
outputs=[output_table, download_button]
|
115 |
)
|
116 |
|
117 |
+
if __name__ == "__main__":
|
118 |
+
demo.launch()
|