api查询

记录自己常用 API Demo

Tensor PIL Numpy 图片编码互转

To Tensor

1
2
3
4
5
# PIL->Tensor 0-1
PIL_img=Image.open('palette.png').convert('RGB')
tensor_img=torchvision.transforms.functional.to_tensor(PIL_img)
#Numpy->Tensor
tensor_im=torch.from_numpy(numpy_img)

To PIL

1
2
3
4
5
# Tensor->PIL
from torchvision.transforms import ToPILImage
PIL_Img=ToPILImage()(tensor_img)
# Numpy->PIL
PIL_img = Image.fromarray(numpy_img.astype('uint8')).convert('RGB')

To Numpy

1
2
3
4
# PIL->Numpy 0-255
numpy_img = np.array(PIL_img)
# Tensor->Numpy
numpy_img = tensor_img.numpy()
  • PIL: Width Height
  • numpy: Height Width Channel(128,128,3)
  • tensor: Channel Height Width
  • tf_tensor:[b, c, h, w]
  • torch_tensor:[b, c, h, w]

输出大小

1
2
3
4
5
6
7
numpy_img.shape     -->(128,128,3)

PIL_img.size -->(128,128)

tensor_img.shape -->torch.Size([3, 128, 128])

tensor_img.size() -->torch.Size([3, 128, 128])

PIL格式打开的图像toTensor会直接转成0-1

numpy的图片需要手动交换维度并转成0-1否则toTensor还是0-255

PIL转numpy也是0-255

在学习深度学习的时候,在将得到的特征tensor想要显示的时候,在代码里总是会看到transpose(1,2,0),这是因为在numpy中,图像的shape一般是(H, W,C),即图像的长宽是在前面,而通道数则是在最后一维,而在pytorch中呢,图像的shape一般是(C,H,W),通道数则是在第0维,因此,在tensor转换为numpy并进行显示时,需要将格式转换为numpy的格式,即(1,2,0),如果是numpy转换为tensor的话,那就是transpose(2,0,1)。

D:\folder
file1.txt
file2.txt
file3.txt

os

1
2
3
4
5
6
7
8
from os import listdir
from os.path import join

dir="D:/folder/"

file_list=listdir(dir)#['file1.txt', 'file2.txt', 'file3.txt']
file_no_ext=[x.split('.')[0] for x in listdir(dir)]
full_list=[join(dir,x) for x in listdir(dir)]

glob

1
2
3
4
5
6
import glob

dir="D:/folder/"

#获取路径下jpg/jpeg文件
full_list = glob.glob(dir+"*.jp*g")#['d:/folder\\file1.txt', 'd:/folder\\file2.txt', 'd:/folder\\file3.txt']

Path

1
from pathlib import Path

Torch 函数解释

  • Tensor.unfold(dimension, size, step)

    返回一个新的张量,其中元素复制于有原张量在dim维度上的数据,复制重复size次,复制时的步进值为step*

  • F.unfold(input, kernel_size, dilation=1, padding=0, stride=1)

    输入BCHW,在HW上用kernel为窗口取然后平铺在一维,不断滑动取完

    参考https://blog.csdn.net/qq_34914551/article/details/102940368

  • F.fold(input, output_size, kernel_size, dilation=1, padding=0, stride=1)

    逆运算,按一维取然后拼成kernel大小,然后再取按照stride重叠堆放,重叠部分相加,最后按照padding去掉边框。

    参考https://blog.csdn.net/tanmx219/article/details/82848841理解

unfold——im2col

fold——col2im

如果对你有帮助,请赏包辣条