视觉transformer图片处理思路

我们知道,transformer要求将图片分为patch,然后输入网络进行计算,那么我们就需要将二维的图片处理成一维的embeding形式,今天我来给大家介绍一下图片处理的思路。

我们演示一下处理下面这张图片

我们将图片按照16*16的大小进行分片,得到的结果如下图所示

接下来我们需要将patch变成tensor。在此之前先介绍一下传统CNN图片处理和transformer图片处理之间的区别

我们可以看到,传统CNN图片处理得到的向量是三维的,而transformer图片处理得到的向量是二维的,其中num表示一张图片分片数量(也就是分成多少个patch),第二个维度中patch*patch表示每个patch的面积,channel表示通道数。

当我们训练网络的时候,通常需要将数据加载成batch的形式,一个batch里面通常包含多张图片,所以数据格式如下所示

也就是说,transformer送入网路进行计算的数据是三维的,而传统CNN送入网络进行计算的数据是四维的,这也是CNN和transformer数据加载的主要区别。

下面就贴一段数据处理的演示代码,你可以按照这个代码的思路去写数据加载器。

import torch
from PIL import Image
import torchvision.transforms as tfs
import matplotlib.pyplot as plt


class ImgFactory(object):
    def __init__(self, patch=16):
        super(ImgFactory, self).__init__()
        self.patch = patch
        self.im_tfs = tfs.Compose([
            tfs.ToTensor(),
            tfs.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])

    def getImagePatch(self, filename):
        img = Image.open(filename)
        width, height = img.size
        num_patch_w = width // self.patch
        num_patch_h = height // self.patch

        patch_list = []

        num = 1
        for i in range(num_patch_h):
            for j in range(num_patch_w):
                s_y = i*self.patch
                s_x = j*self.patch
                box = (s_x, s_y, self.patch+s_x, self.patch+s_y)
                region = img.crop(box)
                patch_list.append(region)
                plt.subplot(num_patch_h, num_patch_w, num), plt.imshow(region), plt.axis("off")
                num = num + 1

        plt.savefig("patch.png")

        for i in range(len(patch_list)):
            patch_list[i] = self.im_tfs(patch_list[i])
            patch_list[i] = patch_list[i].view(1,-1)

        seq = torch.cat(patch_list, dim=0)
        return seq






if __name__ == "__main__":
    factory = ImgFactory()
    seq = factory.getImagePatch("a.png")
    print(seq.shape)

输出结果是一张图片加载成tensor的格式

 

  • 15
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值