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

在上一篇利用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 库:

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 的响应。")

关键点解析

  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.xdnf.cn/news/35858.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Web】AlpacaHack Round 7 (Web) 题解

Treasure Hunt flag在md5值拼接flagtxt的文件里,如 d/4/1/d/8/c/d/9/8/f/0/0/b/2/0/4/e/9/8/0/0/9/9/8/e/c/f/8/4/2/7/e/f/l/a/g/t/x/t 访问已经存在的目录状态码是301 访问不存在的目录状态码是404 基于此差异可以写爆破脚本 这段waf可以用url编码绕过 做个lab …

操作系统——文件系统

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt,仅供学习交流使用,谢谢。 文件系统是操作系统中以文件方式管理计算机软件资源的软件和被管理的文件和数据结构(如目录和索引表等)的集合。从系统角度来看,文件系统是…

java面向对象实验——扫雷+24点

扫雷 窗口绘制: GameWin package com.sxt;import javax.swing.*;public class GameWin extends JFrame {void launch(){this.setVisible(true);this.setSize(500, 500);this.setLocationRelativeTo(null);this.setTitle("SWE23070扫雷游戏");this.setD…

GPU 调度策略架构与CUDA运行机制(二)

市面上有很多GPU厂家,他们产品的软硬件架构各不相同,但是核心往往差不多,整明白了一个基本上就可以触类旁通了。针对当前gpu底层的一些架构以及硬件层一些调度策略的话估计大部分人就很难说的上熟悉了,这个不是大家的错&#xff0…

ddos攻击防御的方法有哪些

DDoS攻击,即分布式拒绝服务攻击(Distributed Denial of Service),是一种恶意的网络攻击方式,旨在通过发送大量流量或请求到目标服务器、服务或网络,使其资源耗尽,无法处理合法用户的请求,从而导致服务中断或…

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

集成 Applitools 进行视觉回归测试(快速入门) 简介Applitools 的核心特点Applitools 的应用场景1. 准备工作2. 获取示例项目2.1 下载示例代码2.2 安装依赖2.3 选择测试运行方式3. 代码解析3.1 测试用例示例4. 运行测试4.1 设置 Applitools API 变量4.2 设置 Applitools Eyes …

RuoYi中数据分页功能实现的步骤(nvliz)

目录 前言 数据分页的作用 RuoYi中的实现步骤 前端的显示界面(实例介绍) 源码分析(前端) Pagination(分页组件)介绍 前端:getList()(方法源码分析) 源码分析(后端) 后端:List()…

HarmonyOS 5.0应用开发——全局广播的使用

【高心星出品】 文章目录 全局广播的使用公共事件接受系统公共事件原理 发布与订阅自定义公共事件订阅系统事件 全局广播的使用 全局广播可以用来做应用间通信,进程间通信,包含订阅、发布等功能。 公共事件 CES(Common Event Service&…

ceph存储池

1、存储池 1、存储池的概念 存储池就是ceph的逻辑分区,专门用来存储对象的 特点 将文件切片成对象,通过hash算法,找到存储池中的pg,池中的pg根据crush算法找到osd节点 存储中的PG数量对性能有重要的影响,过多和过少…

Ollama记录

先在官网下载Ollama 模型下载 ollama run qwen2:0.5b 可以快速部署很多模型 方便 可以替换openai api key from openai import OpenAIclient OpenAI(base_url https://127.0.0.1:11434/v1,api_keyollama, # required, but unused )response client.chat.completions.…

锻造船用发动机动力系统,铸强船舶“心脏”

船舶是海洋、湖泊及河流中重要的水上交通工具,不仅能够促进海上经济的发展,还能够保卫国家的制海权。船舶动力装置,也就是船舶的核心动力源——船用发动机动力系统对船舶的重要作用不言自明,关系到船舶的性能质量,能够…

LIN状态管理

文章目录 前言一、状态管理二、实现过程三、response_error信号的变化条件四、节点内部报告五、测试应用方式1:LIN ISC方式2:CAPL脚本方式 前言 在LIN专栏的文章中,我们介绍了 LIN的网络管理:LIN网络管理:休眠&唤…

云帆在线学习考试系统对国产化数据库的支持情况说明

云帆在线学习考试系统对国产化数据库的支持情况说明 云帆学习考试系统是一款优秀的学习和考试系统!多年以来一直深耕在线教育板块,积累了丰富的行业经验,多年来的产品和技术沉淀,服务了众多政府机构、知名高校、企事业单位。 今…

反向传播算法中的误差项

背景 在反向传播算法中,我们需要计算每个神经元的误差项,以便更新网络中的权重。对于输出层的神经元,误差项的计算公式如下: 其中: E是损失函数(例如均方误差)。 zk 是输出层神经元的加权输入&a…

如何高效整合金蝶云星辰采购入库单与聚水潭系统

星辰-采购入库单集成到聚水潭的技术实现 在企业信息化管理中,数据的高效流转和准确对接至关重要。本文将分享一个实际案例:如何通过轻易云数据集成平台,将金蝶云星辰V2系统中的采购入库单数据无缝集成到聚水潭系统中,实现业务流程…

Uniapp的App环境下使用Map获取缩放比例

概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…

C++入门项目:Linux下C++轻量级Web服务器 项目详解(小白篇)

拿到一个项目首先先跑通,然后再慢慢来看代码,关于怎么将这个项目跑通,上一篇已经讲过,感兴趣的小伙伴可以移步下面的链接,或者其他博主的教程。 C入门项目:Linux下C轻量级Web服务器 跑通|运行|测试&#xf…

RuoYi集成Drools,并实现数据库获取规则

Drools是一个开源的业务规则管理系统(BRMS)和规则引擎,它允许开发者以接近自然语言的形式定义业务规则,并将这些规则应用到应用程序中,实现业务逻辑的自动化和决策过程的优化。Drools基于Java语言开发,使用…

什么是API接口?如何调用API接口?

一、什么是 API 接口 定义 API(Application Programming Interface)即应用程序编程接口。它是一组定义好的规则和协议,允许不同的软件应用程序之间进行通信和交互。可以把 API 想象成是餐厅的服务员,当顾客(一个软件应…