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

如果我们想以单通道加载图片,设置加载数据集时的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. 修复HTTP动词篡改导致的认证旁路问题的方法

    本文于2016年4月完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 诡异的问题 分析AppScan扫描报告的时候,发现报告里提示" ...

  2. 本周四晚19:00知识赋能第七期第2课丨OpenHarmony WiFi扫描仪UX设计

    8月18日19:00~20:00,第七期知识赋能第二节直播就要开始啦!如果你是缺乏实战经验的学生,如果你是初出茅庐的职场新人,如果你是想参与开源的贡献者,那么本期的直播课将不容错过!通过本期直播,开发 ...

  3. 基于新版宝塔Docker部署在线客服系统过程小记

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 客服系统开发过程中,最让我意外的是对 TCP/IP 协议的认识.过去一直认 ...

  4. C#中十进制转与二进制相互转换

    将十进制转换为二进制 将二进制转换为十进制

  5. opengauss-jdbc问题整理

    opengauss-jdbc问题整理(更新中) 问题 1 jdbc 批量执行 insert 语句时返回结果不符合 Spring jpa 预期 问题描述: jdbc 执行查询时,可以使用prepares ...

  6. 面向开发者的HarmonyOS 3.0 Beta发布

    原文:https://mp.weixin.qq.com/s/y0h5CUMbuFchwT7g-AqaBQ,点击链接查看更多技术内容. 2021年10月,我们面向开发者发布了HarmonyOS 3.0 ...

  7. 重新点亮shell————sed的替换[十]

    前言 简单介绍一下sed 和 awk. 正文 这两个和vim的区别: vim 是交互式和 他们是非交互式 vim是文件操作模式与他们是行交互模式 sed sed 的 模式空间. sed的基本工作方式是 ...

  8. redis哨兵主备切换的数据丢失问题:异步复制、集群脑裂

    1.两种数据丢失的情况 主备切换的过程,可能会导致数据丢失 (1)异步复制导致的数据丢失 因为master -> slave的复制是异步的,所以可能有部分数据还没复制到slave,master就 ...

  9. opensips开启python支持

    操作系统 :CentOS 7.6_x64   opensips版本: 2.4.9   python版本:2.7.5 python作为脚本语言,使用起来很方便,查了下opensips的文档,支持使用py ...

  10. 比心云平台基于阿里云容器服务 ACK 的弹性架构实践

    ​简介:本文主要探讨比心云平台如何利用阿里云容器服务 ACK,来构建应用弹性架构,进一步优化计算成本. 作者:韩韬|比心技术 前言 应用容器化改造后,不可避免地会面临这样一个问题:Kubernetes ...