从像素到卡路里:使用 GPT-4o 构建多模态餐食分析引擎

发布: (2026年1月8日 GMT+8 08:30)
6 分钟阅读
原文: Dev.to

Source: Dev.to

Source:

🍝 从像素到热量 – 多模态 AI 与自动热量追踪

我们都有过这样的经历:盯着一盘美味的意面,想弄清它是 400 卡路里 还是偷偷的 800。手动记录是健康习惯的终极杀手。要是你的手机能 看见 食材并瞬间估算营养成分,那该多好?

在本教程中,我们将深入探讨 多模态 AI自动热量追踪。我们将使用 GPT‑4o API 构建一个基于视觉的营养引擎,利用其高级推理能力解决计算机视觉中的经典“体积估算”问题。通过将视觉‑语言模型与结构化数据解析相结合,一张简单的照片即可转化为详细的营养分析。

注意: 若想了解面向生产环境的 AI 模式和高级计算机视觉架构,请查看 WellAlly Tech Blog 上的深度文章——它们为这里使用的结构化输出逻辑提供了灵感。

📊 高层流程

graph TD
    A[User Uploads Photo] --> B[OpenCV: Resize & Encode]
    B --> C[GPT‑4o Multimodal Vision]
    C --> D{Structured Output}
    D --> E[Pydantic Validation]
    E --> F[Streamlit Dashboard]
    F --> G[Nutritional Insights & Charts]

🛠️ 你需要准备的东西

  • GPT‑4o API Key – 用于视觉和推理的重活。
  • Streamlit – 用于快速前端展示。
  • Pydantic – 确保我们的 LLM 返回有效的 JSON。
  • OpenCV – 用于快速图像缩放(降低 token 消耗)。

使用 LLM 时最大的挑战是 幻觉 与格式不一致。我们将借助 Pydantic 明确定义引擎应返回的结构:对盘中每一样食物的结构化拆解。

📐 使用 Pydantic 定义结构化输出

from pydantic import BaseModel, Field
from typing import List

class FoodItem(BaseModel):
    name: str = Field(description="Name of the food item")
    estimated_weight_g: float = Field(description="Estimated weight in grams")
    calories: int = Field(description="Calories for this portion")
    protein_g: float = Field(description="Protein content in grams")
    carbs_g: float = Field(description="Carbohydrate content in grams")
    fats_g: float = Field(description="Fat content in grams")

class MealAnalysis(BaseModel):
    total_calories: int
    items: List[FoodItem]
    health_score: int = Field(description="A score from 1‑10 based on nutritional balance")
    advice: str = Field(description="Short dietary advice based on the meal")

📸 图像预处理

import base64
import cv2
import openai


def process_image(image_path: str) -> str:
    """
    Resize the image to 800 × 800 px and return a base64‑encoded JPEG.

    Args:
        image_path: Path to the input image file.

    Returns:
        Base64‑encoded string of the JPEG image.
    """
    # Load the image from disk
    img = cv2.imread(image_path)

    # Resize for cheaper token usage
    img = cv2.resize(img, (800, 800))

    # Encode as JPEG
    _, buffer = cv2.imencode(".jpg", img)

    # Convert the binary buffer to a base64 string
    return base64.b64encode(buffer).decode("utf-8")

🤖 使用结构化解析调用 GPT‑4o

def analyze_meal(base64_image: str) -> MealAnalysis:
    client = openai.OpenAI()

    response = client.beta.chat.completions.parse(
        model="gpt-4o-2024-08-06",
        messages=[
            {
                "role": "system",
                "content": (
                    "You are an expert nutritionist. Analyze the meal in the image. "
                    "Estimate portion sizes and calculate nutritional values."
                ),
            },
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": "Identify all food items and provide a nutritional breakdown.",
                    },
                    {
                        "type": "image_url",
import streamlit as st

st.set_page_config(page_title="AI Nutritionist", page_icon="🥑")
st.title("🥑 From Pixels to Calories")
st.write("Upload a photo of your meal and let GPT‑4o do the math!")

uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])

if uploaded_file:
    st.image(uploaded_file, caption="Your delicious meal.", use_column_width=True)

    with st.spinner("Analyzing nutrients... 🧬"):
        # Save temporary file for OpenCV processing
        temp_path = "temp_img.jpg"
        with open(temp_path, "wb") as f:
            f.write(uploaded_file.getbuffer())

        encoded_img = process_image(temp_path)
        analysis = analyze_meal(encoded_img)

        # ----- Display Results -----
        st.header(f"Total Calories: {analysis.total_calories} kcal")

        col1, col2 = st.columns(2)
        with col1:
            st.metric("Health Score", f"{analysis.health_score}/10")
        with col2:
            st.write(f"**Pro Tip:** {analysis.advice}")

        st.table([item.dict() for item in analysis.items])

📱 构建一个简易 Streamlit 界面

🚀 超越原型的扩展

虽然这在个人使用时效果很好,但要打造生产级的基于视觉的营养引擎仍需额外考虑:

  1. 参考对象 – 在画面中加入硬币、手或其他已知尺寸的物体,以获得更好的尺度估计。
  2. 微调 – 为特定菜系或饮食限制训练自定义视觉适配器。
  3. 提示链 – 在计算卡路里之前先验证识别出的食材,以减少幻觉。

欲了解更深入的实现模式、部署指南以及低延迟 AI 技巧,请访问 WellAlly Tech Blog 上的技术资源。

底线: 我们已将混乱的像素阵列转化为结构化且有意义的营养报告。通过结合 GPT‑4o 的多模态能力和 Pydantic 的模式约束,我们省去了数月的传统计算机视觉训练,能够在几秒钟内获得可靠的卡路里估算。

祝编码愉快,尽情享用(精准追踪的)餐点!

医疗的未来是多模态的!
你正在使用视觉 API 构建项目吗?在下方留言或分享你的成果吧!

祝编码愉快!

Back to Blog

相关文章

阅读更多 »

构建生产就绪的交通违规检测系统(计算机视觉)

交通监控与违规检测是一个经典的计算机视觉问题,看似简单,却在真实场景中迅速变得复杂。该任务涉及从摄像头获取的连续视频流中检测、跟踪和分析车辆及行人的行为,以识别诸如闯红灯、超速、违章变道、占用应急车道以及非法停车等违规行为。实现高精度的违规检测需要克服多种挑战,包括光照变化、天气影响、遮挡、摄像头视角差异、车辆外观多样性以及实时处理的计算约束。 本文综述了交通监控与违规检测的最新研究进展,重点关注以下几个方面: 1. **目标检测与分割** - 基于深度学习的两阶段(如 Faster R-CNN、Mask R-CNN)和单阶段(如 YOLOv5、SSD、EfficientDet)检测框架在道路场景中的适配与改进。 - 语义分割与实例分割模型(如 DeepLabv3+、Panoptic FPN)用于提取车道线、交通标志和路面区域,以辅助行为理解。 2. **多目标跟踪(MOT)** - 传统基于卡尔曼滤波和匈牙利算法的跟踪方法与基于深度特征关联的端到端跟踪网络(如 DeepSORT、ByteTrack、TrackFormer)的比较。 - 在拥堵或遮挡严重的交叉口场景中,引入图神经网络(GNN)或注意力机制提升跨帧身份保持的鲁棒性。 3. **行为识别与违规判定** - 基于时空特征的行为分类模型,包括 3D CNN(如 I3D、SlowFast)和时序卷积网络(TCN),用于捕捉车辆加速、减速和转向等动态模式。 - 轨迹分析方法:利用贝塞尔曲线拟合、多项式回归或基于 Kalman/Particle Filter 的轨迹预测,对比实际轨迹与交通规则(如红灯时段、限速区间)进行违规判定。 - 事件驱动的规则引擎:将检测到的视觉事件映射到预定义的违规规则库,支持灵活的规则更新和本地化法规适配。 4. **多摄像头协同与跨视角融合** - 基于同质或异质摄像头网络的跨视角目标重识别(ReID)技术,利用全局特征和局部关键点对车辆进行跨摄像头身份匹配。 - 空间几何校准(如基于标定板或道路标线的单应性矩阵)与时间同步机制,构建统一的全局坐标系,实现跨摄像头的连续轨迹跟踪。 5. **实时推理与系统部署** - 模型压缩与加速:剪枝、量化、知识蒸馏以及 TensorRT、ONNX Runtime 等推理引擎在嵌入式 GPU/TPU 上的部署实践。 - 边缘计算与云端协同:在摄像头端完成初步检测与跟踪,复杂违规判定和历史数据存储迁移至云端,以平衡延迟和算力需求。 6. **数据集与评估指标** - 公共基准数据集:UA‑Detrac、MOT17、KITTI‑Tracking、CityFlow、D2‑CityScapes、BDD100K‑Traffic 等,涵盖不同城市、天气和摄像头布局。 - 评价指标:mAP、Recall、IDF1、MOTA、MOTP 用于检测与跟踪性能评估;违规检测则采用 Precision、Recall、F1‑Score 以及延迟(Latency)等业务相关指标。 7. **挑战与未来方向** - **鲁棒性**:提升模型在极端天气(雨、雪、雾)和夜间低光环境下的检测与跟踪能力。 - **可解释性**:构建可视化的违规判定路径,帮助监管人员理解模型决策过程。 - **跨域适应**:利用无监督域适应或自监督学习降低不同城市、摄像头配置之间的性能落差。 - **法规融合**:将本地交通法规与模型输出进行动态映射,实现“一键”规则更新和多地区部署。 - **隐私保护**:在满足 GDPR 等数据保护法规的前提下,探索加密推理和匿名化特征提取技术。 综上所述,交通监控与违规检测正从单纯的目标检测向融合多模态感知、跨摄像头协同、实时推理和法规智能化的综合系统演进。随着更高效的深度模型、强大的边缘计算平台以及更丰富的标注数据的出现,未来的智能交通系统有望实现更高的安全性、效率和可持续性,为智慧城市建设提供坚实的技术支撑。