pytorch transforms图像增强

news2025/1/18 17:14:01

一、前言

在学习自己的项目发现自己有很多基础知识不牢,对于图像处理有点不太清楚,因此写下来作为自己的笔记,主要是我想自己动手写一下每一句代码到底做了什么,而不是单纯的我看了知道了它做了什么,说白了,不想停在看,而是要真正自己敲。

本文基于的是pytorch1.7.1

二、图像处理

深度学习是由数据驱动的,而数据的数量和分布对于模型的优劣具有决定性作用,所以我们需要对数据进行一定的预处理以及数据增强,用于提升模型的泛化能力。

一般来说深度学习神经网络训练前都需要做数据增强 (Data Augmentation) 又称为数据增广、数据扩增,它是对 训练集 进行变换,使训练集更丰富,从而让模型更具 泛化能力

下面为常见的图像变换

1.原始图片

显示图片,并读取图片大小

    1

    2

    3

    4

    5

    6

    7

    8

    9

from torchvision import transforms

from PIL import Image # 用于读取图片

import  matplotlib.pyplot as plt # 用于显示图片

image_path = './dog.jpg'

image = Image.open(image_path)

plt.imshow(image)

print(image.size)

plt.show()

图片大小(1024, 683)

2.调整图片大小transforms.Resize

2.1.transforms.Resize(x)

主要用于调整PILImage对象的尺寸大小,图片短边缩放至x,长宽比保持不变

将图片短边缩放至x,长宽比保持不变,上述图片执行transforms.Resize(300)

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

from torchvision import transforms

from PIL import Image # 用于读取图片

import  matplotlib.pyplot as plt # 用于显示图片

# 图片显示,打印图片大小

image_path = './dog.jpg'

image = Image.open(image_path)

resize = transforms.Resize(300)

image1 = resize(image)

plt.imshow(image1)

print(image1.size)

plt.show()

图片大小(449, 300)

得到如下

2.2.transforms.Resize([x, y])

同时指定图片长宽,这样会改变长宽比例但是不是裁剪,可以恢复

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

from torchvision import transforms

from PIL import Image # 用于读取图片

import  matplotlib.pyplot as plt # 用于显示图片

# 图片显示,打印图片大小

image_path = './dog.jpg'

image = Image.open(image_path)

resize = transforms.Resize([512, 300])

image1 = resize(image)

plt.imshow(image1)

print(image1.size)

plt.show()

图片大小(512, 300)

2.3关于图片的恢复

测试代码

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

from torchvision import transforms

from PIL import Image # 用于读取图片

import  matplotlib.pyplot as plt # 用于显示图片

# 图片显示,打印图片大小

image_path = './dog.jpg'

image = Image.open(image_path)

w, h = image.size

resize = transforms.Resize([512, 300])

image1 = resize(image)

resize2 = transforms.Resize([h, w])

image2 = resize2(image1)

plt.imshow(image2)

print(image2.size)

plt.show()

图片大小(1024, 683)

注意这里要使用transforms.Resize([h, w])

3.图片裁剪

3.1中心裁剪transforms.CenterCrop

作用:中心裁剪图片

主要参数:size,表示需要裁剪的图片大小

代码示例:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

from torchvision import transforms

from PIL import Image

import matplotlib.pyplot as plt

transform = transforms.CenterCrop(512)

image_path= "./dog.jpg"

image = Image.open(image_path)

image1 = transform(image)

plt.imshow(image1)

print(image1.size)

plt.show()

image1.save('./dog_clipping.jpg')

图片大小(512, 512)

3.2随机裁剪transforms.RandomCrop(size,padding=None,pad_if_needed=False,fill=0,padding_mode='constant')

主要参数:

size为需要裁剪的图片大小

padding:设置填充大小

大小为a:表示上下左右都填充a个元素

大小为(a, b):表示左右填充a个元素,上下填充b个元素

大小为(a, b, c, d):表示左上右下填充a, b, c, d个元素

pad_if_needed:若图像小于设定 size,则填充,此时该项需要设置为 True

padding_mode:填充模式,主要有四种

  • constant:像素值由 fill 设定。
  • edge:像素值由图像边缘像素决定。
  • reflect:镜像填充,最后一个像素不镜像,例如 [1, 2, 3, 4] → [3, 2, 1, 2, 3, 4, 3, 2]
  • symmetric:镜像填充,最后一个像素镜像,例如 [1, 2, 3, 4] → [2, 1, 1, 2, 3, 4, 4, 3]

fill:当填充模式为padding_mode的填充值

代码示例:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

from torchvision import transforms

import matplotlib.pyplot as plt

from PIL import Image

transform = transforms.RandomCrop(size=(512, 512), padding=50, pad_if_needed=True, fill=0,padding_mode="constant")

image_path = "./dog.jpg"

image = Image.open(image_path)

random_crop_image = transform(image)

print(random_crop_image.size)

plt.imshow(random_crop_image)

plt.show()

random_crop_image.save("./random_crop_image.jpg")

图片大小(512, 512)

3.3transforms.RandomResizedCrop

RandomResizedCrop(size,scale=(0.08,1.0),ratio=(3/4,4/3),interpolation)

将给定图像随机裁剪为不同的大小和宽高比,然后缩放所裁剪得到的图像为制定的大小;

主要参数:

size:为最终图片要resize的大小

scale:为随机采样最少要覆盖原图的比例,在resize前

ratio:为随机采样宽高的比例,也在resize前

interpolation:插值方法

代码示例:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

from torchvision import transforms

import matplotlib.pyplot as plt

from PIL import Image

transform = transforms.RandomResizedCrop(size=(256, 256),

                                         scale=(0.08, 1),

                                         ratio=(3/ 4, 4/3),

                                         interpolation=Image.NEAREST)

image_path = "./dog.jpg"

image = Image.open(image_path)

random_resize_crop_image = transform(image)

print(random_resize_crop_image.size)

plt.imshow(random_resize_crop_image)

plt.show()

random_resize_crop_image.save("./dog_random_resize_crop.jpg")

图片大小(256, 256)

4.图片翻转与旋转

4.1.transforms.RandomHorizontalFlip(p=0.5)水平翻转

p为旋转的概率

代码示例:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

from torchvision import transforms

import matplotlib.pyplot as plt

from PIL import Image

transform = transforms.RandomHorizontalFlip(p=0.7)

image_path = "./dog.jpg"

image = Image.open(image_path)

RandomHorizontalFlip_image = transform(image)

print(RandomHorizontalFlip_image.size)

plt.imshow(RandomHorizontalFlip_image)

plt.show()

RandomHorizontalFlip_image.save("./RandomHorizontalFlip_image.jpg")

图片大小(1024, 683)

4.2transforms.RandomVerticalFlip垂直翻转

代码示例

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

from torchvision import transforms

import matplotlib.pyplot as plt

from PIL import Image

transform = transforms.RandomVerticalFlip(p=0.8)

image_path = "./dog.jpg"

image = Image.open(image_path)

RandomVerticalFlip_image = transform(image)

print(RandomVerticalFlip_image.size)

plt.imshow(RandomVerticalFlip_image)

plt.show()

RandomVerticalFlip_image.save("./RandomVerticalFlip_image.jpg")

图片大小(1024, 683)

4.3旋转transforms.RandomRotation

RandomRotation(degrees,resample=False,expand=False,center=None)

主要参数:

  • degrees:旋转角度。

        当为 a 时,在 (-a, a) 之间随机选择旋转角度。

        当为 (a, b) 时,在 (a, b) 之间随机选择旋转角度。

  • resample:重采样方法。
  • expand:是否扩大图片,以保持原图信息。
  • center:旋转点设置,默认中心旋转

代码示例:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

from torchvision import transforms

import matplotlib.pyplot as plt

from PIL import Image

transform = transforms.RandomRotation(degrees=90,resample=False, expand=True, center=None, fill=0)

image_path = "./dog.jpg"

image = Image.open(image_path)

RandomRotation_image = transform(image)

print(RandomRotation_image.size)

plt.imshow(RandomRotation_image)

plt.show()

RandomRotation_image.save("./RandomRotation_image.jpg")

图片大小(1214, 1203)

参考博客与资料:

Pytorch transforms.Resize()的简单用法_xiongxyowo的博客-CSDN博客

PyTorch 08:transforms 数据增强:裁剪、翻转、旋转 - YEY 的博客 | YEY Blog

Pytorch中transforms.RandomResizedCrop()等图像操作_心向林丶的博客-CSDN博客

Illustration of transforms — Torchvision main documentation (pytorch.org)

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

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

相关文章

【Maven】开发自己的starter依赖

【Maven】开发自己的starter依赖 文章目录【Maven】开发自己的starter依赖1. 准备工作1.1 创建一个项目1.2 修改pom文件1.3 修改项目结构2. 动手实现2.1 创建客户端类2.2 创建配置类2.3 配置路径2.4 下载到本地仓库3. 测试1. 准备工作 1.1 创建一个项目 打开idea,…

BP神经网络原来就是曲线拟合

本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 在初学BP神经网络的时候,总是非常抽象和难理解 但是,学久了会发现,BP神经网络原来就是曲线拟合! 一下子才具体、深入的理解到BP神经网络是什么 本文…

字节,腾讯过来的面试自动化测试就这水平吗?鬼知道经历了什么?

本人12年从业经验,曾就职于美团测试开发框架组,搭建过美团platuo测试框架,thrift测试框架,自动化测试平台,熟悉python3,java,vue,在多家公司从0到1搭建过自动化测试框架,…

linux文件编辑--vi

目录标题vi/vim中三种模式命令模式下的常用命令--光标移动输入模式末行模式vim中常用的操作类型命令行模式下的常用命令--复制、粘贴、删除命令模式下的常用命令--文件内容查找命令模式中的基本操作--撤销编辑及保存退出末行模式中的基本操作--保存文件内容及退出vi编辑器末行模…

GitHub标星15w,如何用Python实现所有算法?

学会了 Python 基础知识,想进阶一下,那就来点算法吧!毕竟编程语言只是工具,结构算法才是灵魂。 新手如何入门 Python 算法? 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码&#xf…

[论文阅读RGBD-SOD][2022_TCSVT_MoADNet][轻量化]

MoADNet: Mobile Asymmetric Dual-Stream Networks for Real-Time and Lightweight RGB-D Salient Object Detection paper:https://ieeexplore.ieee.org/abstract/document/9789193 动机 尽管已有许多优秀的RGB-D SOD技术被提出,但它们大多关注性能…

面试篇-从今天开始彻底分清Java内存模型JMM和运行时数据区

“相信很多人会把Java内存模型与Java运行时数据区给搞混淆” Java内存模型和Java运行时数据区是两个不同的概念,很容易让人混淆。下面简单介绍一下它们的区别: Java内存模型(JMM)是Java虚拟机规范中定义的一种内存模型&#xff…

如何优化快速排序?

欢迎来到 Claffic 的博客 💞💞💞 前言: 还记得上次的快速排序吗?还记得 key 是怎么取的吗?当时我直接把数组的起始元素作为了 key 值,其实这样做是有弊端的,试想:一个降…

SAP Business Technology Platform (BTP)的架构理解

查资料看到的,转一下,附上链接: SAP Business Technology Platform (BTP)的架构理解 长期以来,我在与客户和伙伴的沟通交流中发现大家依然对SAP业务技术平台 – SAP Business Technology Platform (以下简称BTP)纯有各种疑惑&…

webgl-图形非矩阵旋转

知识拓展 由(x1,y1)旋转β角度到(x2,y2) 根据圆极坐标方程 x1 r*cosα y1 r*sinα 可得 x2 r*cos(α β) r*cosα*cosβ - r*sinα*sinβ,因为x1 r*cosα,y1 r*sinα,所以x2 x1*cosβ -y1*sinβ…

如何进行移动设备资产管理

随着越来越多的移动设备进入和访问组织的企业资源,管理员必须监视和控制对企业数据的访问。与传统工作站不同,传统工作站位于企业的物理工作区内,移动设备从多个位置使用,从而使移动资产管理过程更加复杂。 什么是移动资产管理 …

java基础集合面试题

什么是集合 集合就是一个放数据的容器,准确的说是放数据对象引用的容器 集合类存放的都是对象的引用,而不是对象的本身 集合类型主要有3种:set(集)、list(列表)和map(映射)。 集合的特点 集合的特点主要有如下两点&…

LMKD分享

背景 Android是一个多任务系统,可以同时运行多个程序,一般来说,启动运行一个程序是有一定的时间开销的,因此为了加快运行速度,当你退出一个程序时,Android并不会立即杀掉它,这样下次再运行该程…

【MySQL优化】快速入门慢SQL优化

MySQL B树结构(二叉排序树) 索引 SQL优化,主要就是在优化索引 索引:相当于书的目录 索引:index是帮助MYSQL高效获取数据的数据结构。索引是数据结构(树:B树(默认)、Hash树…) 索引的弊端: 1.索引本身很大,可以存…

Spring Cloud Config配置服务及那些你不知道的坑

目录 1、为什么选择Spring Cloud Config 1.1 集中式管理 1.2 动态修改配置 2、Spring Cloud Config 简介 3、服务端配置 3.1 添加依赖 3.2 开启服务注册 3.3 添加YML配置 3.4 创建远程分支及Profile配置文件 3.5 启动并测试服务 4、客户端配置 4.1 添加依赖 4.2 开…

2.3-6循环链表

原理的单链表和循环单链表的区别: 初始化循环单链表时,使头节点next指针指向头节点。 判断循环单链表是否为空。 对比: 单链表:if(L->next NULL) 双链表:if(L->nextL) 判断循环单链表的结点p是否为表尾结点…

汇聚音视频新能量 探索行业新蓝海

视频行业卷成红海,如何突破瓶颈,去探索行业的新蓝海,本次LiveVideoStackCon 2022北京站邀请到快手高级副总裁、研发线负责人于冰,以《汇聚音视频新能量,探索行业新蓝海》为题,从视频行业趋势和痛点出发&…

类ChatGPT模型ChatGLM-b6本地部署实践

国外ChatGPT火爆持续,前一段时间百度发布“文心一言”还没有全面放开测试,这不阿里“通义千问”又悄然而至,国内大模型AI产品渐渐浮出水面。早在2022年8月份时候清华大学的对话语言模型ChatGLM-6B就发布并开源,本文简要介绍ChatGL…

flex弹性布局详细介绍

这里提供一个可以边学习边玩的flex学习网站:弹性盒青蛙 目录一、Flex布局是什么?二、属性1. justify-content 属性2. align-items属性3. flex-direction属性4. order属性5. align-self属性6. flex-wrap 属性7. flex-flow属性8. align-content属性三、综合…

测试新人必看,软件测试测试流程

不同类型的软件产品测试的方式和重点不一样,测试流程也会不一样。同样类型的软件产品,不同的公司所制定的测试流程也会不一样。虽然不同软件的详细测试步骤不同,但它们所遵循的最基本的测试流程是一样的。 1分析测试需求 2制定测试计划 3设…