自制卡路里计算器:Gemini 1.5 Pro 的生成式 AI 革命
你是否曾好奇晚餐中究竟摄入了多少卡路里?很多人都有这样的疑问。如果能简单地拍摄食物照片,再通过一个应用程序就能计算出卡路里,岂不是一件美妙的事情?
现在,这个愿望可以通过我创建的卡路里计算器来实现。这是一个使用谷歌最新的 Gemini 1.5 Pro 模型来估算食物卡路里的 Python 应用程序。它通过图像识别和分析,将食物转化为可量化的数据,帮助用户更好地了解自己的饮食。
这个应用程序需要两个输入:一个关于食物的问题和食物的图像。输出包括对问题的回答、图像中食物的总卡路里数以及每种食物项目的卡路里分解,让你对每一餐都心中有数。
在本文中,我将详细解释从头开始构建这个应用程序的完整过程,包括如何使用谷歌的 Gemini 1.5 Pro(一个大型语言生成 AI 模型),以及如何使用 Streamlit 开发前端用户界面。我会分享我在实践中遇到的问题和解决方法,让读者能够更好地理解并应用这些技术。
值得注意的是,随着 AI 技术的进步,数据科学家应该逐渐从传统的深度学习转向生成式 AI,从而革新他们的角色。这也是我撰写本文的主要目的。希望通过这个项目,能够激发更多人对生成式 AI 的兴趣和应用。
让我们首先简要介绍一下 Gemini 1.5 Pro 和 Streamlit 框架,因为它们是卡路里计算器基础设施中的主要组件。我会用通俗易懂的语言解释它们的工作原理和优势。
Gemini 1.5 Pro:强大的多模态 AI 模型
Gemini 1.5 Pro 是谷歌开发的一款高级 AI 语言模型。作为最新版本,它在响应速度和自然语言处理及应用程序构建的准确性方面都有显著提升。它不仅能理解复杂的文本,还能处理图像信息,为多模态应用提供了强大的支持。
与只能处理文本提示的谷歌 Gemini Pro 模型相比,Gemini 1.5 Pro 最大的优势在于其多模态能力。它能够同时处理文本和图像,这使得它在诸如卡路里计算器这样的应用中表现出色。通过分析图像,模型可以识别食物种类和估算份量,从而更准确地计算卡路里。
这个模型的工作原理是理解和生成文本,就像人类一样,基于给定的提示。在本文中,该模型将用于为我们的卡路里计算器生成人物。通过预定义的提示,我们可以引导模型按照我们的意愿输出结果。这种灵活性使得 Gemini 1.5 Pro 在各种应用场景中都非常实用。
Gemini 1.5 Pro 可以集成到其他应用程序中,以增强其 AI 能力。在当前的应用程序中,该模型使用生成式 AI 技术将上传的图片分解为单独的食物项目。基于其营养数据库对食物项目的上下文理解,它使用图像识别和目标检测来估算卡路里数,然后汇总图像中所有项目的卡路里总数。这一过程模仿了人类营养师的工作方式,但速度更快、效率更高。
Streamlit:简化 Web 应用开发的利器
Streamlit 是一个开源的 Python 框架,它将负责管理用户界面。该框架简化了 Web 开发,因此在整个项目中,你不需要为前端编写任何 HTML 和 CSS 代码。这意味着开发者可以专注于后端逻辑和 AI 模型的集成,而无需花费大量时间在前端开发上。
使用 Streamlit,你可以轻松创建交互式 Web 应用程序。它提供了各种 UI 组件,如按钮、文本输入框、滑块等,这些组件可以与 Python 代码无缝集成。这使得开发过程非常直观和高效。
Streamlit 的另一个优点是其热加载功能。当你修改代码时,应用程序会自动刷新,无需手动重启。这大大提高了开发效率,让你能够快速迭代和测试你的应用程序。
让我们深入到构建应用程序中。我将向你展示如何通过 5 个清晰的步骤构建应用程序。我会提供详细的代码示例和解释,确保你能够轻松地跟随我的步骤。
1. 设置文件夹结构
首先,进入你最喜欢的代码编辑器(比如 VS Code),并开始一个项目文件。例如,将其命名为 Calories-Counter。这是当前的工作目录。在终端中创建一个虚拟环境 (venv),激活它,然后创建以下文件:.env,calories.py,requirements.txt。
以下是文件夹结构的建议样式:
Calories-Counter/
├── venv/
│ ├── xxx
│ ├── xxx
├── .env
├── calories.py
└── requirements.txt
请注意,Gemini 1.5 Pro 最适合与 Python 版本 3.9 及以上版本配合使用。确保你的 Python 环境满足这个要求,以避免潜在的兼容性问题。
2. 获取 Google API 密钥
与其他 Gemini 模型一样,Gemini 1.5 Pro 目前免费供公众使用。访问它需要获取一个 API 密钥,你可以从 Google AI Studio 通过访问此 链接 的“获取 API 密钥”获得密钥。一旦密钥生成,将其复制以便稍后在代码中使用。将此密钥作为环境变量保存到 .env 文件中,如下所示。
GOOGLE_API_KEY="在此处粘贴生成的密钥"
API 密钥是访问 Google AI 服务的凭证,务必妥善保管,不要泄露给他人。建议将其存储在环境变量中,而不是直接写入代码,以提高安全性。
3. 安装依赖
在 requirements.txt 文件中输入以下库:
- streamlit
- google-generativeai
- python-dotenv
在终端中,通过以下命令安装 requirements.txt 中的库:
python -m pip install -r requirements.txt
这些库是构建卡路里计算器所必需的。streamlit
用于创建用户界面,google-generativeai
用于访问 Gemini 1.5 Pro 模型,python-dotenv
用于加载环境变量。确保所有库都成功安装,以便后续步骤能够顺利进行。
4. 编写 Python 脚本
现在,让我们开始在 calories.py 中编写 Python 脚本。首先,通过以下代码导入所有必需的库:
from dotenv import load_dotenv
import streamlit as st
import os
import google.generativeai as genai
from PIL import Image
以下是导入的各个模块的用途:
dotenv
:由于此应用程序将从 Google API 密钥环境变量进行配置,因此使用 dotenv 从 .env 文件加载配置。streamlit
:用于创建前端的交互式用户界面。os
模块:用于在执行文件操作(如从 .env 文件获取 API 密钥)时处理当前工作目录。google.generativeai
模块:给予我们访问即将使用的 Gemini 模型的权限。PIL
:是一个用于管理图像文件格式的 Python 图像库。
以下几行代码将配置 API 密钥并从环境变量存储中加载它们。
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
load_dotenv()
定义一个函数,当被调用时,将加载 Gemini 1.5 Pro 并获取响应,如下所示:
def get_gemini_response(input_prompt, image, user_prompt):
model = genai.GenerativeModel('gemini-1.5-pro-latest')
response = model.generate_content([input_prompt, image[0], user_prompt])
return response.text
在上述函数中,你可以看到,它接收一个输入提示,该提示将在脚本进一步向下指定,一个用户提供的图像和一个用户提示/问题。所有这些将输入到 Gemini 模型中以返回响应文本。
由于 Gemini 1.5 Pro 期望输入图像的形式为字节数组,接下来需要编写一个函数来处理上传的图像,将其转换为字节。
def input_image_setup(uploaded_file):
# 检查是否已上传文件
if uploaded_file is not None:
# 读取文件为字节
bytes_data = uploaded_file.getvalue()
image_parts = [
{
"mime_type": uploaded_file.type, # 获取上传文件的 mime 类型
"data": bytes_data
}
]
return image_parts
else:
raise FileNotFoundError("未上传文件")
接下来,指定输入提示,这将决定应用程序的行为。在此,我们只是简单地告诉 Gemini 如何处理应用程序将由用户提供的文本和图像。
input_prompt = """
你是一名营养学专家。
你应该根据所见的上传图像回答用户在输入中输入的问题。
你还应该查看上传图像中发现的食物项目并计算总卡路里数。
还要按以下格式提供每种食物项目的卡路里摄入详细信息:
1. 项目 1 - 卡路里数
2. 项目 2 - 卡路里数
----
----
"""
下一步是初始化 Streamlit 并为你的卡路里计算器创建一个简单的用户界面。
st.set_page_config(page_title="Gemini 卡路里计算器")
st.header("卡路里计算器")
input = st.text_input("询问任何与你的食物相关的问题:", key="input")
uploaded_file = st.file_uploader("上传食物图像", type=["jpg", "jpeg", "png"])
image = ""
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption="上传的图像。", use_column_width=True) # 显示图像
submit = st.button("提交并处理") # 创建“提交并处理”按钮
上述步骤包含了应用程序的所有部分。这时候,用户可以打开我的应用,输入问题并上传食物的照片了。
最后,让我们将所有部分结合在一起,这样一来,当用户点击“提交并处理”按钮时,将获得所需的响应文本。
if submit:
image_data = input_image_setup(uploaded_file)
response = get_gemini_response(input_prompt, image_data, input)
st.subheader("响应如下")
st.write(response)
5. 运行脚本并与您的应用程序互动
现在应用程序开发已完成,你可以使用以下命令在终端中执行它:
streamlit run calories.py
要与应用程序互动并查看其性能,请使用生成的本地 URL 或网络 URL 在浏览器中查看你的 Streamlit 应用程序。
这是卡路里计算器首次在浏览器中打开时的样子,图由作者提供。
一旦用户提出问题并上传图像,显示如下:
卡路里计算器中包含用户输入问题和上传图像的示例图像,图由作者提供。应用程序中加载的食物图像:图片来源于 Odiseo Castrejon on Unsplash
用户点击“提交并处理”按钮后,页面底部生成的响应如下图所示。
卡路里计算器生成响应的示例图像,图由作者提供
为了外部访问,考虑使用 AWS、Heroku、Streamlit Community Cloud 等云服务部署应用程序。在这种情况下,我们将使用 Streamlit Community Cloud 免费部署应用程序。
在应用程序屏幕的右上角,点击“Deploy”并按照提示完成部署。
部署后,你可以将生成的应用程序 URL 分享给其他用户。
潜在风险与改进方向
与其他 AI 应用程序一样,输出的结果是模型的最佳估算,因此,在完全依靠应用程序之前,请注意以下一些潜在风险:
- 卡路里计算器可能会误分类某些食物项目,从而导致卡路里数错误。
- 该应用程序无法基于上传的图像估算食物的大小——部分。这可能导致错误。
- 过度依赖该应用程序可能会导致压力和心理健康问题,因为人们可能会对计算卡路里数和担心结果不够准确产生痴迷。
为了帮助减少使用卡路里计算器带来的风险,以下是一些可能的增强功能,可整合到其开发中:
- 增加图像的上下文分析,这将有助于评估所分析食物部分的大小。例如,可以构建应用程序,使得包括在食物图像中的标准对象(如勺子)可以用作测量食物项目大小的参考点。这将减少结果总卡路里的错误。
- 谷歌可以改进其训练集中特定食物的多样性,以减少误分类错误。他们可以将训练集扩展到包括更多文化中的食物项目,这样即使是罕见的非洲食物项目也可以被识别。
通过不断的改进和优化,我们可以让卡路里计算器更加准确、可靠,并为用户提供更好的体验。同时,我们也应该意识到 AI 技术的局限性,避免过度依赖,理性看待其输出结果。