标签 PyTorch 下的文章

OpenCV图像读取后,默认是预处理为HWC形状,而在PyTorch中,希望的是CHW形状; 另一方面,在通道顺序上,OpenCV默认是BGR的顺序,而在PyTorch的张量处理环节,我们一般希望的是RGB顺序。这里就涉及到了数据处理和转换。

OpenCV图像到PyTorch张量的转换

我们先模拟一个高度为2,宽度为3的彩色图像:

from torch import tensor

a = torch.randint(low=0, high=255, size=(2, 3, 3))

这里的a似于:

tensor([[[ 58, 223,  24], [ 35, 116, 249], [ 81, 220, 168]],
        [[242, 169, 149], [149,  87, 167], [165,  66,  88]]])

如果这个数据是从OpenCV读取过来,那么最内层通道顺序是BGR

为了得到RGB,我们可以将最内侧倒排一下:

b = a[:, :, [2,1,0]]

结果类似于:

tensor([[[ 24, 223,  58], [249, 116,  35], [168, 220,  81]],
        [[149, 169, 242], [167,  87, 149], [ 88,  66, 165]]])

但问题是,上面的张量形状是 (H,W,C),而在PyTorch中,我们期望的是(C,H,W)。现在我们将它拆分重排成RGB三个通道,其中每个通道都是一个2*3灰度图:

c = b.permute(2,0,1 )
print(c)

结果类似于:

tensor([
        # R通道
        [[ 24, 249, 168],
         [149, 167,  88]],         
        # G通道
        [[223, 116, 220],
         [169,  87,  66]],
        # B通道
        [[ 58,  35,  81],
         [242, 149, 165]]])

一个数据集加载示例

在《Modern Computer Vision》中,讲解了使用VGG16进行迁移学习,然后用于猫狗分类的示例。一方面VGG16预训练模型是在ImageNet数据集上训练得来的,其中所有图像都被缩放为 224 × 224 作为输入。为了充分利用预训练的权重,我们需要把训练的输入图像调整为相同大小。

阅读剩余部分