PyTorch入门学习(一)Dataset类代码实战

前言

因为在写代码的过程中发现对整体的框架使用十分不熟,所以恶补一下pytorch的入门知识。

运行jupyter需要在cmd上,power shell上会出错(因为不久前我将默认终端应用程序改为Windows终端,可能前期的windows powershell没有装好,导致打开cmd出错,实际上平常用的是powershell),改过去之后直接用cmd进如pytorch虚拟环境运行jupyter

1
2
conda activate pytorch
jupyter notebook

加载数据

在pytorch中如何读取数据主要涉及到两个类,分别是Dataset和Dataloader

Dataset和Dataloader

cv2和PIL的区别

顺便一提(在准备MICCAI中遇到读取图片用的是cv2,但之前跟着写的代码都是用PIL)cv2和PIL的区别

  • 读取的通道不同:cv2读取图像为BGR顺序通道,PIL读取图像为RGB顺序通道;

  • 读取代码不同:

1
2
3
4
5
6
7
8
9
# cv2读取方式
input1 = r'E:\DRPL\data\blur\1_ILSVRC2012_val_00004507_3_183.jpg'
cv2img = cv2.imread(input1, flags=cv2.IMREAD_COLOR) # 默认以BGR形式打开
cv2.imshow("cv2img", cv2img)
cv2.waitKey(0)
# PIL读取方式
input2 = r'E:\DRPL\data\blur\1_ILSVRC2012_val_00004507_3_re183.jpg'
pilimg = Image.open(input2)
pilimg.show()
  • 读取出的图像类型以及尺度属性不同:
1
2
3
4
print(cv2img.shape, cv2img.size, type(cv2img))
print(pilimg.size, type(pilimg))
# cv2读取出图像的类型为ndarray类型,pil读取的为PIL类型。
# cv2读取的图像同时拥有shape()和size()方法,pil只有size()方法。

cv2和PIL读取图片的类型属性

  • 将cv2和PIL转换为tensor数据类型代码对比
1
2
3
4
5
6
trans = transforms.ToTensor()
tensor_cv2 = trans(cv2img)
tensor_pil = trans(pilimg)
print(tensor_cv2.shape, tensor_cv2.size(), type(tensor_cv2))
print(tensor_pil.shape, tensor_pil.size(), type(tensor_pil))
# 两者都可以转换为tensor数据类型

cv2和PIL转换为Tensor数据类型

  • cv2图像和PIL图像相互转换
1
2
3
4
5
6
7
# 将PIL转换为cv2# 方法1:用numpy.asarray()函数转化类型,再用cv2.cvtColor转化RGB为BGR通道.
trans_cv2img = cv2.cvtColor(numpy.asarray(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("trans_cv2img", trans_cv2img)
cv2.waitKey(0)# 方法2:可以不使用cv2.cvtColor,但是show出来的图像会发蓝,因为没有变换通道
trans_tocv2 = numpy.array(pilimg)
cv2.imshow("transtocv2", transtocv2)
cv2.waitKey(0)
  • 其他知识引申:
1
2
# 转换RGB的方法对比cv2img1 = cv2.cvtColor(cv2img, cv2.COLOR_BGR2RGB)
pilimg1 = pilimg.convert('RGB')

将PILimg转换为cv2时可以使用numpy.array(),也可以使用numpy.asarray(),这两者的区别在于array会copy出一个副本,占用新的内存,但asarray不会;

就是说将数据源用asarray转换后赋值给新的变量,再对原始数据源进行操作修改,会影响到新的变量数据.而如果用array来转换并赋值给新变量,修改原始数据后不会对新变量造成影响。

pycharm中读取数据

pycharm终端可以详细显示数据类型,下图为使用PIL读取数据过程

pycharm终端使用PIL

使用os读取图片路径存进列表中

使用os读取图片路径存储在列表中

数据可视化