torch.tensor与numpy array转换相关问题
- CV2.imread(file)返回的是numpy array,且形状为[h,w,c],若要被pytorch搭建的网络处理,需先转为tensor,并且要x.permute(2,0,1)转换为[c,h,w]结构。
- numpy的device只能是cpu,而tensor则cpu,gpu均可,若tensor转numpy还要注意将tensor先转到cpu。
- numpy转tensor: torch.from_numpy()
tensor转numpy: tensor.numpy()。 - require-grade的tensor无法直接转numpy数组,要先detach,即teansor.detach().numpy。
cv2/Dataloader/PIL返回图像对比
-
使用PIL得到的图片尺寸是[h,w,c],通道为RGB,取值范围0-255。
-
使用DataLoader得到的图像尺寸是[N,C, h, w],通道为RGB,适用于pytorch卷积的尺寸,取值范围0-1。tensor类型。
-
使用cv2得到的图像尺寸是[h, w, c],通道为BGR,取值范围0-255。numpy数组。
因此,若来源不同的图像要混合处理,一定注意转换数据类型,以及是否需255归一化或反归一化,尤其cv2最特别,其通道为BGR,若转为其他类型还要转为RGB。转换方法:
sample = cv2.cvtColor(sample, cv2.COLOR_BGR2RGB)
cv2图像读取mode参数
cv2.imread(path, mode)
mode:
cv2.IMREAD_COLOR:默认,读入忽略alpha通道的彩色图片,可用1实参替代
cv2.IMREAD_GRAYSCALE:读入灰度图像,0实参
cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,-1实参