你有没有想过,当你吃晚饭时摄入了多少卡路里?我经常这样想。如果你能随便拍个盘子的照片,通过应用程序就能算出卡路里,那不是很棒吗?
我创建的这个卡路里计算器可以帮助你实现这一目标。这是一个使用谷歌的 Gemini-1.5-Pro-Latest 模型估算食物卡路里的 Python 应用程序。
该应用程序需要两个输入:一个关于食物的问题和食物的图像。它会输出对问题的答案、图像中食物的总卡路里数以及每种食物项目的卡路里分解。
在本文中,我将解释从头开始构建应用程序的整个过程,使用谷歌的 Gemini-1.5-pro-latest(一个大型语言生成 AI 模型),以及我如何使用 Streamlit 开发前端。
值得注意的是,随着 AI 的进步,数据科学家应逐渐从传统的深度学习转向生成性 AI 来革新他们的角色。这也是我写这篇文章的主要目的。
让我简要介绍一下 Gemini-1.5-pro-latest 和 Streamlit 框架,因为它们是该卡路里计算器基础设施中的主要组件。
Gemini-1.5-pro-latest 是谷歌开发的一个高级 AI 语言模型。作为最新版本,它在响应时间和自然语言处理及应用程序构建的准确性方面均有提升。
这是一个多模态模型,能够处理文本和图像,这比只处理文本提示的谷歌 Gemini-pro 模型是一大改进。
该模型通过理解和生成文本工作,就像人类一样,基于给定的提示。在本文中,该模型将用于为我们的卡路里计算器生成人物。
Gemini-1.5-pro-latest 可以集成到其他应用程序中以增强其 AI 能力。在当前应用程序中,该模型使用生成性 AI 技术将上传的图片分解为单独的食物项目。基于其营养数据库对食物项目的上下文理解,它使用图像识别和目标检测来估算卡路里数,然后汇总图像中所有项目的卡路里总数。
Streamlit 是一个开源的 Python 框架,将负责管理用户界面。该框架简化了 Web 开发,因此在整个项目中,你不需要为前端编写任何 HTML 和 CSS 代码。
让我们深入到构建应用程序中。
我将向你展示如何通过 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 及以上版本配合使用。
2. 获取 Google API 密钥
与其他 Gemini 模型一样,Gemini-1.5-pro-latest 目前免费供公众使用。访问它需要获取一个 API 密钥,你可以从 Google AI Studio 通过访问此 链接 的“获取 API 密钥”获得密钥。一旦密钥生成,将其复制以便稍后在代码中使用。将此密钥作为环境变量保存到 .env 文件中,如下所示。
GOOGLE_API_KEY="在此处粘贴生成的密钥"
3. 安装依赖
在 requirements.txt 文件中输入以下库:
- streamlit
- google-generativeai
- python-dotenv
在终端中,通过以下命令安装 requirements.txt 中的库:
python -m pip install -r requirements.txt
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-latest 并获取响应,如下所示:
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 应用程序一样,输出的结果是模型的最佳估算,因此,在完全依靠应用程序之前,请注意以下一些潜在风险:
- 卡路里计算器可能会误分类某些食物项目,从而导致卡路里数错误。
- 该应用程序无法基于上传的图像估算食物的大小——部分。这可能导致错误。
- 过度依赖该应用程序可能会导致压力和心理健康问题,因为人们可能会对计算卡路里数和担心结果不够准确产生痴迷。
为了帮助减少使用卡路里计算器带来的风险,以下是一些可能的增强功能,可整合到其开发中:
- 增加图像的上下文分析,这将有助于评估所分析食物部分的大小。例如,可以构建应用程序,使得包括在食物图像中的标准对象(如勺子)可以用作测量食物项目大小的参考点。这将减少结果总卡路里的错误。
- 谷歌可以改进其训练集中特定食物的多样性,以减少误分类错误。他们可以将训练集扩展到包括更多文化中的食物项目,这样即使是罕见的非洲食物项目也可以被识别。