一、写在前面
本来图片预处理(归一化 & 标准化)的原理不难,但我这个人工智能小白被 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