实现图片分块化(使用einops库)

背景介绍

在进行机器学习的模型训练任务的时候,针对图像数据集的处理,常常会对数据集进行分块的操作;具体到模型结构中,在ViT框架中,把每一个图像看作是一个16\times16的patch,每一个patch可以当作是一个NLP领域的一个编码信息,从而把处理NLP任务的transformer架构迁移到CV领域,同时取得了非常不错的结果

那具体如何在代码中实现图片的网格化分块呢?einops库提供了非常方便的函数工具

einops库

Einops(EINstein OPerationS)是一个Python库,其目标是提供一个简单、清晰和强大的接口,用于处理和重塑多维数组。它旨在改善深度学习中Tensor操作的可读性和灵活性。Einops在PyTorch,TensorFlow和numpy中都可以使用。

Einops库的主要功能包括:

  1. 重塑(Reshape)rearrange函数可以根据指定的模式,重新安排或者合并原有的维度。例如,将维度 (C, H, W) 变为 (H, W, C)。

  2. 降维(Reduce)reduce函数可以对指定的维度求和,求平均等。

  3. 重复(Repeat)repeat函数可以将array或者Tensor在指定的维度上,进行复制操作。

任务设计

把下面这张卡比巴拉的图片分块成10\times10的形状

代码实现

# 依赖的库环境
import einops
import torch
import torchvision
import matplotlib.pyplot as plt
from torchvision.transforms import ToTensor
from PIL import Image
# 读取图片数据
img = Image.open(r"D:\deep_learning\1_27_ViT\kabibala.jpg")
# 对读取的PIL格式数据进行裁剪和格式转换
img = torchvision.transforms.Compose([torchvision.transforms.CenterCrop(1000),ToTensor()])(img)
# 对图片进行分割
img = einops.rearrange(img,'c (b1 h) (b2 w) -> (b1 b2) c h w',b1=10,b2=10)
# 图片网格化
img = torchvision.utils.make_grid(img,nrow=10,pad_value=0.9,padding=5)
# 图片显示
plt.imshow(img.permute(1,2,0))
plt.show()

代码中,img = einops.rearrange(img,'c (b1 h) (b2 w) -> (b1 b2) c h w',b1=10,b2=10)是对img数据的格式进行更改,原来图片的形状定义为[c,(b1 h),(b2 w)],指定b1=b2=10,就是在像素宽和像素高两个维度上设定了10的参数,'->'后的形状是变换之后的数据形状,将b1和b2转换到最前面的维度,得到[(b1 b2) c h w],即得到100张[c h w]的分割图片,这里可以等效于b1 b2 = b批次,所以可以使用torchvision.utils.make_grid将多批次的图像进行网格化的格式存储,最后的图片为

如果是模型训练的过程,则可以直接将[(b1 b2) c h w]格式的数据作为多批次的训练数据进行进一步的调整细化,以满足模型训练的要求

欢迎大家讨论交流~


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

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

相关文章

mac上搭建hbase伪集群

1. 前言 之前我们已经搭建过了 hbase单点环境,(单机版搭建参见: https://blog.csdn.net/a15835774652/article/details/135569456) 但是 为了模拟一把集群环境 我们还是尝试搭建一个伪集群版 2. 环境准备 jdk环境 1.8hdfs (hadoop环境 可选…

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2)

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2) 在 Android ScaleGestureDetector检测双指缩放Bitmap基于Matrix动画移动到双指捏合中心点ImageView区域中心,Kotlin-CSDN博客 …

程序员开发要素—Java篇

这是个预留板块,打算写一写作为程序员的基本要素和技术。主要包含基本工具,基础知识,基础插件应用,环境搭建等内容。 具体内容后续补充完整,Ps:请假申请已提交https://blog.csdn.net/qq_18237141/article/…

跟着小德学C++之TOTP

嗨,大家好,我是出生在达纳苏斯的一名德鲁伊,我是要立志成为海贼王,啊不,是立志成为科学家的德鲁伊。最近,我发现我们所处的世界是一个虚拟的世界,并由此开始,我展开了对我们这个世界…

网络安全B模块(笔记详解)- 越权与下载

1.使用渗透机场景kali中工具扫描服务器场景,将web端口号当作Flag提交; 2.使用渗透机场景windows7访问服务器场景mingling.php,将页面中的Flag提交; 3.使用渗透机场景windows7访问服务器场景mingling.php,分析页面内容,查看系统配置信息,并将产品id的最后5位数作为Flag提…

NLP自然语言处理的发展:从初创到人工智能的里程碑

自然语言处理(Natural Language Processing,NLP)人工智能领域中备受关注的重要分支之一。它使得计算机能够理解、解释和使用人类语言。随着技术的不断发展,NLP经历了从初创时期到深度学习时代的巨大演变,推动了互联网产…

链表相加---链表OJ---两数之和

https://leetcode.cn/problems/add-two-numbers/?envType=study-plan-v2&envId=top-100-liked 对于本题,可以选择用数组实现,那样比较简单;我们这里就用纯链表实现。 纯链表实现有许多细节,比如链表长度不一样,进位,尾结点如果是0我们就要删除尾结点。 首先…

线程调度(Java Android)

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览2.1、线程的属性 三、…

继承基本介绍

Java提供了关键字extends,可以让一个类和另一个类建立父子关系。 public class a extends b{ //b为父类,,a为子类} 继承的特点:子类可以继承父类的非私有成员;子类的对象由子类、父类共同完成 使用继承可以减少重复…

【正点原子STM32】STM32基础知识(F1F4F7H7 STM32系统框架、寻址范围、存储器映射的存储器功能划分、寄存器映射)

一、STM32系统框架 1.1、Cortex M内核 & 芯片1.2、F1系统架构1.3、F4系统架构1.4、F7系统架构1.5、H7系统架构 二、STM32的寻址范围? 三、存储器映射 存储器功能划分(F1为例)STM32F1存储器映射图 四、寄存器映射 寄存器基础知识STM3…

python-自动化篇-办公-文件-加解密

解说 要使⽤Python进⾏⽂件的加密和解密,可以使⽤第三⽅加密库,如cryptography或pycryptodome。 ⼀个基本的⽰例,演⽰如何使⽤cryptography库对⽂件进⾏加密和解密: 安装cryptography库: pip install cryptography⽂…

【Vue3 + Vite】Vite搭建 项目解构 Vue快速学习 第一期

文章目录 Vue3介绍Vue3通过Vite实现工程化:一、Vite创建Vue3工程化项目1.1 ViteVue3项目的创建、启动、停止1.2 ViteVue3项目的目录结构 二、ViteVue3 项目组件(SFC入门)2.1 什么是VUE的组件 ?2.2 什么是.vue文件 ?2.3 工程化vue项目如何组织这些组件? 三、ViteV…

【NodeJS】004- NodeJS的模块化与包管理工具

模块化 1. 介绍 1.1.什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什么是模块化项目 ? 编码时是按照模…

23. 集合类

集合 1. 概述2. 分类2.1 单列集合(Collection)2.2 双列集合(Map) 单列集合 Collection、List、Set、ArrayList、LinkedList’、Vector、HashSet、TreeSet、LinkedHashSet双列集合 Map、HashTable、HashMap、TreeMap、Properties、…

docker 部署及命令

一、容器概述 1、为什么要用到容器? ①容器可以屏蔽底层操作系统的差异性,让业务应用不管在哪里都是使用容器的环境运行,从而保证开发测试环境与生产环境的一致性 ②容器部署起来非常便捷和迅速,缩短开发测试部署的周期时间 2…

阅读go语言工具源码系列之gopacket(谷歌出品)----第二集 layers-巧妙的抽象与无聊的协议包

上一集中我们讲到了wpcap.dll的go封装方法,对于linux系统下libpcap的go封装采用的是常用的cgo方式,想了解的可以看看pcap文件夹中的pcap_unix.go。 我们得到了wpcap.dll的go调用,就可以利用它来进行列举所有网络设备,例如以下代码…

知识产权如何转为实缴资本,实操

网上已传疯了,相关部门要求企业注册资本认缴的必须在5年内完成实缴,这一下子引起企业老板们着急了。以前公司注册时,很多老板因为是认缴资本,完全凭脑袋一拍,写上注册资金5000万,有的甚至写上几个小目标。现…

11.Elasticsearch应用(十一)

Elasticsearch应用(十一) 1.什么是自动补全 现代的搜索引擎,一般都会提供Suggest as you type的功能 帮助用户在输入搜索的过程中,进行自动补全或者纠错。通过协助用户输入更加精准的关键词,提高后续搜索阶段文档的…

【GitHub项目推荐--开源翻译模型】【转载】

开源翻译模型 Seamless M4T 旨在提供高质量的翻译,使来自不同语言的人们能够轻松地通过语音和文本进行交流,支持 101 种语言用于语音输入、96 种文本语言输入/输出、 可以输出 35 种语音语言。 此统一模型支持多个任务,而不依赖于多个单独的…

漏洞原理反射型XSS漏洞

漏洞原理XSS漏洞 1 反射型XSS php基础链接 Web渗透编程语言基础-CSDN博客 正常思维 http://127.0.0.1/websec/day01/xss_reflect.php?name%E6%88%91%E6%98%AF%E8%B0%81 http://127.0.0.1/14_WEBSEC/DAY01/xss_reflect.php?name我是谁 黑客思维 http://127.0.0.1/websec…