sakasegawa
init
711ff79
raw
history blame
2.99 kB
import gradio as gr
import base64
from openai import OpenAI
import pandas as pd
import json
import io
import cv2
def estimate_calories(api_key, image):
client = OpenAI(api_key=api_key)
# 画像をbase64エンコードする
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
_, buffer = cv2.imencode(".jpg", image_rgb)
base64_image = base64.b64encode(buffer).decode("utf-8")
# GPT-4にカロリーを推定させる (JSON-MODE)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": """あなたは画像からカロリーを推定する優秀な栄養士です。提供された食事の画像を分析し、カロリーを推定してください。""",
},
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpg;base64,{base64_image}",
"detail": "high",
},
},
{
"type": "text",
"text": """上記の食事の画像からカロリーを推定してください。料理名は日本語で回答してください。
## JSON Schema
```
{
"type": "object",
"properties": {
"step_by_step_estimation": {"type": "string", "description": "料理とカロリーについての推論"},
"foods": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "料理名"},
"calorie": {"type": "string", "description": "カロリー"},
},
"required": ["name", "calorie"],
},
}
},
"required": ["step_by_step_estimation", "foods"],
}
```
""",
},
],
},
],
temperature=1,
response_format={"type": "json_object"},
)
content_json = json.loads(response.choices[0].message.content)
step_by_step_estimation = content_json["step_by_step_estimation"]
foods = content_json["foods"]
# foodsをデータフレームに変換する
df = pd.DataFrame(foods)
return step_by_step_estimation, df
demo = gr.Interface(
fn=estimate_calories,
inputs=[gr.Textbox(label="OpenAI API Key"), gr.Image(label="Upload Food Image")],
outputs=[
gr.Textbox(label="段階的な推論"),
gr.DataFrame(headers=["name", "calorie"], label="推定カロリー"),
],
title="Calorie Predictor",
description="食事の画像をアップロードしOpenAIのAPIキーを入力すると、カロリーが推定されます。API使用料にご注意ください。",
)
if __name__ == "__main__":
demo.launch()