文章目录[隐藏]
0. 论文基本信息
《自动学习的线性迁移网络实现快速的图片和视频风格迁移》
会议: CVPR 2019 pp. 3809-3817
被引次数:261 (2021/4/14)
开源代码链接:github
论文链接:paper
1. 论文解决的问题
目标检测任务(主要)和实例分割任务(次要)。
输入是自然图像,输出其中对象的位置框和类别。分割任务是输出每个实例的像素区域
2. 论文贡献
- 提出了一种新的检测思路,将目标检测任务视作为集合预测问题
- 在目标检测任务中,此前的检测器大都先用手工设计的候选框预测方案,例如anchor或滑动框。这些方案也包含了其他先验知识的干涉,例如NMS等后处理方案、anchor的设计、训练时如何将检测结果与ground truth匹配等。这些手工设计的策略让人对其泛化性能会有一些怀疑。
- 本文通过将transformer融入模型,简化检测流程,跳过手工设计的部分,将问题转化为集合预测问题,以端到端的方式直接输出预测的(对象,框)的集合。
- 本文的方法还可以用来做segmentation任务
3. 方法框架
主干网络
- 常见的CNN,例如ResNet50和Res101
- 例如输入是
- 输出的是特征图
- 论文里设置C=2048,H = H0 / 32, W = W0 / 32
transformer:
- encoder
- 每个encoder层具有相同的结构,包含了一个多头自注意力机制以及一个前向网络FFN
- 先用一个1*1的卷积核减少feature map的通道数,得到
- 因为transformer的输入是一个序列,因此要拉伸为d×HW。
- 输入时还附带了一个位置编码器,可以在训练过程中一起学习,详见论文Attention augmented convolutional networks(ICCV 2019),也可以用固定的算法来生成,详见Image transformer(ICML,2018),实验结果里固定的效果更好一些
- decoder
- 和标准的transformer的decoder结构有些不同,将encoder输出的特征和N个需要训练的对象检测参数(论文内称为Object Queries,和位置编码一样,也要学习,或者固定算法生成)计算后输出N个独立的特征张量
- 需要注意的是decoder中的这N个对象检测是并行的,不是像以往的transformer用法那样一个一个输出序列。因为本质上每个对象检测都是独立的。
- 预测层FFN:
- feed forward networks,图中画的多个FFN模块其实是同一个模块,所有类别共享参数,蕴含了每个对象独立检测的意思。
- FFN的输入是decoder对Object Query解码后的输出。
- 边框预测是用ReLU激活的3层感知机,类别预测是一个线性层+softmax预测层。
4. 目标检测转化为集合预测问题
- 常见的目标检测方法如Faster-RCNN,RetinaNet等都是通过预设anchor的方式进行预测,这种方式本质上就是类似滑动窗口的一种模式。而使用这种滑动窗口的方式其实是通过先验知识人为地给检测任务降低难度。
- 论文引用的[52]证明,这些模型的最终性能严重依赖于他们初始猜测的集合的精度。
- 在本论文的模型中,移除了根据先验知识划定的候选框,通过直接预测具有绝对box的检测集合(即相对于整张图像,而非anchor)简化了检测过程。
- 直接预测候选框和类别意味着直接输出(类别概率分布,框)的集合,而一张图中的ground truth其实是一个(类别,框)的集合,
- 因此将问题从单目标检测问题变成了集合预测问题。
- 但这种方式从直觉上看会比基于滑动窗口的方式更难。基于滑窗的方式就像人为地给了一个梯子,帮助网络去越过障碍,而集合预测就更需要网络真正懂得图像的语义而直接越过障碍。
- 集合预测带来的最大好处就是训练与预测变成真正的端到端,无需NMS的后处理,十分方便。同时,也不用人为地预设anchor和 size/ratio了。
- DETR检测完一张图片后会输出一个大小为N的set(下图左),每个元素里有一个bbox和预测的类别的概率分布,预测的类别可以是空,即背景类,用ϕ来表示
- ground truth中每一张图有可变数量的元素(下图右),每个元素里有一个标签的类别和对应的bbox,如果标签的数量不足N则用ϕ来补充,即随便找背景类来填充至N
- 这样两边sets的元素数量都是N,所以我们是可以做一个配对的操作,让左边的元素都能找到右边的一个配对元素,每个左边元素找到的右边元素都是不同的,也就是一一对应。这样的组合可以有N!种,所有组合记作σN。这个N即是模型可以预测的最大数量。
5. 配对方式 - bipartie matching loss
- 下式是配对时用的损失函数(不在训练的损失范围内),目标是在保证类别正确的同时,最小化边框的误差
- 其中1{}是当花括号内为真时取1,i是ground truth中的第i个元素。ci是第i个class。bi是ground truth中的第i个bbox。σ(i)是某个组合方式中ground truth的第i个元素对应predictions集的映射index。pσ(i)表示σ(i)指向的元素对应各个类的概率分布。bσ(i)表示predictions中σ(i)指向的元素的bbox。
- 配对方式是匈牙利算法
- 详见https://blog.csdn.net/dark_scope/article/details/8880547
- 读起来不超过5分钟,需要比较多图说明,这里不放了。简单概括就是先到先让,abc和def在两个集合里,a先配对到d;如果b也配对到d,则a让出d,a再去配对其能配对的第2个(假设为e);然后c如果配对到e,则让a再找a能配对的第三个(假设只剩f),如果c配对到d,则b先让出d,假设b第二次配对到f,则这时a再让出f。
- 通过上面的配对损失,预测集和gt集能得到固定的一组最优配对。
损失函数
- DETR的损失和匹配损失类似,作者称为匈牙利损失(Hungarian Loss)
- 其中将类别判定部分改用了对数,且这时把背景类ϕ也纳入考虑。
- 在之前进行match时候的损失不是对数,而是二值函数,意味着把和ground truth类别一致的,且bbox最接近的预测结果对应上就完事了,不关心其他那些背景类ϕ。
- 但是在算训练模型的Hungarian loss时,我们不希望模型会预测出乱七八糟的结果,背景类ϕ就是ϕ,没有就是没有,该预测为ϕ的时候预测出东西了,就要加重惩罚,不过对ϕ类的权重除以10以平衡样本量。
- 边框损失Lbox如下,λiou和λL1是超参数,用于调整IoU损失和预测框的L1损失,Liou用的是GIOU损失
- 辅助解码损失:在训练过程中对每个decoder之后都添加了FFNs和匈牙利损失,所有的FFNs共享参数。另外在每一个decoder层的FFNs之前使用了共享的layer-norm进行归一化。论文称这些操作对训练有益。
6. Transformer
- transformer的细节内容太多,这里先贴上原论文地址和我学习看的博客
- 以及youtube的讲解视频地址
- 简单来说就是一个能够代替RNN的东西,RNN能做的它基本都能做,而且是通过矩阵计算的方式,可以用GPU高速并行计算。
- encoder
- 每个encoder层具有相同的结构,包含了一个多头自注意力机制以及一个前向网络FFN
- 先用一个1*1的卷积核减少feature map的通道数,得到
- 因为transformer的输入是一个序列,因此要拉伸为d×HW。
- 输入时还附带了一个固定的transformer位置编码,可学习,详见论文Attention augmented convolutional networks(ICCV 2019),也可固定
- decoder
- 标准transformer的decoder结构,不过将encoder输出的特征和N个需要训练的d维对象检测特征(论文内称为Object Queries,见上图)使用多头自注意力机制和解码机制进行转换。
- N个Object Query对应了模型的N个输出,这些输出都输入FFN解码为类别和box。(图中encoder的N×和decoder的M×指的是层数,不是这里的N个对象输出)
- 需要注意的是decoder中的这N个对象检测是并行的,不是像以往的transformer用法那样一个一个输出序列。因为本质上每个对象检测都是独立的。
- 预测层FFN
- feed forward networks,FFN的输入是decoder对Object Query解码后的输出。
- 边框预测是用ReLU激活的3层感知机,类别预测是一个线性层+softmax预测层。
7. 实例分割任务
- 将所有预测出来的实例的box输入后续的网络中,该网络部分不在本论文中,只是稍微提了一下可以这么做。
- 大概意思就是在decoder的输出预测框后面加了一个和FPN(Feature Pyramid Network)差不多的网络,用于将图片特征图反映到原图大小,再进行像素级的argmax得到实例分割结果。
- 这个部分其实相当于后面加上去的,即2-stage的实例分割。
8. 实验
物体识别任务实验
- 数据集:COCO 2017
- 评价指标:
- AP:AP在变量为IoU的threshold∈(0.50:0.95:0.05)时的积分
- AP50,AP75:IoU的threshold为0.5和0.75时的AP
- APS:小对象(<32*32)的AP
- APM:中等大小(3232 - 9696)的AP
- APL:大对象(>96*96)的AP
- 主要实验设计:
- 采用AdamW训练DETR,transformer的初始学习率设为1e-4。backbone的初始学习率设为1e-5,权重衰减系数为1e-4。
- 所有的transformer的权重使用Xaiver初始化,backbone采用ImageNet预训练的ResNet模型,并锁定batchnorm层。
- 测试了两种不同的backbone:ResNet50和ResNet101.对应的模型分别称之为DETR和DETR-R101。
- 在ResNet的最后一个stage上增加了扩张系数,以及在该阶段的第一个卷积层中移除了stride=2的限制,其模型分别称之为DETR-DC5和DETR-DC5-R101(分别对应ResNet50和ResNet101)。
- 数据增强
- 尺度增广,将最小边限制在480~800,最长边小于1333。
- 随机裁剪,训练图像依0.5的概率随机裁剪为一个矩形块,然后再resize到800-1333。
- transformer训练时采用0.1的dropout参数。
- 模块分析:
- 设计4中的修改使最后输出特征的分辨率增加了两倍,提升了小目标的检测,但encoder中的自注意力机制的计算代价增加了16倍,最终导致计算资源消耗增加2倍以上。
- 为了优化AP,论文使用置信度第二高的类别作为其类别,相对于直接剔除空集预测,这能提升AP约2个百分点。
- 设计5的增强方案大约提升了AP一个百分点
- 与FasterRCNN的对比
- Transformer需要很长的训练周期,因此DETR比FasterRCNN训练慢很多。
- 同样和前面的实验一样,论文中也对FasterRCNN中的ResNet用50和101版训练过,也对最后一个stage进行了扩张(表中后缀DC5)。后缀+表示也一样进行数据增强。
- 结果表明DETR在大目标上(APL)有着很好的效果,但是在小目标上(APS)效果不佳
- 消融实验:
- 论文内选择ResNet50的DETR作为研究对象
- encoder层数的影响:
- 不使用encoder时,AP下降了3.9, 大目标甚至下降了6.0个AP。论文认为,利用encoder的全局信息推理,encoder能够更好的理解目标
- 论文中可视化了最后一层encoder的注意力图,发现encoder能关注到有一定的目标抽取和定位能力
- decoder层数的影响
- 由于辅助损失函数,每个decoder层都会进行预测,论文里直接评价每一层预测的精度,如Fig4所示,发现随着层数增加性能越来越好。
- NMS的非必要性
- 为了验证DETR不再需要NMS操作,在每一层decoder上都使用NMS,Fig4里发现只有第一层性能提升较明显,其后随着层数增加NMS作用越来越小。
- 作者认为原因在于第一层还不能全面计算输出元素之间的相互关系,因此倾向于同一个目标预测多个结果,而随着层数增加相互关系更全面,也就不会产生重复预测,此时NMS用处可以忽略不计。
- decoder的注意力
- Fig6里用和框一样颜色的斑块表示decoder的注意力区域,可以看到和encoder关注的整个物体内部不同,decoder更多关注目标的边缘
- FFN的重要性
- 移除decoder中的所有FFN后,参数量由28.7M降为10.8M,但其性能AP也将下了2.3个点,因此说明FFN对于获得较好性能很重要。FFN在transformers中可以认为是1x1的卷积层,使encoder更像attention增广的卷积网络。
- pisition编码的影响
- 框架里有两种位置编码:
- 图像空间位置编码,用于encoder和decoder中做self attention时加到输入上,是可加可不加的部分。可以使用可学习的方式,也可以用固定算法生成(用的就是二维位置上的sin和cos函数,详见源代码,下图截取了片段)。
- 输出位置编码,即decoder中的Object Query,可以学习,也可以固定,论文里只用学习后的
- 论文探究了图像空间位置编码的影响,表中sine表示使用固定算法,learned表示使用的是可学习的参数。none表示不使用位置编码,at input表示只在第一层encoder或decoder输入时加上一次位置编码,at attn表示在每一次self attention计算时都加上一次位置编码。
- 实验表明,在每次自注意力计算时都加上固定算法的位置编码效果最好。不加上位置信息效果很差,而只在decoder层加上位置编码效果只下降一点点
- 以上所有消融实验表明,transformer的多层encoder-decoder、FFN、位置编码都是对最终效果有益的。
- Loss实验
- Loss由3部分组成:匹配损失、边框损失、类别判定损失,实验后发现3个损失加权时效果最好。
- Decoder中Object Query的最终输出位置
- 每个query都对应一个检测框,论文里把这些框的中心点都画出来了,可以发现不同的query有不同的倾向位置
实例分割实验
- 数据集:COCO 2017
- 评价指标:
- RQ(recognition quality)识别质量
- SQ(segmentation quality)分割质量
- PQ(Panoptic Quality)全景质量
- 上标th和st分别表示thing和stuff的分类
- 人,车等有固定形状的物体属于 things 类别,可数名词通常属于 thing
- 天空,草地等没有固定形状的物体属于 stuff 类别,不可数名词属于 stuff
- AP,分类平均准确率
- 实验设计:
- 和当时最好的几个算法比较
- 结果:
- DETR效果不错,见下表
9. 数据集
版权声明:本文为CSDN博主「D-Mer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43959709/article/details/115708159
暂无评论