【多模态处理】利用GPT逐一读取本地图片并生成描述并保存,支持崩溃后从最新进度恢复
【多模态处理】利用GPT逐一读取本地图片并生成描述,支持崩溃后从最新进度恢复题
- 代码功能:
- 核心功能
- 最后碎碎念
- 代码(使用中转平台url):
- 代码(直接使用openai的key)
- 注意
代码功能:
读取本地图片文件,并使用GPT模型生成图像的元数据描述。生成的结果会保存到一个JSON文件中。代码还包含了检查点机制,以便在处理过程中程序崩溃时能够从最新的位置继续生成。
核心功能
- 读取文件并设置变量:
- 从JSON文件中读取图像路径、宽度和高度等变量。
- 根据读取的变量设置prompt,调用GPT模型。
- 调用GPT模型:
- 使用openai.ChatCompletion.create方法调用GPT模型,生成图像的元数据描述。
- 将生成的结果保存到JSON文件中。
- 保存输出到JSON:
- 每处理一张图片,就将结果追加到JSON文件中。
- 使用检查点机制:
- 每处理一张图片后,保存当前处理的位置。
- 如果处理过程中出现错误,程序可以从上次保存的位置继续处理。
- 处理本地图片文件:
- 从本地文件夹读取图片文件,并对每张图片进行处理。
最后碎碎念
提供一个模板,方便大家理解其思想,使用的时候,可以和openai最基本的代码对比着看
代码(使用中转平台url):
使用中转平台(需要设置中转平台url):
from PIL import Image
import os
import base64
import openai
import pickle
import json# 设置API密钥和中转平台URL
API_SECRET_KEY = "your_api_secret_key"
BASE_URL = "https://api.your_base_url.com/v1"# 图像文件夹路径
image_directory_path = 'your_image_directory_path'# 设置要处理的图像数量
number_of_images_to_process = 50# 输出文件路径
output_file_path = "output_results.json"# 初始化计数器
image_counter = 0# 读取 JSON 数据文件
data_file = 'your_data_file.json'
with open(data_file, 'r') as f:data = json.load(f)def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')def get_image_details(image_path):"""获取图像的详细信息,包括图像ID和尺寸。参数:image_path (str): 图像文件的路径。返回:tuple: 包含图像ID(文件名,不包括扩展名)和图像尺寸(宽度,高度)的元组。示例:get_image_details('path/to/image.jpg') -> ('image', (800, 600))"""image_filename = os.path.basename(image_path)image_id = os.path.splitext(image_filename)[0]with Image.open(image_path) as img:image_size = img.sizereturn image_id, image_sizedef chat_completions(image_path, width, height):base64_image = encode_image(image_path)image_id, image_size = get_image_details(image_path)client = OpenAI(api_key=API_SECRET_KEY, base_url=BASE_URL)response = openai.ChatCompletion.create(model="gpt-4",messages=[{"role": "system", "content": "You are an assistant that provides metadata information about images."},{"role": "user", "content": f"Image ID: {image_id}, Width: {width}, Height: {height}"}],max_tokens=3000,timeout=999,)return response# 初始化结果字典
results_dict = {}# 检查是否存在检查点文件
checkpoint_file = "checkpoint.pkl"
if os.path.exists(checkpoint_file):with open(checkpoint_file, "rb") as f:start_index = pickle.load(f)
else:start_index = 0# 处理图像文件
for i, image in enumerate(data[start_index:], start=start_index):image_name = image['image_path']image_file = os.path.join(image_directory_path, image_name)image_width = image['width']image_height = image['height']if image_name.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')):try:response = chat_completions(image_file, image_width, image_height)result = {image_name: response.choices[0].message['content']}with open(output_file_path, "a") as output_file:output_file.write(json.dumps(result) + "\n")except Exception as e:print(f"Error processing image {image_name}: {e}")continueimage_counter += 1if image_counter >= number_of_images_to_process:breakwith open(checkpoint_file, "wb") as f:pickle.dump(i+1, f)
代码(直接使用openai的key)
from PIL import Image
import os
import base64
import openai
import pickle
import json# 设置API密钥
API_SECRET_KEY = "your_api_secret_key"# 图像文件夹路径
image_directory_path = 'your_image_directory_path'# 设置要处理的图像数量
number_of_images_to_process = 50# 输出文件路径
output_file_path = "output_results.json"# 初始化计数器
image_counter = 0# 读取 JSON 数据文件
data_file = 'your_data_file.json'
with open(data_file, 'r') as f:data = json.load(f)def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')def get_image_details(image_path):"""获取图像的详细信息,包括图像ID和尺寸。参数:image_path (str): 图像文件的路径。返回:tuple: 包含图像ID(文件名,不包括扩展名)和图像尺寸(宽度,高度)的元组。示例:get_image_details('path/to/image.jpg') -> ('image', (800, 600))"""image_filename = os.path.basename(image_path)image_id = os.path.splitext(image_filename)[0]with Image.open(image_path) as img:image_size = img.sizereturn image_id, image_sizedef chat_completions(image_path, width, height):base64_image = encode_image(image_path)image_id, image_size = get_image_details(image_path)openai.api_key = API_SECRET_KEYresponse = openai.ChatCompletion.create(model="gpt-4",messages=[{"role": "system", "content": "You are an assistant that provides metadata information about images."},{"role": "user", "content": f"Image ID: {image_id}, Width: {width}, Height: {height}"}],max_tokens=3000,timeout=999,)return response# 初始化结果字典
results_dict = {}# 检查是否存在检查点文件
checkpoint_file = "checkpoint.pkl"
if os.path.exists(checkpoint_file):with open(checkpoint_file, "rb") as f:start_index = pickle.load(f)
else:start_index = 0# 处理图像文件
for i, image in enumerate(data[start_index:], start=start_index):image_name = image['image_path']image_file = os.path.join(image_directory_path, image_name)image_width = image['width']image_height = image['height']if image_name.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')):try:response = chat_completions(image_file, image_width, image_height)result = {image_name: response.choices[0].message['content']}with open(output_file_path, "a") as output_file:output_file.write(json.dumps(result) + "\n")except Exception as e:print(f"Error processing image {image_name}: {e}")continueimage_counter += 1if image_counter >= number_of_images_to_process:breakwith open(checkpoint_file, "wb") as f:pickle.dump(i+1, f)
注意
上面的代码,最后四行:(先判断处理图像数量是否大于规定处理图像数量,再保存checkpoint)
if image_counter >= number_of_images_to_process:break
with open(checkpoint_file, "wb") as f:pickle.dump(i+1, f)
有时候要替换逻辑为这样(先保存checkpoint,再判断处理图像数量是否大于规定处理图像数量)
with open(checkpoint_file, "wb") as f:pickle.dump(i+1, f)
if image_counter >= number_of_images_to_process:break
然后,每次程序运行结束时,比如5.jpg处理完,第二次运行程序,不是再处理一遍5.jpg,而是从6.jpg开始。但有的时候不用替换,也仍然从6.jpg开始,不知道为什么。
但确实下方替换后更好一点,因为有的时候break完后直接跳出循环,导致最后一次的i+1没有更新。
相关文章:
【多模态处理】利用GPT逐一读取本地图片并生成描述并保存,支持崩溃后从最新进度恢复
【多模态处理】利用GPT逐一读取本地图片并生成描述,支持崩溃后从最新进度恢复题 代码功能:核心功能最后碎碎念 代码(使用中转平台url):代码(直接使用openai的key) 注意 代码功能: 读…...
【rk3588】获取相机画面
需求:获取相机画面,并在连接HDMI线,在显示器上显示 查找设备 v4l2-ctl --list-devices H65 USB CAMERA: H65 USB CAMERA (usb-0000:00:14.0-1):/dev/video2/dev/video3播放视频 gst-launch-1.0 v4l2src device/dev/video22 ! video/x-ra…...

数据结构的基本概念
数据结构的基本概念 数据是什么? 数据 : 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别(二进制0|1)和处理的符号的集合。数据是计算机程序加工的原料。 早期计算机处理的…...

AI人工智能机器学习
AI人工智能 机器学习的类型(ML) 学习意味着通过学习或经验获得知识或技能。 基于此,我们可以定义机器学习(ML) 它被定义为计算机科学领域,更具体地说是人工智能的应用,它提供计算机系统学习数据和改进经验而不被明确编程的能力。 基本上&…...

试用AWS全新神器:Amazon Bedrock的「Open Artifacts」版Claude.ai Artifacts
Claude.ai的Artifacts真是太方便了。 GitHub上的AWS Samples仓库中有一个仿制Artifacts的应用程序。 Open Artifacts for Amazon Bedrock https://github.com/aws-samples/open_artifacts_for_bedrockhttps://github.com/aws-samples/open_artifacts_for_bedrock本文将介绍「…...
W3C XML 活动
关于W3C的XML活动,XML(可扩展标记语言)是一种用于描述、存储、传送及交换数据的标准。W3C(万维网联盟)对XML的发展起到了关键作用,推出了一系列的版本和相关的技术规范。 XML版本历史: XML 1.0&…...

vue请求springboot接口下载zip文件
说明 其实只需要按照普通文件流下载即可,以下是一个例子,仅供参考。 springboot接口 RestController RequestMapping("/api/files") public class FileController {GetMapping("/download")public ResponseEntity<Resource>…...

PySide6||QPushButton的QSS样式
1、狗狗拜按钮 QQ202484-03338 (online-video-cutter.com) /* QPushButton的基本样式 */ QPushButton { background-image:url(:/xxx/第1帧.png); /* 设置背景图片 */ background-repeat: no-repeat; /* 不重复背景图片 */ background-position: center; /* 将背景图片居中…...
HarmonyOS鸿蒙应用开发之ArkTS基本语法
ArkTS(Ark TypeScript)是一种基于TypeScript的扩展语言,专为鸿蒙应用开发设计。它在保持TypeScript基本语法风格的基础上,对TypeScript的动态类型特性施加了更严格的约束,并引入了静态类型,以减少运行时开销…...

Web开发-CSS篇-上
CSS的发展历史 CSS(层叠样式表)最初由万维网联盟(W3C)于1996年发布。CSS1是最早的版本,它为网页设计提供了基本的样式功能,如字体、颜色和间距。随着互联网的发展,CSS也不断演进: C…...
在mac上通过 MySQL 安装包安装 MySQL 之后,终端执行 mysql 命令报错 command not found: mysql
在 mac 上通过 MySQL 安装包安装 MySQL 之后,如果在终端中运行 mysql 命令时遇到 command not found: mysql 错误,通常是因为 MySQL 的二进制文件没有被添加到系统的 PATH 环境变量中。 解决方法:手动添加 MySQL 到 PATH 环境变量 1.找到 M…...

Unity入门4——常用接口
C#中常用类和接口 DateTime:表示某个时刻 DateTime.Now:拿到系统当前时间DtaTime.TimeOfDay:获取此实例当天的时间 Quaternion:用来旋转,采用四元数,由w(实部)和x,y,z(虚…...

职业教育云计算实验实训室建设应用案例
云计算作为信息技术领域的一次革命,正在深刻改变着我们的工作和生活方式。随着企业对云计算技术的依赖日益加深,对具备云计算技能的专业人才的需求也日益迫切。职业院校面临着培养符合行业标准的云计算人才的挑战。唯众凭借其在教育技术领域的专业经验&a…...

MySQL-MHA高可用配置及故障切换
目录 案例搭建 1:所有服务器关闭防火墙 2:设置hosts文件 3:安装 MySQL 数据库 4:修改参数 5:安装 MHA 软件 6:配置无密码认证 7:配置 MHA 8:模拟 master 故障 MHA(MasterHi…...

Sentinel 滑动时间窗口源码分析
前言: Sentinel 的一个重要功能就是限流,对于限流来说有多种的限流算法,比如滑动时间窗口算法、漏桶算法、令牌桶算法等,Sentinel 对这几种算法都有具体的实现,如果我们对某一个资源设置了一个流控规则,并…...

猎码安卓APP开发IDE,amix STUDIO中文java,HTML5开发工具
【无爱也能发电】Xili 2024/8/2 10:41:20 猎码安卓APP开发IDE,amix java开发工具 我研发这些只有一小部分理由是为了赚钱,更多是想成就牛逼的技术产品。 目前的产品就够我赚钱的,我持续更新就好了,没必要继续研究。 IDE不赚钱,谁…...

【Deep-ML系列】Linear Regression Using Gradient Descent(手写梯度下降)
题目链接:Deep-ML 这道题主要是要考虑矩阵乘法的维度,保证维度正确,就可以获得最终的theata import numpy as np def linear_regression_gradient_descent(X: np.ndarray, y: np.ndarray, alpha: float, iterations: int) -> np.ndarray:…...

NVIDIA A100 和 H100 硬件架构学习
目前位置NV各种架构代号: NVIDIA GPU 有多个代号和架构,这些架构对应不同的世代和硬件特性。以下是 NVIDIA 主要 GPU 架构及其计算能力(Compute Capability)代号的简要概述: Tesla 架构 G80、GT200 Compute Capabi…...
企业研发设计协同解决方案
新迪三维设计,20年深耕三维CAD 全球工业软件研发不可小觑的中国力量 2003-2014 年 新迪数字先后成为达 索SolidWorks、 ANSYS Spaceclaim、MSC等三维CAD/CAE 软件厂商的中国研发中心,深度参与国际 一流工业软件的研发过程,积累了丰富的 技术经…...

iOS 18(macOS 15)Vision 中新增的任意图片智能评分功能试玩
概述 在 WWDC 24 中库克“大厨”除了为 iOS 18 等平台重磅新增了 Apple Intelligence 以外,苹果也利用愈发成熟的机器学习引擎扩展了诸多内置框架,其中就包括 Vision。 想用本机人工智能自动为我们心仪的图片打一个“观赏分”吗?“如意如意&…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...