当使用torchvision中的transforms对图像做处理的时候,有一个处理transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),Normalize是把图像数据从[0,1]变成[-1,1],变换公式是image=(image-mean)/std,那么其中的参数就分别是三个通道的mean和std,这个均值和标准差需要自己计算,范围就是训练集和验证集的所有图像。
先定义一些需要的参数,图像最终的size是[3, img_h, img_w],imgs用于存放所有图像数据,data_transforms规定每个图像都需要先经过三个操作,首先按照最小边resize成256,然后使用中心裁剪成224x224大小,最后使用ToTensor换成形状为(C,H, W)的Tensor格式,且/255归一化到[0,1.0]之间。(具体数值可以自己决定,在之后的模型中对图像的操作应与此保持一致)
path就是你自己存放图像的路径,注意最后不要加'/',这个路径下的图像都是img_name.jpg。
使用PIL将图像按照RGB形式打开,经过transforms标准化处理,变成numpy数组以便组织所有图像数据。
img = img[:,:,:, np.newaxis]给每张图像增加一维,然后用这一维把所有图像数据顺序拼在一起放在imgs里。
这里举例说明一下np.concatenate():
a = np.array([[[1, 2]]]) #size = [1,1,2]
a = a[:,:,:,np.newaxis] #size = [1,1,2,1]
#此时 a = [[[[1],
[2]]]]
b = np.array([[[[3],
[4]]]])
b = np.concatenate((a, b), axis = 3)
#此时b = [[[[1 3],
[2 4]]]]
可以看出来,a和b就顺序拼接在一起啦。
之后依次把3个通道的数据拉成一行,计算mean和std.
c = b[0,:,:,:].ravel() #接上面的例子,我们只有一个通道
#此时的c = [1 3 2 4]
至此,means和stdevs中就存着3个通道的均值和标准差啦,可以拿到Normalize中使用了。