GPT-4o の画像認識能力がすごい！カロリー推定アプリを作ってみる

## 概要

食事のカロリー推定は非常に困難なタスクでした。
一般的なアプローチとしては、物体検知modelをfine-tuningし、料理画像から個々の料理の領域を判定することでカロリーを推定してきました。
GPT-4oを利用するとそのへんを飛ばして、いきなりカロリーが推定できます。精度の面では劣ると考えられますが、実装の容易さと未知のクラス (学習データセット内に含まれない料理) への対応を考えると、十分に利用価値があると思われます。
今回の記事では、実際のデモも紹介しているのですぐ利用することができます。

## 早速結果を見てみよう

![Calorie_Estimator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/b03e921d-ed6b-b408-9da6-01043dc8d4fc.png)
![Cursor_と_Calorie_Estimator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/28d65733-317d-fb8c-036d-0d06be693a49.png)

## デモ

https://huggingface.co/spaces/sakasegawa/gpt4o-calorie-predictor

## 実装

### カロリー推定

json-mode で処理をさせます。step-by-stepに推論を処理させるために、最初に雑な推論を記述させてから、各食品のカロリー量を推定させています。

```
# 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"},
)
```

## Appendix

GPT-4oは文字認識能力も格段に向上しています。以下のような情報抽出タスクにおいても、OCRを用いずそのままGPT-4oに画像を供給したほうが良い場合も増えてくるでしょう。

https://qiita.com/sakasegawa/items/8abd902ac45a3cd2862c

また、以下のような非常に複雑な日本語画像問題にも一定程度の回答を行えます。

![GKe7UFXa4AAmjEk.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/50a07bef-4d68-9810-5642-041cbdeea243.jpeg)
(引用元: https://twitter.com/purufeido/status/1776594567006917079 )

プロンプト:

```
この問題について段階的に考え、回答してください
```

回答:

```
この問題を解決するために、各選択肢について順に検討し、正しいかどうかを確認しましょう。

まず、状況を整理します。

父親（45歳）が再婚し、新しい妻（38歳）を連れてきました。
連れ子（17歳）がいます。
オレ（18歳）は父親の子供です。
この1ヶ月後に父親が死亡し、厚生年金保険被保険者の甲が死亡した際に、遺族基礎年金および遺族厚生年金の受給権者が誰になるかを判断します。
次に、各選択肢を順に検討します。

A 両丁は共に遺族基礎年金および遺族厚生年金の受給権者である
遺族基礎年金および遺族厚生年金の受給権者は、原則として被保険者の配偶者および子供です。この場合、乙（再婚相手）は配偶者であり、丁（オレ）は子供として受給権者になる可能性があります。しかし、法定の要件を満たす必要があります。丁が18歳であるため、子供の定義に該当するかどうかが重要です。高校生または大学生であれば可能性があります。

B 年齢にかかわらず失権事由に該当する両方が先に失権しない限り
遺族年金の失権事由には、再婚や特定の年齢に達することが含まれます。甲が死亡した時点で乙と丁が失権事由に該当しない場合、受給権が維持されます。

C 丙丁が婚姻した時はすべての子が失権事由に該当するに至ったものであるから乙の遺族基礎年金の受給権も消滅する
丙と丁が婚姻した場合、丙（新しい妻の子供）も失権事由に該当することになりますが、乙（再婚相手）の受給権は婚姻によって消滅しません。

D 乙がその所在を1年以上明らかにしないならば甲及び乙の遺族厚生年金がその支給を停止されることはない
乙が所在不明であっても、受給権が直ちに消滅するわけではありません。法的な手続きが必要です。

これらを踏まえて、正しい選択肢を検討すると、以下の通りです。

正しい選択肢
A. 両丁は共に遺族基礎年金および遺族厚生年金の受給権者である

この選択肢が最も正しいと考えられます。法律に基づき、配偶者と子供が受給権者となります。

以上のように検討することで、選択肢Aが最も正しいと結論付けられます。
```