• torchvision.transforms.Compose输入类型是?处理过程中的数据类型转化又是什么样的呢?


    1 输入数据的类型

    这个输入类型很容易被人忽略且搞错,ToTensor这种操作的输入可以是numpy也可以是PIL.Image,但是其它与图片处理相关的操作比如旋转剪切的输入都需要是PIL.Image类型. PIL. Image.open的输出类型实际上是:
    在这里插入图片描述在这里插入图片描述
    转化为RGB之后才是通常意义上的PIL. Image图片类型。

    2 PIL.Image.open读取的结果

    PIL.Image.open函数读取的结果可以通过np.array或者np.asarray直接转化成矩阵类型。如果原图本身就是RGB图,那么转化得到的numpy矩阵就是三维的,且通道数是最后一个维度;如果原图本身就是灰度图,那么转化得到的numpy矩阵就是二维的,而convert(“RGB”)后的数据转化为numpy时则是三维的了。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    注意事项:
    虽然PIL.Image.Image没有shape属性,但是其是具有size属性的,而且可以发现对于灰度图,即便是convert(“RGB”)了其size仍然是保持二维的,只有转化成numpy之后才变成三维的,为什么呢?继续往下看,可以发现即便输入是RGB彩色图,其size也是二维的。**
    所以不妨可以这样理解,PIL.Image.Image的size只关注图片的宽度和高度,而不关注通道数,通道数应该由其他的属性来参与控制。
    在这里插入图片描述
    在这里插入图片描述

    3 额外补充

    【1】torchvision.transforms.Compose中只有遇到了toTensor操作之后输出结果才会变成Tensor类型,在没有遇到该操作之前的所有输出依旧是保持PIL.Image.Image数据类型。
    【2】cv2.Canny函数无论输入是二维的灰度numpy数组还是三维的RGBnumpy数组,其输出都是二维的numpy.
    【3】Image.fromarray是有一个mode参数的,用来决定以何种方式来读取这个numpy数组。L代表以灰度方式进行读取,RGB代表以彩色方式进行读取,没有指定时会依据数据类型推断出来。PIL.Image.Image类型有get_pixel方法来获取指定几何位置的像素值。Image.fromarray传递的numpy矩阵必须是uint8类型,否则报错,x = x.astype(np.uint8).
    在这里插入图片描述
    【4】所有继承torch.utils.data.Dataset的数据集子类其__getitem__(self, i)的返回值中不能包含None类型的数据。
    在这里插入图片描述
    【5】https://pytorch.org/vision/main/generated/torchvision.transforms.Grayscale.html
    GrayScale的转化不会将PIL.Image转化成Tensor,输出类型还是PIL.Image,并且也不会归一化,也不会进行阈值化(即把图片变成只有0和255的这两种灰度值)。
    【6】ToTensor是将(H, W, C)转化为(C, H, W),注意H和W的相对顺序是没有发生改变的
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    基于javaweb的零食商城系统(java+ssm+jsp+mysql+easyui)
    Python 算法:学习二分法
    【Linux常用命令15】shell脚本
    盘点Spring/Boot的那些常用扩展点
    Vim简介
    智能采购管理系统有哪些应用优势?如何高效提升医药制造业采购管理效率?
    开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS、银河麒麟上运行!
    tf.math
    【23种设计模式】里氏替换原则
    【数据结构】图的实现
  • 原文地址:https://blog.csdn.net/good18Levin/article/details/126564412