第二十三章 原理篇:Pix2Seq

本文详细阐述了Pix2Seq框架,如何将目标检测转化为基于像素的语言建模任务,涉及编码器-解码器结构、数据增强、坐标离散和序列增强策略。

大夏天我好像二阳了真是要命啊。
现在找到工作了,感觉很快乐,但是也有了压力。
《论你靠吹牛混进公司后该怎么熬过试用期》
希望自己能保持学习的习惯!加油!


参考教程:
https://arxiv.org/pdf/2109.10852.pdf
https://github.com/google-research/pix2seq
https://zhuanlan.zhihu.com/p/421851551
https://github.com/moein-shariatnia/Pix2Seq
感觉自己理解的还是不太到位,主要是decoder相关的部分没有实践上使用过,纯理论不足以支撑完全弄清decoder的作用。

背景

作者提出了一个用于目标检测的新框架Pix2Seq,把目标检测问题作为一个基于像素输入的语言建模任务。目标描述(包围框,类别)等以离散token的形式表示。

作者认为,现在有很多先进的目标检测方法在不同的领域取得显著的成就,但是任务的独特性和复杂性,让这些方法没有办法很好地泛化到更大范围的任务上,这也是这些方法的局限性。它们从先验知识中学习,但是又受限于先验知识。

pix2seq框架基于这种一种直觉:如果一个神经网络知道目标物体的种类和位置,那么我们只需要教会它怎么表达出来。通过学习“描述”对象,模型可以学习将“语言”建立在像素观测的基础上,从而获得有用的对象表示。给一种图像作为输入,pix2seq会产生一系列和目标描述相关的的离散token。

把目标检测任务当作一个基于像素输入的语言建模来作,可以使用比较generic and simple的模型框架和损失函数,而不是那些专门为目标检测任务设计的复杂组件。并且框架也可以轻松地被应用到别的领域上,它能为多种类型的视觉任务提供一个语言接口。

为了使用pix2seq解决目标检测任务,作者主要做了以下工作:

  1. 提出了一个量化序列化机制:将包围框和类别等信息转为离散的token序列。
  2. 利用encoder-decoder架构接受像素输入并生成目标序列。
  3. 目标函数使用基于像素输入和先验token的token的极大似然。
  4. 使用augmentation方法组合先验知识。

方法

在这里插入图片描述
作者提出的pix2seq框架有四个主要的部分:

  • Image Augmentation: 使用数据增强的方法来扩充训练数据,比如说随机缩放和裁剪。
  • Sequence construction&augmentation: 把目标检测任务中常用的包围框和类别标注转换为一组离散的token。
  • Architecture: 使用encoder-decoder模型,encoder获取图像像素输入,decoder生成目标序列。
  • objective/loss function: 模型训练的目的是最大化基于图像输入的token的log似然函数。

【有一说一看完之后还是有点云里雾里的,比如说序列增强的部分,没太明白inference阶段的那个做法】

从目标描述中构造序列

在常见的目标检测数据集中,一个图像中可能有多个目标,用一组包围框和类别标签表示。在pix2seq中则是要转成离散的序列表示。

在包围框和类别两种标签中,类别标签是天然地表示成一个离散的token的形式的。而包围框通常是表示成两个角点(左上角和右下角)或者它的中心点与宽高。要把连续数字离散化后来表示它的坐标。具体来说,一个目标被表示成拥有五个离散token的序列: [ y m i n , x m i n , y m a x , x m a x , c ] [y_{min},x_{min},y_{max},x_{max},c] [ymin,xmin,ymax,xmax,c]。其中每个连续坐标被均匀地离散为介于 [ 1 , n b i n s ] [1,n_{bins}] [1,nbins]之间。所用的token共享一个词库,所以词库的大小等于bins的数量加class的数量。

对于一个600x600的图像,就是用600bins,比一般常用的语言模型的词库要小很多。下图显示了不同的bins带来的效果差异。使用的bins比较大的时候,小图像显示出很高的精度。
在这里插入图片描述

在得到每个目标的离散化的表达后,还需要把多个目标描述进行序列化的组合,来形成一个给定图像的整体描述。在目标检测中,目标的顺序对检测任务并没有什么影响,所以作者使用了随即顺序。作者也探究了别的排序方法,但是认为在网络能力足够的情况下,不同的顺序方法表现将一样好。

因为不同的图像会有不同个数的目标,生成的序列也会有不同的长度,使用一个EOS token来表示序列的结束。

不同顺序的序列表示如下:下图中使用的bins大小为1000,所以类别标签是从1000开始计数的。最后的0表示的是EOS token。
在这里插入图片描述
在论文附录中给出了比较简单的量化和反量化的代码。

  1. Quantization of coordinates

    def quantize(x, bins=1000):
    	return int(x*(bins-1))
    

    这里的x是normalized的坐标,代表它相对原始图像边长的大小,范围在[0,1]之间。

  2. Dequantization of discrete coordinates

    def dequantize(x,bins=1000):
    	return float(x)/(bins-1)
    

    就是将上面的结果复原的方法,两者可以说互为反函数。

architecture, objective and inference

architecture

使用一个encoder-decoder的结构。encoder用来把输入的图像编码成一个隐层表达,常用的可以是卷积网络或者transformer或者它们的组合。生成的部分,也就是decoder的部分,作者选用了transformer的decoder,它在语言模型中被广泛使用。每次可以基于先前生成的token和编码图像表达生成一个新的token。

objective

和一般的语言模型类似,pix2seq被训练来在给定图像和之前的

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值