pytorch学习小记录(1)---图像数据类型的转换
一般来说,读入图像---图像数据类型转换(图像预处理)---网络对图像进行操作图像处理任务中的基本顺序。本文主要介绍图像数据类型转换的相关内容。
1.图像数据都有哪些类型
- Pytorch 常用PIL库来读取图像数据,读取之后的格式是PIL Image
- 在进行Normalize时, 需要先转成Tensor的形式
2.torchvision库
torchvision包是服务于pytorch深度学习框架的,用来生成图片,视频数据集,和一些流行的模型类和预训练模型。torchvision.transforms主要是用于常见的一些图形变换。torchvision由一下函数构成:
torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
torchvision.transforms: 常用的图片变换,例如裁剪、旋转等图像预处理操作;
torchvision.utils: 一些其他工具,例如:make_grid,save_image。
3.图像数据类型转换的方式
首先导入需要的包和模块
import os
import cv2 as cv
import torchvision.transforms as transforms
3.1 torchvision.transforms
先用opencv读取一张图片,然后再进行转换。
3.1.1 维度转换
transforms.ToTensor()有维度转换功能。
opencv储存图片的格式为:(height,width,channel)
torch储存图片的格式为 :(channel,height,width)
img=cv.imread('D:/textimg/1.jpg')
print(img.shape)
#定义一个转换关系,将图像转换为tensor类型
dataTransform=transforms.ToTensor()
img_tensor=dataTransform(img)
print(img_tensor.shape)
输出:
(667, 1080, 3)
torch.Size([3, 667, 1080])
3.1.2正则化
在使用 transforms.ToTensor() 进行图片数据转换过程中会对图像的像素值进行正则化,也就是对图像中的每个像素除以255。将图片像素正则化为[0,1]的范围
#关于图像正则化
print('cv:',img)
print('tensor:',img_tensor)
输出:
cv: [[[211 233 198]
[211 233 198]
[211 233 198]
...
[124 157 150]
[121 154 147]
[118 151 144]]
[[211 233 198]
[211 233 198]
[211 233 198]
...
[124 157 150]
[121 154 147]
[118 151 144]]
[[211 233 198]
[211 233 198]
[211 233 198]
...
[124 157 150]
[121 154 147]
[118 151 144]]
...
[[ 49 64 56]
[ 49 64 56]
[ 49 64 56]
...
[ 73 83 70]
[ 72 82 69]
[ 71 81 68]]
[[ 49 64 56]
[ 49 64 56]
[ 49 64 56]
...
[ 73 83 70]
[ 72 82 69]
[ 71 81 68]]
[[ 49 64 56]
[ 48 63 55]
[ 49 64 56]
...
[ 75 84 71]
[ 73 83 70]
[ 73 83 70]]]
tensor: tensor([[[0.8275, 0.8275, 0.8275, ..., 0.4863, 0.4745, 0.4627],
[0.8275, 0.8275, 0.8275, ..., 0.4863, 0.4745, 0.4627],
[0.8275, 0.8275, 0.8275, ..., 0.4863, 0.4745, 0.4627],
...,
[0.1922, 0.1922, 0.1922, ..., 0.2863, 0.2824, 0.2784],
[0.1922, 0.1922, 0.1922, ..., 0.2863, 0.2824, 0.2784],
[0.1922, 0.1882, 0.1922, ..., 0.2941, 0.2863, 0.2863]],
[[0.9137, 0.9137, 0.9137, ..., 0.6157, 0.6039, 0.5922],
[0.9137, 0.9137, 0.9137, ..., 0.6157, 0.6039, 0.5922],
[0.9137, 0.9137, 0.9137, ..., 0.6157, 0.6039, 0.5922],
...,
[0.2510, 0.2510, 0.2510, ..., 0.3255, 0.3216, 0.3176],
[0.2510, 0.2510, 0.2510, ..., 0.3255, 0.3216, 0.3176],
[0.2510, 0.2471, 0.2510, ..., 0.3294, 0.3255, 0.3255]],
[[0.7765, 0.7765, 0.7765, ..., 0.5882, 0.5765, 0.5647],
[0.7765, 0.7765, 0.7765, ..., 0.5882, 0.5765, 0.5647],
[0.7765, 0.7765, 0.7765, ..., 0.5882, 0.5765, 0.5647],
...,
[0.2196, 0.2196, 0.2196, ..., 0.2745, 0.2706, 0.2667],
[0.2196, 0.2196, 0.2196, ..., 0.2745, 0.2706, 0.2667],
[0.2196, 0.2157, 0.2196, ..., 0.2784, 0.2745, 0.2745]]])
3.2 transforms.Compose
transform.Compose()函数主要作用是串联多个图片变换的操作。
IMAGE_SIZE=200
dataTransform = transforms.Compose([
transforms.Resize(IMAGE_SIZE), # 将图像按比例缩放至合适尺寸
transforms.CenterCrop((IMAGE_SIZE, IMAGE_SIZE)), # 从图像中心裁剪合适大小的图像
transforms.ToTensor() # 转换成Tensor形式,并且数值归一化到[0.0, 1.0],同时将H×W×C的数据转置成C×H×W,这一点很关键
])
img_com=dataTransform(img)
print(img_com)
4.参考文章