【跑实验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_excel
    formatter.write(
  File "/home/miniconda3/envs/wzk_base/lib/python3.10/site-packages/pandas/io/formats/excel.py", line 923, in write
    raise 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 + 1

for batch_idx in range(num_batches):
    # 获取当前批次的图像文件列表
    start_idx = batch_idx * batch_size
    end_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}")

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“插入排序:小数据量排序的王者“

文章目录 &#x1f50d;什么是插入排序&#xff1f;&#x1f511;插入排序的优缺点&#x1f680;实现插入排序 &#x1f50d;什么是插入排序&#xff1f; 插入排序是一种简单的排序算法&#xff0c;它的基本思想是&#xff1a;将待排序的元素&#xff0c;从第二个元素开始&…

Adobe Creative Cloud 摄影计划 - 当图像与想象力相遇。 PS+LRc套餐 国际版 1年订阅/398

这里重点介绍国际版摄影计划套餐详情&#xff1a; 国际版包括&#xff1a;Photoshop、Lightroom Classic、Photoshop Express、Lightroom Mobile、Lightroom、云服务。中国版包括&#xff1a;Photoshop、Lightroom Classic、Photoshop Express、Lightroom Mobile 桌面应用程序…

力扣高频SQL50题(基础版)——第十天

力扣高频SQL50题(基础版)——第十天 1 只出现过一次的最大数字 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出1 1.1.3 示例输入输出2 1.2 示例sql语句 # 查不到时的结果自然就为Null SELECT MAX(t.num) num FROM (SELECT numFROM MyNumbersGROUP By numHAVING count…

2023考研一战上岸 电子科技大学 860软件工程 经验分享

目录 1. 前言&#xff1a;考研&#xff0c;心态最重要&#xff01; 2. 初试各科复习经验 (1) 数学一 (2) 英语一 (3) 专业课 (4) 政治 (5) 四门课时间划分 3. 复试流程和备考建议 (1) 复试流程 (2) 备考建议 4. 结语 首先&#xff0c;先简要做一个自我介绍&#xff…

【开源与项目实战:开源实战】82 | 开源实战三(中):剖析Google Guava中用到的几种设计模式

上一节课&#xff0c;我们通过 Google Guava 这样一个优秀的开源类库&#xff0c;讲解了如何在业务开发中&#xff0c;发现跟业务无关、可以复用的通用功能模块&#xff0c;并将它们从业务代码中抽离出来&#xff0c;设计开发成独立的类库、框架或功能组件。 今天&#xff0c;…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(上)

注意&#xff1a;本文由GPT4与Claude联合生成。 按语&#xff1a;ChatGPT在计算机领域的翻译质量还是欠缺一些&#xff0c;翻译出来的中文有的不够自然&#xff0c;经常完全按照英文的表达方式来&#xff0c;导致中文特别长&#xff0c;很绕。GPT4的翻译效果相对ChatGPT效果要好…

内网安全:内网渗透.(拿到内网主机最高权限 vulntarget 靶场 A)

内网安全&#xff1a;内网渗透.&#xff08;拿到内网主机最高权限&#xff09; 内网穿透又被称为NAT穿透&#xff0c;内网端口映射外网&#xff0c;在处于使用了NAT设备的私有TCP/IP网络中的主机之间建立连接的问题。通过映射端口&#xff0c;让外网的电脑找到处于内网的电脑。…

TensorFlow2进行CIFAR-10数据集动物识别,保存模型并且进行外部下载图片测试

首先&#xff0c;你已经安装好anaconda3、创建好环境、下载好TensorFlow2模块并且下载好jupyter了&#xff0c;那么我们就直接打开jupyter开始进行CIFAR10数据集的训练。 第一步&#xff1a;下载CIFAR10数据集 下载网址&#xff1a;http://www.cs.toronto.edu/~kriz/cifar-10…

【网络协议详解】——IPv4(学习笔记)

目录 &#x1f552; 1. IPv4地址概述&#x1f552; 2. 分类编址&#x1f552; 3. 划分子网&#x1f558; 3.1 概述&#x1f558; 3.2 如何实现&#x1f558; 3.3 无分类编址&#x1f558; 3.4 应用规划&#x1f564; 3.4.1 定长的子网掩码FLSM&#xff08;Fixed Length Subnet …

第4章 网络层

1‌、下列关于路由算法描述错误的是&#xff08; &#xff09; A. 链路状态算法是一种全局路由算法&#xff0c;每个路由器需要维护全局状态信息B. OSPF 是一种域内路由协议&#xff0c;核心是基于 Dijkstra 最低费用路径算法C. RIP 是一种域内路由算法&#xff0c;核心是基…

MUR8060PT-ASEMI快恢复二极管MUR8060PT

编辑-Z MUR8060PT在TO-247封装里采用的2个芯片&#xff0c;其尺寸都是140MIL&#xff0c;是一款高耐压大电流快恢复二极管。MUR8060PT的浪涌电流Ifsm为600A&#xff0c;漏电流(Ir)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。MUR8060PT采用抗冲击硅芯片材质&#x…

Maven编译常见问题收集

1、父pom里面有引入lombok依赖&#xff0c;为什么子pom有用到lombok&#xff0c;依然识别不到呢 这是因为父pom引入依赖的时候&#xff0c;把 <dependency></dependency>依赖标签&#xff0c;最外层包 在了<dependencyManagement></dependencyManagemen…

【spring】spring是什么?详解它的特点与模块

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、spring介绍 二、spring的特点&#xff08;七点&#xff09; 1、简化开发 2、AOP的支持 3、声明式事务的支持 4、方便测试 5、…

猪齿鱼开源发布2.0版本:DevOps能力全面升级,研发效能显著提升,欢迎即刻体验!

近日&#xff0c;甄知科技猪齿鱼Choerodon数智化开发管理平台正式发布了开源2.0版本&#xff01; 开源发布会上&#xff0c;甄知产研团队、业内伙伴和社区开发者们齐聚一堂&#xff0c;共同见证猪齿鱼开源2.0的重磅发布&#xff01;发布会由上海甄知科技创始合伙人兼CTO张礼军先…

使用ChatGPT最新版实现批量写作,打造丰富多彩的聚合文章

随着人工智能的迅猛发展&#xff0c;ChatGPT最新版作为一种自然语言处理模型&#xff0c;可以为我们提供强大的文本生成能力。在这篇文章中&#xff0c;我们将探讨如何利用ChatGPT最新版来实现批量写作&#xff0c;从而打造丰富多彩的聚合文章。 一、ChatGPT最新版简介 Chat…

MFC第五天 Unicode软件开发 MFC框架构成与封装类原理

文章目录 Unicode软件开发以Unicode为字符集的记事本软件开发 MFC框架构成与封装类原理示例代码如下&#xff1a; Unicode软件开发 Unicode软件开发时需要遵循以下规则&#xff1a;使用中可尽量使用自适应版本。 Unicode软件开发&#xff1a; a)微软的软件工程现在默认使用Uni…

SpringBoot 实现 PDF 添加水印有哪些方案?

简介 PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种流行的文件格式&#xff0c;它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下&#xff0c;我们需要对 PDF 文件添加水印&#xff0c;以使其更具有辨识度或者保护其版…

前端项目工程化搭建

ESLint 在开发过程中&#xff0c;需要遵循一些规范&#xff0c;可以使用下面的工具来配置不同项目需要遵循的规范&#xff0c;来帮助我们检查错误、约束开发过程。 ESLint 配置 使用 Taro CLI 创建的项目&#xff0c;会自动生成 .eslintrc 文件。只需要在这个文件的 rules 配…

Android逆向解析加壳与脱壳技术

加壳 加壳是指在 APK 文件中插入额外的代码或数据&#xff0c;使得原始代码难以被分析和反编译。通常加壳是为了保护软件的知识产权或者防止逆向工程。下面是 Android 加壳的一般流程&#xff1a; 选择加壳工具&#xff1a;选择合适的加壳工具进行加壳&#xff0c;比如市面上…

K8S:二进制安装K8S(单台master)安装etcd和master

系列文章目录 文章目录 系列文章目录一、安装K8S1.系统初始化配置2.部署docker引擎3.部署etcd集群 二、1.2. 总结 一、安装K8S 1.系统初始化配置 注意&#xff1a;该操作在所有node节点上进行&#xff0c;为k8s集群提供适合的初始化部署环境 #所有节点执行 systemctl stop f…