使用 Streamlit +gpt-4o实现有界面的图片内容分析

news/2024/12/11 16:37:59/

在上一篇利用gpt-4o分析图像的基础上,进一步将基于 Python 的 Streamlit 库,结合 OpenAI 的 API,构建一个简洁易用的有界面图片内容分析应用。通过该应用,用户可以轻松浏览本地图片,并获取图片的详细描述。
调用gpt-4o,可基于ManyiAPI聚合接口站:https://api.manyi88.top, ManyiAPI注册链接(注册优惠)

目录

  1. 项目简介
  2. 项目环境搭建
  3. 代码详解
    • 导入所需库
    • 列出指定目录下的图片文件
    • 构建 Streamlit 界面
    • 与 OpenAI API 交互
  4. 运行应用
  5. 总结与扩展

项目简介

本项目旨在通过构建一个基于网页界面的应用,使用户能够:

  • 浏览本地特定目录下的所有图片文件(支持 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 库:

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)的图片文件。

python">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 的网页界面,包含标题、文件选择下拉框以及图片展示区域。

python"># 设置应用标题
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 模型进行描述和分析,并在界面中显示结果。

python"># 从环境变量中获取 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 的响应。")

关键点解析

  1. 获取 API 密钥

    • 从环境变量 OPENAI_API_KEY 获取 API 密钥。若未设置,显示错误信息。ManyiAPI注册链接(注册优惠)
  2. 图片编码

    • 使用 base64 将图片文件编码为字符串,以便嵌入到 API 请求中。
  3. 构建 API 请求

    • Headers:包括内容类型和授权信息。
    • Payload
      • 使用 gpt-4 模型。
      • messages 包含用户的指令和图片内容。为了传递图片,使用 Markdown 语法嵌入 base64 编码的图片。
      • max_tokens 设置生成文本的最大长度。
  4. 发送请求并处理响应

    • 使用 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 模型生成的描述。


http://www.ppmy.cn/news/1554269.html

相关文章

springboot系列--拦截器加载原理

一、拦截器加载原理 拦截器是在容器启动时,就创建并加载好,此时并未放入拦截器链中,只是放在一个拦截器集合当中,当一个请求进来之后,会通过匹配路径,查看是否有命中集合中的拦截器的拦截路径,如…

安全架构评审

安全架构评审 1.概述2.安全设计原则3.美团安全架构评审模型安全需求分析架构review攻击面分析和威胁建模攻击面分析威胁列表 1.概述 完整的安全评审会包含安全架构评审、安全代码审核和安全测试三个手段 安全架构评审聚焦于探寻安全设计中的漏洞,以宏观视野全面考…

IoTDB Allocate WAL Buffer Fail Because out of memory

问题及现象 时序数据库 IoTDB 集群报错: The write is rejected because the wal directory size has reached the threshold 53687091200 bytes. You may need to adjust the flush policy of the storage storageengine or the IoTConsensus synchronization pa…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应,但是去点击应用图标就能正常运行,通常是因为你在安装git之后改变了它的目录名称或者位置,我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

菜鸟每日刷牛客HJ2

菜鸟每日刷牛客 HJ2 计算某字符出现次数 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) 数据范围: 1≤n≤1000 输…

word poi-tl 表格功能增强,实现表格功能垂直合并

目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加(插件实现)MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中,word文档需要垂直合并表格&…

【力扣】155. 最小栈(Java版)

文章目录 1. 题目2. 题目分析3. 代码示例 1. 题目 在线OJ 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop()…

硬件设计-TINA新建元器件仿真模型

目录 简介: 项目内容: 过程详情: 问题处理: 简介: 有时候,需要一些其他公司的元器件来进行仿真,这就需要使用到TINA的新建宏向导。 TINA是很好用的原理图仿真软件,先是绘制原理图,然后进行电路原理的仿真,如果原理图仿真,电路功能符合设计要求,就可以接下来把…