手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

pytorch学习小记录(1)---图像数据类型的转换

时间:2021/6/5 16:02:14|来源:|点击: 次

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.参考文章

pytorch:把图片数据转化成tensor

 

Copyright © 2002-2019 某某自媒体运营 版权所有