添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、写在前面

本来图片预处理(归一化 & 标准化)的原理不难,但我这个人工智能小白被 Tensor 和 array 等几个类型的通道顺序搞得晕头转向,好不容易整理好了,故写一篇 blog 记录一下

二、先上代码

import torchvision.transforms as transforms
from PIL import Image
import numpy as np
img_path = "/lena.jpeg"
# guiyihua:[0, 255] -> [0, 1]
guiyihua = transforms.ToTensor()
# biaozhunhua (ImageNet)
biaozhunhua = transforms.Normalize(
    mean=[0.485, 0.456, 0.406],
    std=[0.229, 0.224, 0.225]
# zuhe
zuhe_transform = transforms.Compose([
    guiyihua,
    biaozhunhua
# open Image
img = Image.open(img_path)
# transformation: [H, W, C] -> [C, H, W]
img_after = zuhe_transform(img)
# tensor -> numpy
img_after = img_after.numpy()
# [C, H, W] -> [H, W, C]
img_after = np.transpose(img_after, (1, 2, 0))
# print img_after
print("img_after = ", img_after)

三、实现过程中一些注意的点

1、用 PIL 打开的图片 img 是标准 RGB 通道。如果转成 array【np.array(img)】的话,它的 shape 为 【Height,Width,Channel】

2、用 PIL 打开的图片 img 经过 ToTensor() 操作后,shape 会从【H,W,C】变成【C,H,W】。

3、如果想要变回原来的 shape ,需要先用【tensor.numpy()】将 tensor 类型转回 array 类型。再使用 np.transpose() 函数,带上参数(1, 2, 0),变回【H,W,C】。至于为什么是(1,2,0),是因为对于【C,H,W】来说,0指的是第一个(即 C);1,2分别指的是第二、三个(即 H,W)。那按照(1,2,0)的顺序一排,就是【H,W,C】了。

一、写在前面本来图片预处理(归一化 & 标准化)的原理不难,但我这个人工智能小白被 Tensor 和 array 等几个类型的通道顺序搞得晕头转向,好不容易整理好了,故写一篇 blog 记录一下二、先上代码import torchvision.transforms as transformsfrom PIL import Imageimport numpy as npimg_path = "/lena.jpeg"# guiyihua:[0, 255] -> .
使用深度学习进行图像分类或者图像检测时,首先需要对图像进行数据预处理,常见的对图像的预处理有两种办法,一种是正常白化处理又叫图像标准化处理,另一种是归一化处理。 一、图像的标准化处理 图像的标准化处理: tf.image.per_image_standardization() 纠正:上面的σ表示的是所有像素值的标准差。 目的:Linearly scales each image in image...
import cv2 transform_val_list = [ # transforms.Resize(size=(160, 160), interpolation=3), # Image.BICUBIC transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.
Pytorch的官方文档中这个np.transpose()有点不明白它的含义。 查阅资料后: plt.imshow(np.transpose(npimg, (1, 2, 0)))。 因为在plt.imshow在现实的时候输入的是 (imagesize,imagesize,channels) imshow中,参数img的格式为(channels,imagesize,imagesize), 这两者的格式不一致,我们需要调用一次np.transpose函数,即np.transpose(npimg,(1,2,0.
图像数据预处理:颜色空间转换(1)彩色图像灰度化(2)更换三通道顺序BGR为RGB(3)BGR和HSV颜色空间转换、坐标变换(1)图像的平移(2)图像的旋转(3)图像的镜像(4)图像的缩放、灰度变换、伽玛变换、基于直方图的灰度变化、图像滤波(1)中值滤波器(2)均值滤波器(3)高速滤波(4)锐化... ......
用labelimg标注的yolov5的txt是归一化的,也就是如果图片是1280*960时你标注 将图片变化1200*900或940*480等你期望的大小时标签并不会变化。 可以通过修改标签的名字和变换后图片同名在labelimg中打开验证。 def augment(*args, hflip=True, rot=True): hflip = hflip and random.random() < 0.5 vflip = rot and random.random() < 0.5 rot90 = rot and random.random() < 0.5 #三种操作执行概率均为50% def _augment(img): if hflip: img = img[:, ::
一、实现过程 使用Pytorch进行预处理时,通常使用torchvision.transforms.Normalize(mean, std)方法进行数据标准化,其中参数mean和std分别表示图像集每个通道的均值和标准差序列。 首先,给出mean和std的定义,数学表示如下: 假设有一组数据集Xi,  i∈{1,2,⋯ ,n}X_i,\,\,i\in\{1,2,\cdots,n\}Xi​,i∈{1,2,⋯,n},则这组数据集的均值为:mean=∑i=1nXin(1)mean=\frac{\displayst
归一化: 式中,input表示输入的图像像素值;max()、min()分别表示输入像素的最大值和最小值。output为输出图像像素值。经过归一化,图像像素被调整到[0,1]区间内。 标准化: 式中,input表示输入的图像像素值;mean(input)表示输入图像的像素均值。std表示输入图像像素的标准差。经过标准化,图像像素被调整到[-1,1]区间内。 代码实现: import torchvision.transforms 在我们把数据导入模型进行训练的时候,我们首先要对数据进行标准化处理,为什么需要进行标准化呢? 简要地说,为了保证网络可以良好的收敛,在不清楚各个维度的相对重要程度之前,标准化使得输入的各个维度分布相近,从而允许我们在网络训练过程中,对各个维度“一视同仁”(即设置相同的学习率、正则项系数、权重初始化、以及激活函数)。反过来,当我们使用全局相同的学习率、权重初始化、以及激活函数等网络设置时,方差更大的维度将获得更多的重视。 标准化后我们数据的均值为0,方差为1 标准化的公式如下: x_i表示训练集数据
PyTorch中,常用的数据预处理技术包括: 1. 数据标准化(Normalization/Standardization):将数据按照一定规则缩放到均值为0、标准差为1的范围内。常用的标准化方法包括Z-score标准化和MinMax标准化。 2. 数据归一化(Normalization):将数据按照一定规则缩放到0到1的范围内。常用的归一化方法包括MinMax归一化和L2归一化。 3. 数据增强(Data Augmentation):对原始数据进行一定的变换,以生成更多的训练数据。常用的数据增强技术包括随机裁剪、随机旋转、随机翻转等。 4. 数据集划分(Data Splitting):将原始数据集按照一定比例划分为训练集、验证集和测试集。常用的划分方法包括随机划分、分层划分等。 在PyTorch中,可以使用torchvision.transforms模块中提供的函数来进行数据预处理。例如,以下代码演示了如何对一组图像进行数据增强和数据归一化: import torch import torchvision import torchvision.transforms as transforms # 定义数据增强和数据归一化的操作 transform_train = transforms.Compose([ transforms.RandomCrop(32, padding=4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 加载CIFAR10数据集 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train) trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2) 这里,我们首先定义了一个transform_train对象,其中包含了随机裁剪、随机翻转、归一化等数据增强和数据归一化操作。然后,我们使用该对象来加载CIFAR10数据集,并使用DataLoader将其转换为一个可迭代的数据集。
【论文阅读笔记】(2023 CVPR)Beyond Appearance: a Semantic Controllable Self-Supervised Learning Framework for 【论文阅读笔记】(2022 ECCV)CMD: Self-supervised 3D Action Representation Learning with Cross-modal Mutual Di