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

在上一篇利用gpt-4o分析图像的基础上,进一步将基于 Python 的 Streamlit 库,结合 OpenAI 的 API,构建一个简洁易用的有界面图片内容分析应用。通过该应用,用户可以轻松浏览本地图片,并获取图片的详细描述。

调用gpt-4o,可基于ManyiAPI聚合接口站:https://api.manyi88.topManyiAPI注册链接(注册优惠)

目录

  1. 项目简介
  2. 项目环境搭建
  3. 代码详解
  4. 运行应用
  5. 总结与扩展

项目简介

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

  • 浏览本地特定目录下的所有图片文件(支持 JPG、JPEG、PNG 格式)。
  • 选择任意图片并在界面中显示。
  • 使用 OpenAI 的 GPT-4 模型对选中的图片内容进行描述和分析。

项目环境搭建

在开始编码之前,请确保您的开发环境中已安装以下软件和库:

  • Python 3.7 及以上版本
  • Streamlit:用于快速构建网页应用
  • Pillow (PIL):用于处理图像文件
  • requests:用于发送 HTTP 请求
  • OpenAI Python 库:用于与 OpenAI API 交互

安装必要的 Python 库可以使用以下命令:

bash 复制代码
pip install streamlit pillow requests openai

此外,您需要获取 OpenAI 的 API 密钥,并将其设置为环境变量 OPENAI_API_KEY。可以在 ManyiAPI聚合接口站:https://api.manyi88.topManyiAPI注册链接(注册优惠) 获取 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_file
        base64_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 API
        try:
            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 密钥

  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 应用:

bash 复制代码
streamlit run your_script.py

your_script.py 替换为实际的 Python 脚本名称。

启动后,Streamlit 会在浏览器中打开应用界面。用户可以选择目录下的图片,查看图片并获取由 GPT-4 模型生成的描述。

相关推荐
伊一大数据&人工智能学习日志17 分钟前
Python爬虫——HTML中Xpath定位
爬虫·python·html
fendouweiqian1 小时前
python请求SSL问题
网络·python·ssl
fuvuof2 小时前
设计模式——单例模式和工厂模式
python·单例模式·设计模式
东方佑2 小时前
给图像去除水印攻
人工智能·python
Milk夜雨2 小时前
数据库进阶教程:结合编程实现动态数据操作
数据库·python·adb
tangjunjun-owen2 小时前
异常安全重启运行机制:健壮的Ai模型训练自动化
人工智能·python·安全·异常重运行或重启
江上挽风&sty2 小时前
python爬虫--小白篇【爬取B站视频】
爬虫·python
yivifu3 小时前
利用cnocr库完成中文扫描pdf文件的文字识别
python·pdf·numpy·pymupdf·cnocr
Bdawn3 小时前
【通义实验室】开源【文本生成图片】大模型
人工智能·python·llm