35 Matching Annotations
  1. Aug 2021
    1. 在这里插一句,在R-CNN中用到IoU阈值的有两个地方,分别是Training时Positive与Negative判定,和Inference时计算mAP。论文中强调的IoU阈值指的是Training时Positive和Negative判定处。

      这说的不清楚,简单说一下从RPN到FAST-RCNN的过程: 1、RPN是anchorbased,一共会有20000个左右的anchor;

      2、前向的时候,RPN会基于anchor,产生20000个左右的proposal;

      3、通过anchor和gt的IOU,选出大于0.7(或者和GT框IOU最大的anchor)的128个设置为正,IOU小于0.3的设置为负;

      4、利用上述256个anchor对应的proposal来计算loss,训练RPN;

      5、然后RPN的结果还需要供给给后面的FAST-RCNN用;先从20000个proposal中,根据置信度阈值选择最高的12000个;

      6、同时通过12000个进行NMS,将数量降低到2000个;

      7、最后计算这2000个与GT框的IOU,大于0.5的为正,小于0.5的为负,正选32,负选96,一共128个,用于FAST-RCNN训练;

      所以这里说的IOU阈值,指的是第7步的这里的IOU阈值。

    1. 简单来说,transformer容易处理具有图性质的输入类型,图是一种更普适的输入结构,图像和序列都可以转化为图,因此transformer是一种更普适的网络结构。self attention机制也无须你显式定义先验邻接矩阵,数据充足的情况下丢进去让模型自己学习边权连接即可。相应的transformer相对cnn rnn来说,模型往往参数更大,表达能力往往更强,通常需要更多数据才能喂饱它

      这个我觉得解释的很好呀,多模态之间的数据间可以理解为一种图的关系,transformer通过self-attention建立一张稠密图,并且让网络本身去学习每条边界的权重以及他们的关系;

    1. 多尺度特征融合带来的收益要远小于分而治之带来的收益,因此多尺度特征融合可能并非FPN最重要的影响因素;相反,分而治之将不同尺度的目标检测进行拆分处理,缓解了优化问题。

      对的,这个也是yolox的思想,在最后的输出头上,没有一次输出hw255这样的输出头,而是将其进行分成三个输出头,分别输出分类概率,长宽和iou预测值;

  2. Jul 2021
    1. # 最大化discriminator价值函数 d_value_real = tf.reduce_mean(d_outputs_real) d_value_fake = tf.reduce_mean(tf.ones_like(d_outputs_fake) - d_outputs_fake) d_value = -(d_value_real + d_value_fake) # 最小化generator价值函数 # g_value = tf.reduce_mean(tf.ones_like(d_outputs_fake) - d_outputs_fake) g_value = -tf.reduce_mean(tf.log(d_outputs_fake))

      discrimination的的时候,也是算两个E的那部分

    1. 在机器学习中,P往往用来表示样本的真实分布,Q用来表示模型所预测的分布,那么KL散度就可以计算两个分布的差异,也就是Loss损失值。

      loss是KL divergence,用来衡量两个分布之间距离。而KL divergence在展开之后,第一项是原始预测分布的熵,由于是已知固定的,可以消去。第二项是 -q log p,叫做cross entropy,就是平时分类训练使用的loss。与标签label不同的是,这里的q是teacher model的预测输出连续概率。而如果进一步假设q p都是基于softmax函数输出的概率的话,求导之后形式就是 q - p。直观理解就是让student model的输出尽量向teacher model的输出概率靠近

    1. 在解码器中,仅允许self-attention层参与输出序列中的较早位置。 这是通过在self-attention计算中的softmax步骤之前屏蔽将来的位置(将它们设置为-inf)来完成的。

      这句话要综合前面提到的 “解码器也具有这两层,但是在它们之间是一个attention层,可以帮助解码器关注到输入语句的相关部分上(类似于seq2seq模型中的attention)” 来看; decoders中第一个decoder的输入是之前预测的t个单词; 每次做self-attention仅能够和自己来做self-attention; 同时,还需要和之前encoder得到的k,v做全局attention;

      另外,这个mask也是为了训练时候方便,因为实际使用的时候,就算你想用全局的预测值,你也没有啊,而训练的时候,label就在那里= -

    1. 如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。

      这里的描述,现在来看,其实暗含着: 由于在Decoder操作中,对不同的输入都是用同一个网络来操作的,所以只能够通过调整输入的不同来尽可能的改变结果;

      根据不同的输入有不同的网络参数,目前看是不可行的~

      另外看,其实这里的描述不合适,并不是“每个英文单词”对翻译贡献相同,而是jerry这个词的贡献,在翻译tom,chase,jerry时候的贡献相同。

  3. Jun 2021
    1. 也就是heatmap被downsample至原来的1/n后,还想继续upsample回去的话会造成精度的损失,这会严重影响到小物体框的位置精度,所以作者采用了offsets来缓解这种问题。

      呃,就是roi align要解决的问题一致呀

  4. May 2021
    1. BN的核心思想不是为了防止梯度消失或者防止过拟合,其核心是通过对系统参数搜索空间进行约束来增加系统鲁棒性,这种约束压缩了搜索空间,约束也改善了系统的结构合理性,这会带来一系列的性能改善,比如加速收敛,保证梯度,缓解过拟合等。

      这个理解就很到位,不是说BN解决梯度消失问题,而是说BN再使得搜索空间变得更为光滑的同时,降低了训练时间,缓解过拟合,也让梯度消失不那么严重;

    1. 在了解了三种 Re-Scaling 的含义及 Normalization 对应的三种不变性特性后,我们先归纳各种 Normalization 操作所对应的三种 Re-Scaling 的不变性特性如下表所示(Layer Normalization 原始论文分析了 LayerNorm 及 BatchNorm 的 Re-Scaling 不变性,本文作者补充了 InstanceNorm 及 GroupNorm 的情况以及细化了推导过程):

      抑制了过大的weights带来的结果影响,一定程度上类似于与加入L1/L2 penalty的效果;

    2. 前文有述,BN 在 RNN 中用起来很不方便,而 Layer Normalization 这种在同隐层内计算统计量的模式就比较符合 RNN 这种动态网络,目前在 RNN 中貌似也只有 LayerNorm 相对有效,但 Layer Normalization 目前看好像也只适合应用在 RNN 场景下,在 CNN 等环境下效果是不如 BatchNorm 或者 GroupNorm 等模型的。从目前现状看,动态网络中的 Normalization 机制是非常值得深入研究的一个领域。

      现在多了一个transformer场景

    3. 另外一种是后续研究提出的,放在激活函数之后,不少研究表明将 BN 放在激活函数之后效果更好

      原理上是改变x的分布,使得下一层级的神经网络的净输出更符合某个规则,所以应该放在神经网络之后的;

    1. 我们现在无论用Pytorch还是Tensorflow,都会自然而然地加上Bacth Normalization(简称BN),而BN的作用本质上也是控制每层输入的模值,因此梯度的爆炸/消失现象理应在很早就被解决了(至少解决了大半)。

      BN本质上是无法解决梯度消失或者梯度爆炸的吧,最多是让input放缩到-1~1之间,这不还是可能消失的吗?

    1. 可以发现,性能随着解码器层数的增加而提升,DETR本不需要NMS,但是作者也进行了,上图中的NMS操作是指DETR的每个解码层都可以输入无序集合,那么将所有解码器无序集合全部保留,然后进行NMS得到最终输出,可以发现性能稍微有提升,特别是AP50。

      "假如有N个目标,那么100个object predictions中就会有N个能够匹配到这N个ground truth,其他的都会和“no object”匹配成功,这些predictions的类别label就会被分配为num_classes,即表示该prediction是背景。"

      那什么时候要NMS: 用6个解码器的输出,都作为后续的分类回归头的输入的时候,就会产生冗余,此时就需要NMS了。

    2. Query值一部分来自第1个Add and Norm的输出,维度为 的张量,另一部分来自Object queries,充当可学习的位置编码。所以,第2个multi-head self-attention的Key和Value的维度为 ,而Query的维度为。

      这么解释怪难懂的,解释为resnet思路就好了

    1. 解码器最终输出shape是(6,b,100,256),6是指6个解码器的输出。

      这里看了代码,是这样的 Decoder这里顺序排着有6个decoder,每个decoder的输出是(b,100,256) 这里的6就是指将这6个decoder的输出连起来,形成(6,b,100,256)这样的;

    2. 给定一张图片,经过CNN进行特征提取,然后变成特征序列输入到transformer的编解码器中,直接输出指定长度为N的无序集合,集合中每个元素包含物体类别和坐标。其中N表示整个数据集中图片上最多物体的数目,因为整个训练和测试都Batch进行,如果不设置最大输出集合数,无法进行batch训练,如果图片中物体不够N个,那么就采用no object填充,表示该元素是背景。

      呃,不再依赖于anchors… 但是如果这样的话,如果用同样的数据量,去训练一个MLP是不是也行?

    3. 自此现在就是变成10个向量输出,输出也是10个编码向量,然后取第0个编码输出进行分类预测即可。从这个角度看可以认为编码器多了一点点解码器功能。具体做法超级简单,0就是位置编码向量,是可学习的patch嵌入向量。

      另外就是第0个向量的embedding可以学习;且用最后一个encoder的输出的第0个向量,送入MLP,来作为分类依据;

      呃,没必要这么麻烦吧,最后一层的nm的输出,转置后得到mn,然后送入一个n1de mlp,然后再转置,得到1m,最后送入一个m*class_num的MLP就可以了?

    4. se模块最终是学习出一个1x1xc的向量,然后逐通道乘以原始输入,从而对特征图的每个通道进行加权即通道注意力,对attention进行抽象,不管啥领域其机制都可以归纳为下图: <img src="https://pic3.zhimg.com/v2-b40f05b5957b7f7cef7a10e4c97932a2_b.jpg" data-caption="" data-size="normal" data-rawwidth="736" data-rawheight="328" class="origin_image zh-lightbox-thumb" width="736" data-original="https://pic3.zhimg.com/v2-b40f05b5957b7f7cef7a10e4c97932a2_r.jpg"/>

      这里的attention就没有求和步骤,仅仅是加权了

    5. 其核心思想都是通过Encoder编码成一个表示向量,即上下文编码向量,然后交给Decoder来进行解码,翻译成目标语言

      类似VAE吧

    1. 以下步骤重复该过程,直到输出一个特殊符号,该符号指示transformer解码器已完成其输出。 每个步骤的输出将在下一个时间步骤中馈送到底部解码器,同时我们在这些解码器输入中嵌入并添加位置编码以指示每个单词的位置。<img src="https://pic2.zhimg.com/v2-f234ea0b61cc6c155581533add4396c9_b.gif" data-size="normal" data-rawwidth="1438" data-rawheight="790" data-thumbnail="https://pic2.zhimg.com/v2-f234ea0b61cc6c155581533add4396c9_b.jpg" class="origin_image zh-lightbox-thumb" width="1438" data-original="https://pic2.zhimg.com/v2-f234ea0b61cc6c155581533add4396c9_r.jpg"/>

      所以是这样: 1、Encoder的输出,经过WK和WV,生成了K_endece和V_encdec; 2、对于decoder的第一个输出,没有任何的query(或者用默认的start query),直接输出得到; 3、对于decoder的后续输出,用前一个输出的embedding作为query,来继续进行self-attention?

    2. 第三和第四步是将分数除以8(本文使用的key向量的维数64的平方根。这将导致具有更稳定的渐变。此处可能存在其他可能的值,但这是默认值),然后通过softmax函数来对分数进行归一化,使它们均为正,且和为1。<img src="https://pic4.zhimg.com/v2-6ade838b6b62f38cbfac50bdbd08482b_b.jpg" data-size="normal" data-rawwidth="867" data-rawheight="546" class="origin_image zh-lightbox-thumb" width="867" data-original="https://pic4.zhimg.com/v2-6ade838b6b62f38cbfac50bdbd08482b_r.jpg"/>

      印象中,为了防止e的次方溢出,用减去最小值的方式会比较好?除以8的话存在放缩的问题了

    1. 通过上述对Attention本质思想的梳理,我们可以更容易理解本节介绍的Self Attention模型。Self Attention也经常被称为intra Attention(内部Attention),最近一年也获得了比较广泛的使用,比如Google最新的机器翻译模型内部大量采用了Self Attention模型。

      就是Transsformer了

    2. 所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:

      读到这里才反应过来,这个就是transformer的前身啊

    3. 而对于“图像描述”任务来说,Encoder部分的输入是一副图片,Decoder的输出是能够描述图片语义内容的一句描述语。

      ocr其实也可以按照这个思路来;

    1. 可以看出,网络的输出为分类数,并不是128。那么后面想要提取图像的特征,只需要在使用过程中,将最后一层classifier忽略即可(128维向量为输入到classifier前的特征图)。

      所以本身就是基于目标训练一个分类网络,然后不要最后的claasifier层即可?

    2. 作者将上面提到的两个阈值(分别为马氏距离和余弦距离的阈值)综合到了一起,联合判断该某一关联(association)是否合理可行的(admissible)。

      这里连乘b(1)和b(2),b1是基于马氏距离关于阈值的匹配;b2是余弦距离关于距离的匹配

    3. 一旦物体受到遮挡或者其他原因没有被检测到

      没被检测到导致SORT失效 虽然这个可以通过简单的调整阈值来处理,但终究部署长久之计

    1. •组合计算公式(1)和(2)作为计算第i个物体跟踪和第j个物体检测之间关联度量的总公式

      位置相似度和纹理相似度吧

  5. Apr 2021