Guided Anchoring:在线稀疏anchor生成方案,嵌入即提2AP CVPR 2019

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Guided Anchoring:在线稀疏anchor生成方案,嵌入即提2AP CVPR 2019相关的知识,希望对你有一定的参考价值。

参考技术A

论文: Region Proposal by Guided Anchoring

  Anchor是许多目标检测算法中一个很重要的机制,但也会带来两个问题:

  为此,论文提出Guided Anchoring来根据图片特征在线生成anchor。首先判断目标可能出现的位置,然后学习不同位置上的目标的形状,可根据图片特征在线学习稀疏的候选anchor。然而,在线生成的anchor形状各异,固定的感受域可能不匹配其形状,所以Guided Anchoring根据anchor的形状进行自适应特征提取,然后再进行预测框精调与分类。

  Guided Anchoring尝试在线学习不同形状的anchor及其位置,得到在特征图上不均匀分布的anchor集合。目标可用四元组 表示,其位置和形状可认为是服从图像 的一种分布:

  公式1包含两部分:1) 给定图片,目标仅存在于某些区域 2) 形状与位置紧密相关。

  基于公式1,论文设计了图1的anchor生成器(Anchor generation),包含位置预测和形状预测两个分支。给定图片 ,首先得到特征图 ,位置预测分支根据 预测该像素为目标位置的概率,形状预测分支则预测像素位置相关的形状,基于两个分支选择概率高于阈值以及每个位置最合适的anchor,得到最终的anchor集合。由于集合中的anchor形状可能差异很大,每个位置需要获取不同大小区域的特征,论文提出特征自适应模块(Feature adaption),根据anchor形状自适应提取特征。
  上述的生成过程是基于单个特征的,网络的整体架构包含FPN,所以为每层都配备Guided anchoring模块,模块参数是层间共享的。

  位置预测分支预测特征图 的概率图 ,每项 为该位置是目标中心的概率,对应的输入图片中坐标 , 为特征图的stride。
  在实现时,通过子网 进行概率图预测,首先使用 卷积提取主干网络特征图 的objectness分数,再通过element-wise sigmoid函数转化概率。更复杂的子网可以带来更高的准确率,论文采用的是准确率和速度最实惠的结构,最后取高于阈值 的像素位置,能够保证在高召回的前提下过滤90%的无关区域。

  形状预测分支的目标是预测每个位置对应目标的最佳形状 ,但由于过大的数值范围,如果直接预测其具体数字会十分不稳定,所以先进行转化:

  形状预测分支输出 和 ,根据公式2转换出形状 , 为特征图的stride, 为人工设置的缩放因子。这个非线性转换可将[0, 1000]映射到[-1, 1],更容易学习。在实现时,通过子网 进行形状预测,首先使用 卷积获得两维特征图,分别对应 和 ,然后通过公式2进行转换。由于每个位置的anchor都是学习来的,与预设的固定anchor对比,这种学习的anchor召回率更高。

  常规的预设anchor方法由于各位置的anchor是一样的,可以对每个位置进行一样的特征提取,然后再调整anchor和预测分类。但Guided Anchoring每个位置的anchor各不一样,理想情况下,较大的anchor需要较大的感受域特征,反之则需要较小的感受域特征,所以论文设计了基于anchor形状的特征自适应模块(anchor-guided feature adaptation component),根据每个位置的anchor形状转换特征:

  为 位置的特征, 为对应的anchor形状, 为 可变形卷积,变形卷积的偏移值由 卷积将位置预测分支输出转换获得, 为自适应特征,用于后续的anchor调整以及分类预测,具体见图1。

  网络的整体损失函数由4部分构成,分别是分类损失、回归损失、anchor位置损失以及anchor形状损失:

  假设目标 在特征图上的映射为 ,定义以下三种区域:

  主干网络使用了FPN,FPN的每层应该只负责特定大小范围内的目标的训练。由于相邻层的特征相似,所以将IR区域映射到相邻层,这时的IR区域不考虑CR区域,区域内同样不参与训练,如图2所示。当多个目标重叠时,CR区域优先于IR区域,IR区域优先于OR区域,训练采用Focal loss。

  首先,定义动态anchor 与GT间的最优问题为:

  如果对每个位置都进行公式5的求解,这计算量会相当大,为此,论文用采样的方法来逼近公式5,采样的范围为常见的anchor样例,比如RetinaNet的9种anchor。对于每个位置,选择IoU最大的anchor作为公式5的结果。采样的范围越大,anchor的生成结果更准,但会带来更多的额外计算量,anchor的采用smooth-L1训练:

  将Guided Anchoring嵌入RPN得到增强型GA-RPN,与原版进行对比,从图3可以看到:

  从结果来看,GA-RPN的效果比RPN好很多,论文直接将RPN替换GA-RPN仅带来小于1的AP提升。根据观察发现,使用高质量候选框的前提是,需要根据候选框的分布来调整训练数据的分布。所以,在使用GA-RPN时,需要设置更高的正负样本阈值,让网络更加关注高质量的候选框。另外,论文发现GA-RPN也可以fine-tune的形式boost两阶段检测器的性能,给定训练好的检测模型,将RPN替换为GA-RPN进行几轮迭代,能带来不错的性能提升。

  与各种候选框方法进行对比。

  嵌入效果对比。

  fine-tune对比。

  Guided Anchoring通过在线生成anchor的方式解决常规手工预设anchor存在的问题,以及能够根据生成的anchor自适应特征,在嵌入方面提供了两种实施方法,是一个很完整的解决方案。但有个不好的点在于anchor target的生成,为了保证性能弄得不够完美,希望有人能提出更准确且高效的公式5解决方案。



在朴素贝叶斯(Python、scikit)中使用稀疏矩阵/在线学习

【中文标题】在朴素贝叶斯(Python、scikit)中使用稀疏矩阵/在线学习【英文标题】:Using sparse matrices/online learning in Naive Bayes (Python, scikit) 【发布时间】:2012-08-26 16:21:27 【问题描述】:

我正在尝试对具有超过 6,000,000 个条目且每个条目具有 150k 个特征的数据集执行朴素贝叶斯。我试图从以下链接实现代码: Implementing Bag-of-Words Naive-Bayes classifier in NLTK

问题是(据我了解),当我尝试使用 dok_matrix 作为参数运行训练方法时,它找不到 iterkeys(我已将行与 OrderedDict 作为标签配对):

Traceback (most recent call last):
  File "skitest.py", line 96, in <module>
    classif.train(add_label(matr, labels))
  File "/usr/lib/pymodules/python2.6/nltk/classify/scikitlearn.py", line 92, in train
    for f in fs.iterkeys():
  File "/usr/lib/python2.6/dist-packages/scipy/sparse/csr.py", line 88, in __getattr__
    return _cs_matrix.__getattr__(self, attr)
  File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 429, in __getattr__
    raise AttributeError, attr + " not found"
AttributeError: iterkeys not found

我的问题是,有没有办法通过逐项(在线)教授分类器条目来避免使用稀疏矩阵,或者在这种情况下我可以有效地使用稀疏矩阵格式而不是 dok_matrix?还是我遗漏了一些明显的东西?

感谢任何人的时间。 :)

编辑,9 月 6 日:

找到了iterkeys,所以至少代码可以运行。它仍然太慢,因为它花了几个小时处理一个 32k 大小的数据集,但仍未完成。这是我目前得到的:

matr = dok_matrix((6000000, 150000), dtype=float32)
labels = OrderedDict()

#collect the data into the matrix

pipeline = Pipeline([('nb', MultinomialNB())])
classif = SklearnClassifier(pipeline)

add_label = lambda lst, lab: [(lst.getrow(x).todok(), lab[x])
                              for x in xrange(lentweets-foldsize)] 

classif.train(add_label(matr[:(lentweets-foldsize),0], labels))
readrow = [matr.getrow(x + foldsize).todok() for x in xrange(lentweets-foldsize)]
data = np.array(classif.batch_classify(readrow))

问题可能是所取的每一行都没有利用向量的稀疏性,而是遍历了 150k 条目中的每一个。作为这个问题的延续,有谁知道如何使用这个带有稀疏矩阵的朴素贝叶斯,或者有没有其他方法来优化上面的代码?

【问题讨论】:

也许您可以更有效地对特征进行编码,或者减小它们的大小? 是的,但不管有多少功能,恐怕我仍然需要管理矩阵的大小。数据集由推文的单词组成。 至少找到了iterkeys,现在问题是代码太慢了。 你需要用 Python 做吗?看看 MALLET:mallet.cs.umass.edu,它的速度非常快。 本身不需要python,但我们在这里得到了熟悉的窥视。谢谢,我会检查一下。不过,我想为大型数据集找到一个明确的解决方案会很好,这样任何在谷歌上搜索这个问题的人都会在这里找到答案。 【参考方案1】:

查看 scikit-learn 中的 document classification example。诀窍是让库为您处理特征提取。跳过 NLTK 包装器,因为它不适用于如此大的数据集。(*)

如果您有文本文件中的文档,那么您只需将这些文本文件交给TfidfVectorizer,它会根据它们创建一个稀疏矩阵:

from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(input='filename')
X = vect.fit_transform(list_of_filenames)

您现在有一个 CSR 稀疏矩阵格式的训练集 X,如果您还有一个标签列表 y(可能源自文件名,如果您对类):

from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X, y)

如果事实证明这不起作用,因为文档集太大(不太可能因为 TfidfVectorizer 仅针对此数量的文档进行了优化),请查看 out-of-core document classification 示例,该示例演示了 @987654329 @ 和 partial_fit API 用于小批量学习。您需要 scikit-learn 0.14 才能正常工作。

(*) 我知道,因为我写了那个包装器。与 NLTK 的其余部分一样,它用于教育目的。我还致力于 scikit-learn 的性能改进,我宣传的一些代码是我自己的。

【讨论】:

第一个链接失效了

以上是关于Guided Anchoring:在线稀疏anchor生成方案,嵌入即提2AP CVPR 2019的主要内容,如果未能解决你的问题,请参考以下文章

在朴素贝叶斯(Python、scikit)中使用稀疏矩阵/在线学习

滚动锚定(Scroll Anchoring)- 让视口内容不再因视口上方 DOM 元素的高度变化而产生跳动

text Confronto报告anche tra ambienti diversi SE39

PGO - Profile-guided optimizations

PGO - Profile-guided optimizations

cURL 错误 60:SSL 证书问题,anche con cacert.pem