本文于2020年出自FACEBOOK AI,方法相当新颖,融合了由NLP领域兴起并风靡其他各个领域的transformer结构,与常规目标检测不同的是,它摒弃了现在主流的目标检测器中的Anchor生成、NMS等操作,不同于R-CNN系列,也不同于YOLO系列,亦区别于其他Anchor-Free模型,做到真正的End-to-end,堪称目标检测的新范式。DETR将检测视为集合预测(Set prediction)问题,直接简化了整体流程。相当值得好好学习一番,最近经过刚看完论文的半懵逼状态,再拜读其源码后,恍然大明白并直呼神奇,特作此学习记录,如有理解错误,欢迎指正。
论文: https://arxiv.org/abs/2005.12872
代码:https://github.com/facebookresearch/detr
简介
问题:现代检测方法预测物体目标框和类别的集合通常采用间接的方法,通过定义proposal、anchor、window center等来辅助替代直接的回归和分类,以及后处理去除重复预测。
目标:简化pipeline,无需预先设定anchor及去除后处理,直接端到端回归分类。保证准确率及实时性。
方法:利用transformer处理序列问题的优点即序列中的元素成对相互作用从而具有全局感受野,其次利用二部图匹配(匈牙利算法)将预测结果与标签匹配从而省去后处理操作。
优缺点:对大物体检测表现很好,但对小物体不尽如人意,作者也是挖了个坑,希望未来的工作在小物体上得到有效提升。
DETR模型
网络结构
如图所示,DETR网络分为3部分,首先为以resnet为backbone的CNN网络提取图像特征,目的是生成低分辨率的特征图
2048
∗
H
32
∗
W
32
2048*\frac{H}{32}*\frac{W}{32}
2048∗32H∗32W,作为transformer的输入减少内存消耗;其次是标准的transformer的encoder-decoder结构,最后经过前馈神经网络FFN得到最终的预测输出(预测分类头的是一层全连接,预测回归头的是三层感知机网络)。虽然文中用的是标准版transformer,但是输入输出会有些许变化,还是来复习一下其具体的结构及实施方案吧。
encoder输入是将图片拉直,每个像素看作是一个token,通道C看作其序列编码。因为transformer是具有排列不变性(permutation-invariant)的,因此需要 fixed positional encodings,经过Q、K、V编码的Multi-Head Self-Attention后,与其输入维度一致。说一下自己的理解,multi-head attention和conv还是有一些相通的地方,multi-head attention可以看作是一个具备全局感受野,按照attention weight加权平均的conv操作,而conv是因卷积核的大小而决定其作用域大小,所以multi-head attention其作用范围比conv更广,因此总体而言transformer的特征表达的能力会更强一些。
decoder共需要多个输入,queries(初始设为0,维度决定了可输出的object数量)、output positional encoding (object queries),encoder memory,encoder positional encoding。前一个decoder layer的输出是下一个的输入,最终输出与输入相同维度的向量。需要注意的是,模型最终能预测的最大检测框数量是由decoder的输入embed维度来决定的。
对于论文中的Multi-head attention和Multi-head self-attention,这里做一个细节区分,Multi-head attention的输入:Key、Value序列是相等的,而Query序列与Key、Value矩阵不相等。Multi-head self-attention的输入:Query序列与Key、Value矩阵都相等。后者可以看作是前者的特殊case。
对于Q、K、V的设计,与谷歌的经典开山之作一致,Q的作用顾名思义query是作为引子,主要是为了固定想要的输出向量shape;K的作用是与Q相乘得到attention score,经过softmax的洗礼得到attention weight,即是K中的所有位置对Q中每个token位置所占的比重大小,最后与weight再乘V值,得到每个输出token的最终编码。
损失函数
模型定义了一个最多能预测的检测框个数N,假设N一般要大于一张图像中的要检测的物体数量。首先需要得到一个在预测和标签之间最优的二分图匹配结果,即每个真实物体与之匹配的预测结果,再由此匹配顺序计算真实物体与匹配的预测之间的损失。
举个简单例子解释一下二分图匹配,假设有3个男生和3个女生,按性别分成了两组,我们作为月老强制其两两进行配对结为夫妻,每组内部不可配对(废话),我们的依据暂且是根据两两之间的预期离婚概率,我们的配对结果是站在全局角度,应保证整体的离婚率最最低的。
男1 | 男2 | 男3 | |
---|---|---|---|
女1 | 0.4 | 0.1 | 0.3 |
女2 | 0.2 | 0.0 | 0.5 |
女3 | 0.3 | 0.2 | 0.2 |
经过推算,发现女1-男2配,女2-男1配,女3-男3配这种方法是概率最低的其总和0.5,虽然女2-男2配对离婚的概率是0,这对于他们俩是最好的结果,但还应该顾及到其他人的感受,毕竟我们要有大局观嘛。现在只有3对6个人,还比较好说一些,如果需要匹配的人数太多了,我们纯靠眼睛看是无法直接看出结果的,这种求二分最大/最小匹配的方法就需要以前大佬们提出的匈牙利算法了,具体原理不再分析,如果直接拿来用的话,在scipy库里直接调用linear_sum_assignment函数即可。
(1)求解二分图最小匹配:构造预测query slots 与标签object target的二分图,其配对的值为当前query slot 对当前真实object target类别的概率值+box的L1和Generalized IOU,利用匈牙利算法得到配对结果(多余的query slot无需配对,看作是背景类了)。
(2)由匹配结果计算总损失:根据预测与标签匹配的结果顺序,计算分类头的loss和回归头的 loss。分类头loss计算将标签padding构造成和预测结果同样的维度[Batch_size, N, num_classes+1背景],且标签顺序是和预测的配对结果一一对应,对于padding后的标签中多出来的部分,统一设置为背景类,计算所有的对象得到分类交叉熵,这里作者为了平衡类别,将背景类的权重增大设为了10。回归头loss计算由对应L1 loss和Generalized IOU loss组成,由于L1对于物体的大小极为敏感,在大、小物体同时预测误差相似的情况下,L1距离会有不同的尺度,所以加入了后者,Generalized IOU,其具有尺度不变性,可以缓解L1的尺度敏感缺陷。这里需要注意回归头的损失计算只关注真实object targets与query slots有效匹配的数量对loss计算,其多余的沦为背景的部分不参与计算。
全景分割
DETR的过人之处在于,其还可以直接加入一个mask head,用作更加复杂的全景分割任务。解释下全景分割,简单来说就是语义分割+实例分割的结合体,按照图像内容来说其类别总体主要分为两大类,不可数的类别stuff(如草地,天空),可属的类别thing(如人,车),对于不可数的类别stuff,只需对其进行类别的区分,而对于thing来说,不止需要进行语义级的分类,还需要进行个体间的分类,难度大大增加。
检测只需对每个检测框进行最终的分类,检测框的数量由queries决定,而分割需要逐像素点分类,那么分割的pixel-level级分类是如何得到的呢?难不成N要等于H*W吗,那未免计算量也太大了。这就要说mask head的奇妙之处了,如果只看论文可能会一脸懵逼(对本菜鸡而言),但是看完源码,只能感叹作者神奇的脑洞。
transformer的输出向量[B, N, d]与encoder memory经过multi-head attention操作得到attention maps,其中的细节是先将decoder output(尺寸[B, N, d])的hidden_num拆成M个,尺寸为[B, N, M, d/M],M是transformer中的multi-head attention中的head个数。将encoder memory(尺寸[B, d, H/32, W/32])也按照相同的规则拆成[B, M, d/M, H/32, W/32]。再将拆完的两者相乘得到两者的attention weight [B, N, M, H/32, W/32 ],即每个query embed和每个head之间的feature map权重,称为attention maps,得到与原始图像成比例大小的特征图,为后续得到整个图像的像素分类铺垫下维度基础。配合FPN特征金字塔,融合Resnet提取的中间层特征图,进行细节还原。FPN在此的的优点是其中高分辨率特征图保留物体细节信息多,低分辨率图提取语义信息多,两者优势相结合。
全景分割的标签与检测的表现形式不同,其尺寸为[N, H/32, W/32],每个N可看作是一个实例类别,每个坐标位置为二分类,举例说明:对于当前点(N0, H0, W0),若其属于属于第N0类,则为1,否则为0。可见同一个像素位置可能被预测为多个类别,则由其argmax取其置信度最大的一类作为其像素类别。最终由上采样可得到原始图像的全景分割效果。
对于实验部分就先不一一介绍啦,总之很强就对了。还是以学习大佬们的思想及方法为主,希望通过日积月累,会给自己带来些许启发,小菜鸡的打怪取经之路,道阻且长,行则将至。