在上一篇利用gpt-4o分析图像的基础上,进一步将基于 Python 的 Streamlit 库,结合 OpenAI 的 API,构建一个简洁易用的有界面图片内容分析应用。通过该应用,用户可以轻松浏览本地图片,并获取图片的详细描述。
调用gpt-4o,可基于ManyiAPI聚合接口站:https://api.manyi88.top, ManyiAPI注册链接(注册优惠)
目录
- 项目简介
- 项目环境搭建
- 代码详解
- 导入所需库
- 列出指定目录下的图片文件
- 构建 Streamlit 界面
- 与 OpenAI API 交互
- 运行应用
- 总结与扩展
项目简介
本项目旨在通过构建一个基于网页界面的应用,使用户能够:
- 浏览本地特定目录下的所有图片文件(支持 JPG、JPEG、PNG 格式)。
- 选择任意图片并在界面中显示。
- 使用 OpenAI 的 GPT-4 模型对选中的图片内容进行描述和分析。
项目环境搭建
在开始编码之前,请确保您的开发环境中已安装以下软件和库:
- Python 3.7 及以上版本
- Streamlit:用于快速构建网页应用
- Pillow (PIL):用于处理图像文件
- requests:用于发送 HTTP 请求
- OpenAI Python 库:用于与 OpenAI API 交互
安装必要的 Python 库可以使用以下命令:
pip install streamlit pillow requests openai
此外,您需要获取 OpenAI 的 API 密钥,并将其设置为环境变量 OPENAI_API_KEY
。可以在 ManyiAPI聚合接口站:https://api.manyi88.top, ManyiAPI注册链接(注册优惠) 获取 API 密钥。
代码详解
下面我们将逐步解析实现图片内容分析应用的代码。
导入所需库
首先,导入所有需要的 Python 库:
import streamlit as st
import os
from PIL import Image
import base64
import requests
streamlit
用于构建网页界面。os
用于文件和目录操作。PIL
(Python Imaging Library)用于处理图像文件。base64
用于对图像进行编码。requests
用于发送 HTTP 请求与 OpenAI API 交互。
列出指定目录下的图片文件
定义一个函数,用于遍历指定的根目录及其所有子目录,列出所有符合指定扩展名(JPG、JPEG、PNG)的图片文件。
def list_files_in_all_directories(root_directory, extensions):files = []for dirpath, _, filenames in os.walk(root_directory):for file in filenames:if file.lower().endswith(extensions):files.append(os.path.join(dirpath, file))return files
注意:为了确保文件扩展名的匹配不区分大小写,使用 file.lower().endswith()
方法。
构建 Streamlit 界面
下面的代码构建了 Streamlit 的网页界面,包含标题、文件选择下拉框以及图片展示区域。
# 设置应用标题
st.title("图片内容分析器")# 设置图片目录
current_directory = 'images/'# 获取所有符合条件的图片文件
files = list_files_in_all_directories(current_directory, (".jpg", ".jpeg", ".png"))# 如果没有找到图片,显示提示信息
if not files:st.warning("在指定目录下未找到 JPG 或 PNG 格式的图片文件。")
else:# 下拉框用于选择图片文件selected_file = st.selectbox("选择一张图片", files)# 显示选中的图片if selected_file:image = Image.open(selected_file)st.image(image, caption=os.path.basename(selected_file), use_column_width=True)
说明:
st.title
设置页面标题。st.selectbox
创建一个下拉菜单,列出所有找到的图片文件供用户选择。st.image
显示选中的图片,并自动适应列宽。
与 OpenAI API 交互
接下来,实现将选中的图片发送给 OpenAI 的 GPT-4 模型进行描述和分析,并在界面中显示结果。
# 从环境变量中获取 OpenAI API 密钥
default_key = "sk-***" # 默认令牌
api_url = "https://api.manyi88.top/v1" #ManyiAPI聚合接口站:https://api.manyi88.top, [ManyiAPI注册链接(注册优惠)]if not api_key:st.error("未设置 OpenAI API 密钥。请在环境变量中设置 OPENAI_API_KEY。")
else:# 定义函数,将图片编码为 base64 字符串def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')# 如果有选中的文件,进行编码和 API 请求if selected_file:image_path = selected_filebase64_image = encode_image(image_path)headers = {"Content-Type": "application/json","Authorization": f"Bearer {api_key}"}payload = {"model": "gpt-4","messages": [{"role": "user","content": "Describe what you see in the image."},{"role": "user","content": f"![image](data:image/jpeg;base64,{base64_image})"}],"max_tokens": 3000}# 发送 POST 请求到 OpenAI APItry:response = requests.post("https://api.manyi88.top/v1/chat/completions", headers=headers, json=payload)response.raise_for_status()response_content = response.json()['choices'][0]['message']['content']st.subheader("图片描述")st.write(response_content)except requests.exceptions.RequestException as e:st.error(f"请求 OpenAI API 失败: {e}")except KeyError:st.error("无法解析 OpenAI API 的响应。")
关键点解析:
-
获取 API 密钥:
- 从环境变量
OPENAI_API_KEY
获取 API 密钥。若未设置,显示错误信息。ManyiAPI注册链接(注册优惠)
- 从环境变量
-
图片编码:
- 使用
base64
将图片文件编码为字符串,以便嵌入到 API 请求中。
- 使用
-
构建 API 请求:
- Headers:包括内容类型和授权信息。
- Payload:
- 使用
gpt-4
模型。 messages
包含用户的指令和图片内容。为了传递图片,使用 Markdown 语法嵌入 base64 编码的图片。max_tokens
设置生成文本的最大长度。
- 使用
-
发送请求并处理响应:
- 使用
requests.post
发送 POST 请求。 - 若请求成功,解析响应内容并在界面中显示图片描述。
- 若请求失败或响应格式异常,显示相应错误信息。
- 使用
注意:
-
OpenAI 的 Chat API 对图片的处理能力有限,直接传递 base64 编码的图片可能无法达到预期效果。建议使用专门的图像理解模型或先将图片上传至可公开访问的 URL,再传递 URL 给 API。
-
目前提供的代码假设 OpenAI API 可以处理嵌入的 base64 图片,但实际情况可能需要根据 OpenAI 的最新文档调整。
运行应用
完成代码编写后,可以使用以下命令运行 Streamlit 应用:
streamlit run your_script.py
将 your_script.py
替换为实际的 Python 脚本名称。
启动后,Streamlit 会在浏览器中打开应用界面。用户可以选择目录下的图片,查看图片并获取由 GPT-4 模型生成的描述。