【跑实验05】利用CLIP中的图像编码器,如何遍历文件夹中的图像,将图像文件改为28*28的尺寸,然后输出到excel中的每一列,最后一列全都标记为0

文章目录

  • 一、初步实现
  • 二、警告信息的解决
  • 三、Excel的限制
  • 四、尝试解决

一、初步实现

要遍历文件夹中的图像并将其尺寸调整为28x28,并将结果输出到Excel中,可以按照以下步骤进行操作:

首先,确保您已经安装了Pandas库,用于处理Excel文件。可以使用以下命令安装它:

pip install pandas

然后,使用以下代码来遍历文件夹中的图像、调整尺寸并输出到Excel中:

import os
import torch
import clip
from PIL import Image
import pandas as pd# 加载预训练的CLIP模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)# 图像文件夹路径
folder_path = '/path/to/folder'  # 将此路径替换为图像文件夹的实际路径# 创建空DataFrame用于存储图像特征
df = pd.DataFrame()# 遍历图像文件夹
for filename in os.listdir(folder_path):if filename.endswith('.jpg') or filename.endswith('.png'):  # 仅处理.jpg和.png格式的图像文件image_path = os.path.join(folder_path, filename)# 加载和预处理图像image = Image.open(image_path).convert('RGB')image_resized = image.resize((28, 28))image_input = preprocess(image_resized).unsqueeze(0).to(device)# 图像编码with torch.no_grad():image_features = model.encode_image(image_input)# 将图像特征添加到DataFrame中image_features_list = image_features.squeeze().tolist()df[filename] = image_features_list# 在DataFrame的最后一列添加全为0的标记列
df['label'] = 0# 将DataFrame保存到Excel文件
output_path = '/path/to/output.xlsx'  # 将此路径替换为输出Excel文件的实际路径
df.to_excel(output_path, index=False)

请将代码中的/path/to/folder替换为包含图像文件的文件夹的实际路径,并将/path/to/output.xlsx替换为您想要保存输出Excel文件的实际路径。

这段代码会遍历指定的图像文件夹中的图像文件(仅处理.jpg和.png格式的文件),将图像尺寸调整为28x28,然后使用CLIP模型对图像进行编码,并将结果存储在一个DataFrame中。最后,将DataFrame保存为Excel文件,其中最后一列的值都标记为0。

但是代码运行过程中,频繁报错:

在这里插入图片描述

报错的错误类型为:

/home/wangzhenkuan/CLIP_image_encoder.py:33: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`df[filename] = image_features_list
/home/wangzhenkuan/CLIP_image_encoder.py:33: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`df[filename] = image_features_list
/home/wangzhenkuan/CLIP_image_encoder.py:33: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`df[filename] = image_features_list
/home/wangzhenkuan/CLIP_image_encoder.py:33: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`df[filename] = image_features_list

二、警告信息的解决

警告信息表明DataFrame的性能受到了碎片化的影响,这是由于多次调用frame.insert导致的。为了避免这个性能问题,可以使用pd.concat(axis=1)一次性将所有列连接起来。

以下是修改后的代码,使用pd.concat来连接所有特征列:

import os
import torch
import clip
from PIL import Image
import pandas as pd# 加载预训练的CLIP模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)# 图像文件夹路径
folder_path = 'segment-anything-main/notebooks/output/'  # 将此路径替换为图像文件夹的实际路径# 创建空DataFrame用于存储图像特征
df = pd.DataFrame()# 创建空列表用于存储图像特征
feature_list = []# 遍历图像文件夹
for filename in os.listdir(folder_path):if filename.endswith('.jpg') or filename.endswith('.png'):  # 仅处理.jpg和.png格式的图像文件image_path = os.path.join(folder_path, filename)# 加载和预处理图像image = Image.open(image_path).convert('RGB')image_resized = image.resize((28, 28))image_input = preprocess(image_resized).unsqueeze(0).to(device)# 图像编码with torch.no_grad():image_features = model.encode_image(image_input)# 将图像特征添加到列表中image_features_list = image_features.squeeze().tolist()feature_list.append(image_features_list)# 使用pd.concat(axis=1)将所有特征列连接起来
df = pd.DataFrame(feature_list).T# 在DataFrame的最后一列添加全为0的标记列
df['label'] = 0# 将DataFrame保存到Excel文件
output_path = 'output_negtive.xlsx'  # 将此路径替换为输出Excel文件的实际路径
df.to_excel(output_path, index=False)

这样修改后的代码将避免性能警告,并使用pd.concat(axis=1)一次性将所有特征列添加到DataFrame中。

三、Excel的限制

Traceback (most recent call last):File "/home/wangzhenkuan/CLIP_image_encoder.py", line 43, in <module>df.to_excel(output_path, index = False)File "/home/miniconda3/envs/wzk_base/lib/python3.10/site-packages/pandas/core/generic.py", line 2252, in to_excelformatter.write(File "/home/miniconda3/envs/wzk_base/lib/python3.10/site-packages/pandas/io/formats/excel.py", line 923, in writeraise ValueError(
ValueError: This sheet is too large! Your sheet size is: 512, 292549 Max sheet size is: 1048576, 16384

错误信息为:

在这里插入图片描述
这个错误是因为生成的Excel表格太大,超出了Excel的最大行列限制。在您的代码中,可能由于图像文件夹中包含的图像数量过多,导致生成的DataFrame的行数过多,超出了Excel的最大行数限制。

为了解决这个问题,您可以考虑以下几种方法:

  1. 分批处理:将图像文件夹中的图像分成多个批次进行处理,每次处理一部分图像,生成多个较小的Excel表格。
  2. 降低图像尺寸:将图像缩小,以减少生成的特征向量的数量。可以适当调整image_resized = image.resize((28, 28))这一行代码中的缩放尺寸。
  3. 使用其他数据存储格式:如果Excel表格的行列限制仍然不足以容纳所有特征向量,可以考虑使用其他数据存储格式,例如CSV文件或数据库。

使用CSV文件存储:

import os
import torch
import clip
from PIL import Image
import pandas as pd# 加载预训练的CLIP模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)# 图像文件夹路径
folder_path = 'segment-anything-main/notebooks/output/'  # 将此路径替换为图像文件夹的实际路径# 创建空DataFrame用于存储图像特征
df = pd.DataFrame()# 创建空列表用于存储图像特征
feature_list = []# 遍历图像文件夹
for filename in os.listdir(folder_path):if filename.endswith('.jpg') or filename.endswith('.png'):  # 仅处理.jpg和.png格式的图像文件image_path = os.path.join(folder_path, filename)# 加载和预处理图像image = Image.open(image_path).convert('RGB')image_resized = image.resize((28, 28))image_input = preprocess(image_resized).unsqueeze(0).to(device)# 图像编码with torch.no_grad():image_features = model.encode_image(image_input)# 将图像特征添加到列表中image_features_list = image_features.squeeze().tolist()feature_list.append(image_features_list)# 使用pd.concat(axis=1)将所有特征列连接起来
df = pd.DataFrame(feature_list).T# 在DataFrame的最后一列添加全为0的标记列
df['label'] = 0# 将DataFrame保存到Excel文件
output_path = 'output_negtive.csv'
df.to_excel(output_path, index=False)

在这里插入图片描述

出现 “ValueError: No engine for filetype: ‘csv’” 错误通常是因为缺少适当的库或模块来处理 CSV 文件。这可能是由于 Pandas 版本较旧或缺少某些依赖项。

请尝试确保 Pandas 库已经正确安装,并检查是否缺少与 CSV 文件处理相关的其他库。您可以尝试更新 Pandas 版本或重新安装 Pandas 来解决此问题。

另外,您也可以尝试将输出文件类型更改为其他格式,例如 Excel (.xlsx) 文件,以确保代码能够正确运行。

四、尝试解决

当处理大量图像文件时,可以考虑使用分批处理的方式,将图像分成多个批次进行处理,并生成多个较小的Excel表格。以下是修改后的代码:

import os
import torch
import clip
from PIL import Image
import pandas as pd# 加载预训练的CLIP模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)# 图像文件夹路径
folder_path = 'segment-anything-main/notebooks/output/'  # 将此路径替换为图像文件夹的实际路径# 批处理大小和Excel表格名称
batch_size = 10000  # 每个批次的图像数量
excel_prefix = 'output_batch_'  # Excel表格的前缀名称# 获取图像文件列表
image_files = [filename for filename in os.listdir(folder_path) if filename.endswith(('.jpg', '.png'))]# 计算批次数量
num_batches = len(image_files) // batch_size + 1for batch_idx in range(num_batches):# 获取当前批次的图像文件列表start_idx = batch_idx * batch_sizeend_idx = min(start_idx + batch_size, len(image_files))batch_files = image_files[start_idx:end_idx]# 创建空DataFrame用于存储图像特征df = pd.DataFrame()feature_list = []# 遍历当前批次的图像文件for filename in batch_files:image_path = os.path.join(folder_path, filename)# 加载和预处理图像image = Image.open(image_path).convert('RGB')image_resized = image.resize((28, 28))image_input = preprocess(image_resized).unsqueeze(0).to(device)# 图像编码with torch.no_grad():image_features = model.encode_image(image_input)# 将图像特征添加到DataFrame中image_features_list = image_features.squeeze().tolist()feature_list.append(image_features_list)df = pd.DataFrame(feature_list).T# 在DataFrame的最后一列添加全为0的标记列df['label'] = 0# 生成当前批次的Excel表格excel_filename = f"{excel_prefix}{batch_idx + 1}.xlsx"output_path = os.path.join(folder_path, excel_filename)df.to_excel(output_path, index=False)print(f"Batch {batch_idx + 1} processed. Excel file saved: {excel_filename}")

这时不再报错,正常运行:

在这里插入图片描述
可以顺利跑完!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/118.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL 数据库】7、SQL 优化

目录 一、插入数据优化(1) insert 语句① 批量插入数据② 手动控制事务③ 主键顺序插入&#xff0c;性能要高于乱序插入 (2) load 大批量插入数据【☆❀ 二、主键优化(1) 数据组织形式(2) 页分裂(3) 页合并(4) 主键设计原则 三、orber by 优化四、group by 优化五、limit 优化&…

CSDN个性化推荐系统-负反馈测试

文章目录 前言一、uc不感兴趣标签过滤测试1.uc不感兴趣标签获取(uc_unlike_tag_list)1.1个人中心界面1.2从标签中可以发现什么&#xff1f;1.3与研发确认点1.4设计开发1.5接口获取结果 2.推荐流文章标签获取(tag_list)2.1部分代码2.2基本标签校验2.3基本标签校验结果 3.推荐流u…

Midjourney推出5.2版本,更新zoom out功能

Midjourney是一款专业的图像处理软件&#xff0c;它可以让用户轻松地创造出高质量的图像。它最近宣布推出了5.2版本&#xff0c;这是一个重大的更新&#xff0c;其中最亮眼的功能就是zoom out功能。 zoom out功能可以让用户无限地缩小原始图像&#xff0c;同时保持图像的清晰度…

centos 安装 nginx

1.下载nginx安装包 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 下载到了当前目录下 2.解压安装包 解压后的结果 3.安装依赖 yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 4. ./configure --prefix/usr/lo…

【TCP/IP】多播 - 定义、原理及编程实现 (TTL、多播组、多播消息)

目录 多播 多播的原理 多播的数据传输时的特点 TTL 的概念 TTL 和 多播组的配置方法 多播的编程与实现 发送者 接收者 多播 多播是一种介于单播和广播通信之间的技术方式&#xff0c;可以将发送者所需要发送的数据包分别发送给分散在不同子网中的一组接收者。 多播的原…

Pytorch数据类型Tensor张量操作(操作比较全)

文章目录 Pytorch数据类型Tensor张量操作一.创建张量的方式1.创建无初始化张量2.创建随机张量3.创建初值为指定数值的张量4.从数据创建张量5.生成等差数列张量 二.改变张量形状三.索引四.维度变换1.维度增加unsqueeze2.维度扩展expand3.维度减少squeeze4.维度扩展repeat 五.维度…

8.6 socket套接字及TCP的实现框架

socket套接字 目录 socket套接字 体系结构的两种形式 几种常见的网络编程接口 socket套接字 socket常用API介绍 socket套接字 三元组【IP地址&#xff0c;端口&#xff0c;协议】 地址族结构体 套接字类型 TCP通信的实现过程 体系结构的两种形式 网络的体系结构 (N…

Vue3:计算属性、监听器

computed 计算属性 计算属性是指 基于现有状态派生 (演变) 出新的状态&#xff0c;现有状态发生变化&#xff0c;派生状态重新计算。 computed 接收回调函数作为参数&#xff0c;基于回调函数中使用的响应式数据进行计算属性的创建&#xff0c;回调函数的返回值就是基于现有状态…

C/C++内存管理

Lesson5–C/C内存管理 【本节目标】 1.C/C内存分布 2.C语言中动态内存管理方式 3.C中动态内存管理方式 4.operator new与operator delete函数 5.new和delete的实现原理 6.定位new表达式 7.常见面试题 C/C内存分布 先看一段C语言代码和相关问题 int globalVar 1; static in…

Spring Boot 如何使用 Log4j2 进行日志记录

Spring Boot 如何使用 Log4j2 进行日志记录 在开发 Java 应用程序时&#xff0c;日志记录是非常重要的一环。Spring Boot 提供了多种日志输出方式&#xff0c;其中 Log4j2 是一种比较常用的日志框架。本文将介绍如何在 Spring Boot 应用程序中使用 Log4j2 进行日志记录。 为什…

解决Tomcat控制台窗口输出乱码问题

由于编码的问题&#xff0c;tomcat的控制台窗口输出的都是中文乱码&#xff0c;这明显是编码格式导致的&#xff0c;只要找到对应的编码格式修改一下就好了&#xff0c; 由于我的服务器编码是GBK&#xff0c;所有只需把输出的编码修改为GBK就行了。 936就是GBK编码。找到tomca…

相机去畸变

1. 背景 在做图像感知工作过程中会遇到需要处理相机畸变的情况&#xff0c;如SLAM、3D重建等&#xff0c;则需要了解一些常见相机模型的成像过程&#xff0c;以及依据成像过程实现去除相机成像的畸变。 注意&#xff1a;这篇文章并不涉及太多相机参数畸变原理&#xff0c;更多…