以单通道(灰度图)加载图片

如果我们想以单通道加载图片,设置加载数据集时的transform参数如下即可:

from torchvision import datasets, transforms
transform = transforms.Compose(
[ transforms.Grayscale(num_output_channels=1),
transforms.ToTensor()
]
)
data = datasets.CIFAR10(root=".", download=True,transform=transform)
print(type(data[0][0])) # <class 'torch.Tensor'>
print(data[0][0].shape) # torch.Size([1, 32, 32])
print(data[0][0])
# tensor([[[0.2392, 0.1765, 0.1882, ..., 0.5373, 0.5098, 0.5059],
# [0.0745, 0.0000, 0.0392, ..., 0.3725, 0.3529, 0.3686],
# [0.0941, 0.0353, 0.1216, ..., 0.3529, 0.3569, 0.3137],
# ...,
# [0.6784, 0.6039, 0.6157, ..., 0.5255, 0.1412, 0.1490],
# [0.5725, 0.5059, 0.5647, ..., 0.6000, 0.2706, 0.2353],
# [0.5922, 0.5373, 0.5765, ..., 0.7412, 0.4863, 0.3882]]])

可以看到我们得到了归一化后的单通道torch.Tensor对象。

PS:torch.Tensor对象可以以torch.tensor(...)torch.Tensor(...)两种方法初始化得到的,具体区别在于torch.Tensor(...)可接受多个参数,其参数表示Tensor各个维度的大小,比如torch.Tensor会返回一个为已初始化的存有10个数(类型为torch.float32)的Tensor对象,而torch.tensor(10)只能接受一个参数,该参数表示初始化的数据,比如torch.tensor(10)会返回一个包含单个值10(类型为torch.int64)的Tensor对象:

import torch

a = torch.Tensor(10)
print(a)
# tensor([0.0000e+00, 0.0000e+00, 0.0000e+00, 3.6734e-40, 0.0000e+00, 2.0000e+00,
# 0.0000e+00, 2.0000e+00, 7.3787e+2])
print(type(a)) # <class 'torch.Tensor'>
print(a.dtype) # torch.float32 b = torch.tensor(10)
print(b) # tensor(10)
print(type(b)) # <class 'torch.Tensor'>
print(b.dtype) # torch.int64 a = torch.Tensor(2, 3)
print(a)
# tensor([[1.6217e-19, 7.0062e+22, 6.3828e+28],
# [3.8016e-39, 0.0000e+00, 2.0000e+00]]) b = torch.tensor([2, 3])
print(b) # tensor([2, 3])
b = torch.tensor((2, 3))
print(b) # tensor([2, 3])

详情可参见Pytorch讨论区帖子:Difference between torch.tensor() and torch.Tensor()[1]

这里再多说一点,这里的transforms.ToTensor()接收PIL格式的数据, 或者是直接从PIL转来的np.ndarray格式数据, 只要保证进来的数据取值范围是[0, 255], 格式是HWC(H、W、C分别对应图片高度、宽度、通道数,这也就是我们在日常生活中存储图片的常用顺序), 像素顺序是RGB, 它就会帮我们完成下列的工作:

  • 取值范围[0, 255] / 255.0 => [0, 1.0], 数据格式从uint8变成了torch.float32
  • 形状(shape)转为CHW,但像素顺序依旧是RGB。

比如如果不加transforms.ToTensor(),就会直接得到PIL格式的图片:

from torchvision import datasets, transforms
import numpy as np transform = transforms.Compose(
[
transforms.Grayscale(num_output_channels=1),
]
)
data = datasets.CIFAR10(root=".", download=True,transform=transform) img = data[0][0]
print(type(img)) # <class 'PIL.Image.Image'>

然后我们可以尝试先将PIL.Image.Image对象转为np.ndarray,然后再转为torch.Tensor类型的对象:

np_img = np.asarray(img)
print(np_img.dtype) # uint8
tensor_from_np = transforms.ToTensor()(np_img)
print(type(tensor_from_np)) # <class 'torch.Tensor'>
print(tensor_from_np.dtype) # torch.float32
print(tensor_from_np.shape) # torch.Size([1, 32, 32])
print(tensor_from_np)
# tensor([[[0.2392, 0.1765, 0.1882, ..., 0.5373, 0.5098, 0.5059],
# [0.0745, 0.0000, 0.0392, ..., 0.3725, 0.3529, 0.3686],
# [0.0941, 0.0353, 0.1216, ..., 0.3529, 0.3569, 0.3137],
# ...,
# [0.6784, 0.6039, 0.6157, ..., 0.5255, 0.1412, 0.1490],
# [0.5725, 0.5059, 0.5647, ..., 0.6000, 0.2706, 0.2353],
# [0.5922, 0.5373, 0.5765, ..., 0.7412, 0.4863, 0.3882]]])

PS: 最后再提一下Tensorflow,Tensorflow虽然调用的tf.keras.datasets.cifar10.load_data()能直接得到类型为numpy.ndarray并按照HWC顺序存储的数据,但是需要手动去添加/255以对数据归一化,如下所示:

import tensorflow as tf
import numpy as np
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
print(type(x_train)) # <class 'numpy.ndarray'>
print(x_train.shape) # (50000, 32, 32, 3)
print(x_train)
# [[[[ 59 62 63]
# [ 43 46 45]
# [ 50 48 43]
# ...
# [179 177 173]
# [164 164 162]
# [163 163 161]]]]
x_train = x_train.astype(np.float32) / 255.0
print(x_train)
# [[[[0.23137255 0.24313726 0.24705882]
# [0.16862746 0.18039216 0.1764706 ]
# [0.19607843 0.1882353 0.16862746]
# ...
# [0.7019608 0.69411767 0.6784314 ]
# [0.6431373 0.6431373 0.63529414]
# [0.6392157 0.6392157 0.6313726 ]]]]

参考

Pytorch:以单通道(灰度图)加载图片的更多相关文章

  1. Caffe python利用classify.py实现对单通道(灰度图)的数据进行分类

    比如你在mnist的prototxt中定义图输入是单通道的,也就是channel=1,然后如果直接调用classify.py脚本来测试的话,是会报错,错误跟一下类似. Source param sha ...

  2. SDL2.0的加载图片贴图

    加载图片贴图,采用了SDL_Window.SDL_Renderer.SDL_Texture和SDL_Image库 实例: #include <stdio.h> #include <m ...

  3. RX系列四 | RxAndroid | 加载图片 | 提交表单

    RX系列四 | RxAndroid | 加载图片 | 提交表单 说实话,学RxJava就是为了我们在Android中运用的更加顺手一点,也就是RxAndroid,我们还是先一步步来,学会怎么去用的比较 ...

  4. swift -- 单例+ lazy懒加载 + 第三方库

    //工具类单例 static let goods : NHGoods = { let good = NHGoods() return good }() //懒加载 lazy var registerB ...

  5. vue第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期)

    第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期) #课程目标 掌握安装 vue-cli 命令行工具的方法,掌握使用命令行在本地搭建开发环境,使用命令行 ...

  6. Listview 异步加载图片之优化篇(有图有码有解释)

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...

  7. jquery实现表单验证与页面加载之后执行渲染

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. BitmapFactory 加载图片到内存

    Bitmap占用内存分析 Android的虚拟机是基于寄存器的Dalvik,它的最大堆(单个进程可用内存)大小一般是16M,当然不同设备是不一样的,可以查看/system/build.prop文件,[ ...

  9. android 加载图片框架--Glide使用详解

    一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ...

  10. Glide 加载图片

    //通过model获取到图片的url,将Url转换成bitmap对象: //设置不保存内存和硬盘缓存, 1 Glide.with(mContext).load(model.getVideoUrl()) ...

随机推荐

  1. 刘潇翔:基于OpenHarmony的仿生四足狗开发分享

     说起人工智能机器人界的网红,那就不得不提到--"机器狗".此前,著名机器人公司波士顿动力制造的"Spot"机器狗.国内知名科技企业蔚蓝科技自主设计研发的&qu ...

  2. 格式化字符串走过的坑 pwn109

    格式化字符串走过的坑 pwn109 今天做的一道题有一个坑我调试半天终于打通了,格式化字符串的坑,确实不少,东西也比较多容易忘记,怎么说呢,功夫在平时,经验少了 老规矩先看一下保护 Full RELR ...

  3. 【资料包】HDC.Together 2023精选Codelabs指南现已上线(内有活动)

     今年HDC.Together 2023的Codelabs挑战系列活动如期而至,众多开发者齐聚一堂,积极参与.本次赛题中部分Codelabs已在官网上线详细操作指南,让我们与众多coders一起探索代 ...

  4. 报表 BI 选型的那些事

    前言 报表工具是一个接近 20 年的产物了 但是,直到现在,在各种数据信息化的系统中,报表工具的作用,不仅没有褪色,反而是因为信息化需求的增大.数据的增多,以及报表工具本身迭代后越来越方便好用,使得它 ...

  5. 抓包整理————tcp 三次握手性能优化[十]

    前言 tcp 三次握手性能优化. 正文 服务器三次握手流程示例: 下面就是3次握手的过程: 知道这个有什么用呢? 我举一个我使用到的例子哈. 比如有很多 tcp 连接到一台机器上机器上,那么tcp_m ...

  6. android android7以上无法连接蓝牙

    前言 在开发android 蓝牙的时候,发现一个问题,那就是android7无法连接上蓝牙. 原因 <!-- 管理蓝牙设备的权限 --> <uses-permission andro ...

  7. async/await 贴脸输出,这次你总该明白了

    出来混总是要还的 最近在准备记录一个.NET Go核心能力的深度对比, 关于.NET/Go的异步实现总感觉没敲到点上. async/await是.NET界老生常谈的话题,每至于此,状态机又是必聊的话题 ...

  8. ImportError: Cannot load backend 'TkAgg' which requires the 'tk' interactive framework, as 'headless' is currently running

    MMdetection多卡训练常遇到的两个错误,百度无果,没解决,去github里mmdetection的issue模块搜索了一下找到正解. 这里记录一下,方便后者. 1️⃣ ImportError: ...

  9. 重启React Native老项目的奇幻之旅:填坑实录与解决方案分享

    这两天为了重启五年前基于 React Native(版本 0.59.9)开发的老项目,经过各种填坑查询等操作,最终把它成功地运行起来了. 在这篇文章中,我将详述那些遭遇的挑战以及对应的解决方案,以期为 ...

  10. szfpga Lattice高速下载器HW-USBN-2B 常见问题解答

    .产品特点 1). 支持windows7,Windows10 操作系统,两个操作系统非常稳定不断线. 2). 支持JTAG 模式,速度快,最高30Mb/s,调试serdes core,不会像hw-us ...