matsuap commited on
Commit
a5380ab
·
verified ·
1 Parent(s): b38dc26

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -31
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
- csv_buffer = io.StringIO()
90
- df.to_csv(csv_buffer, index=False)
91
- csv_buffer.seek(0)
92
- csv_bytes = csv_buffer.getvalue().encode("utf-8")
93
 
94
- # DataFrame と ダウンロード用バイナリを返す
95
- return df, (csv_bytes)
96
 
97
  # Gradioアプリの定義
98
  with gr.Blocks() as demo:
99
  gr.Markdown("# 画像から数値を読み取り、CSVを生成するデモアプリ")
100
 
101
- with gr.Row():
102
- api_key_input = gr.Textbox(
103
- label="OpenAI API Key",
104
- placeholder="sk-...",
105
- type="password",
106
- show_label=True
107
- )
108
 
109
- with gr.Row():
110
- image_input = gr.Image(
111
- label="画像アップロード",
112
- type="filepath"
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, download_file]
126
  )
127
 
128
- demo.launch()
 
 
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()