原论文:Auto-FPN: Automatic Network Architecture Adaptation for Object Detection Beyond Classification
之前的AutoML都是应用在图像分类或者语言模型上,AutoFPN成功地将这技术应用到了目标检测任务上。
在介绍AutoFPN之前,首先大致介绍一下two-stage目标检测网络的结构组成。
AutoFPN的创新点在后面两个网络中,如下图示,主要是针对backbone的特征先做自动fusion操作(Auto-fusion),另外就是对head网络使用NAS技术搜索得到一个网络用于分类和回归(Auto-head)。
Auto-fusion其实是基于之前的一些工作的改进,如下图示:
Auto-fusion搜索方法设计考虑的有如下两个方面:
下面结合上图介绍Auto-fusion结构的表示方式。
对于backbone提取的4个特征图我们用${P^0_1,P^0_2,P^0_3,P^0_4}$表示,$P^0_4$表示第0层的第4个特征图,其高宽都比原图的小4倍。那么如果Auto-fusion结构一共有$L$层,则第$l$层的特征图可表示为$P^l_1,P^l_2,P^l_3,P^l_4$。第$l-1$层的$i$节点到第$l$层的$j$节点的operation可表示为(这里如果不明白先了解一下DARTS这篇论文):
$$
\begin{array}{c}{\hat{O}{i \rightarrow j}\left(P{j}^{l-1}\right)=\sum{O^{k} \in \mathcal{O}{N}} \alpha{i \rightarrow j}^{k l} O{i \rightarrow j}^{k l}\left(P{j}^{l-1}\right)} \ {\text { where } \sum{k=1}^{\left|O{N}\right|} \alpha{i \rightarrow j}^{k l}=1, \text { and } \alpha_{i \rightarrow j}^{k l} \geq 0}\end{array}
$$
下图给出了Auto-fusion某一层的示意图,可以看到因为要使得不同尺度的特征图能做融合操作,首先都会用conv 1*1的操作,而后再计算不同operation的权重。
Auto-fusion对于one-stage和two-stage目标检测网络都适用。
Auto-head其实简单理解就是和DARTS一样搜索得到一个CNN结构,示意图如下
不过有如下几个方面作了修改,有必要提一下:
AutoFPN还加入了资源约束,这样既可以避免生成的模型过大,也能够加速搜索和训练过程。很直观的一种想法是将forward时间作为约束条件,但是测得的forward时间相对于模型参数并不是可微的,所以考虑如下三个方面来对资源约束建模:
公示表示如下:
$$
C(\alpha, \beta)=\sum{i, j, k, l} \alpha{i \rightarrow j}^{k l} C\left(O{i \rightarrow j}^{k l}\right)+\sum{i, j, k} \beta{i \rightarrow i}^{k} C\left(O{i \rightarrow j}^{k}\right)
$$
那么总的loss表达式如下:
$$
\mathcal{L}(w, \alpha, \beta)=\mathcal{L}_{m o d e l}(w, \alpha, \beta)+\lambda C(\alpha, \beta)
$$
其中$\alpha$表示模型参数,即我们常说的卷积核参数或者全连接层参数等,$\beta$表示模型结构参数,即记录了不同operation的权重。值得一提的是$\lambda$这个参数,因为通过修改这个参数的大小,我们能够控制模型的相对大小,例如如果我们令$\lambda$比较大,那么最终得到的网络大小就会相对小一些,反之则大一些。在论文中,给出了三个等级的效果,具体结果看下一节。
下图给出了Auto-fusion和Auto-head搜索结果,可以看到identity和conv_5*5在两个结构中用的最多。
按照文中的说法是分别Auto-fusion和Auto-head是分别进行搜索的,所以最后的AutoFPN是将二者最好的结果进行组合得到的。可以看到在不同的数据集上搜索得到的网络结构更小,而且结果也能更好。
不过我看这结果有几个疑问,就是结果的提升到底算不算显著呢?结构的提升有多少其实是炼丹炼出来而不是搜网络结构搜出来的呢?ε=(´ο`*)))唉
最后文中还给出了不同搜索策略的结果对比,可以看到基于梯度下降的效果还是很不错的。
作者很良心给出了5个训练技巧:
1) 先训练初始化结构一段时间,然后再开始搜索网络结构:Starting optimizing architecture parameters in the middle of training can improve the results by 1%;
2) 在搜索阶段固定backbone参数:Freezing the backbone parameters during searching not only accelerates the training but also improves the performance;
3) 搜错阶段不要用BN:Searching with BN will decrease the performance by 1.7%;
4) 在搜索head结构时,最好使用训练好的neck结构:During searching for the head, loading the pretrained neck will boost the performance by 2.9%;
5) 大模型对neck部分性能有些许提升,但是对head好像并没有:Without resource constraints, our method becomes larger with only a small im- provement in neck but no improvement in head.
<footer style="color:white;;background-color:rgb(24,24,24);padding:10px;border-radius:10px;"><br>
<h3 style="text-align:center;color:tomato;font-size:16px;" id="autoid-2-0-0"><br>
<b>MARSGGBO</b><b style="color:white;"><span style="font-size:25px;">♥</span>原创</b>
<b style="color:white;">
2019-12-3<p></p>
</b><p><b style="color:white;"></b>
</p></h3><br>
</footer>
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。