IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 论文阅读《R-FCN: Object Detection via Region-based Fully Convolutional Networks》 -> 正文阅读

[人工智能]论文阅读《R-FCN: Object Detection via Region-based Fully Convolutional Networks》

Background & Motivation

最早的分类模型 AlexNet 和 VGG Net,前半部分是卷积自网络,后半部分是一些全连接层,前后部分被一个空间池化层隔开。自然而然传统的二阶段目标检测网络可以看作被 RoI pooling 分成两个子网络,前半部分是参数共享的全卷积网络,后半部分是基于 RoI 区域的不共享参数的 RoI-wise subnetwork(Head)。但是检测精度十分低,与分类网络优秀的性能并不能匹配。文中分析是因为分类任务中物体有平移不变性,而在检测任务中的回归任务必须要求定位出物体的位置,文中称作 translation variance 问题。

On the other hand, the object detection task needs localization representations that are translation-variant to an extent. For example, translation of an object inside a candidate box should produce meaningful responses for describing how good the candidate box overlaps the object.

而这篇论文的 Motivation 就是为了解决?translation variance。

R-FCN

前半部分的 backbone 采用 ResNet-101,其卷积层的最后一层输出是2048维的,在这一层后加上一个1024维的1*1卷积再加上一组特别设定的卷积层将其输出调整为(...,H,W,k^2*(C+1)),其中 C 对应了检测任务中物体的类别数。RPN 中输出的 RoI 在特征图最后一层的对应位置上生成对应(C+1)个类别的 k*k 个?position-sensitive 得分图

k 可以取3,这样就可以看作3*3特征图上各个对应位置的得分图,比如 { top-left,top-center,top-right,...,bottom-right }(即图中每一个小的长方体都对应输出的 k*k 特征图中的一个位置,也即枚举了每一个类别的部分在特征图中每一个位置出现的可能性)。

之后再接上一个 RoI pooling 操作,这里称作 position-sensitive RoI?pooling,这里只聚合了 backbone 最后一层特征以及得分图的各个部分拼接成的 k*k 的特征图(即图中 RoI 的正方体在 k*k 的每一个位置上挑选出各自的特征块)。其每个类别与对应位置的响应如下:

其中 z 是挑选出来的特征块拼成的特征图,x0 和 y0 是该 RoI 左上角的坐标。x 和 y 的范围是1到3,对应 k*k 中的各个位置,n 是该位置内的像素数,相当于进行了平均池化,而最大池化也是可行的但在本文中没有采用。Θ 是可学习的参数。

之后这 k*k 个特征块对各个类别再进行投票,得到各类别的得分:

在将这些得分经过 Softmax 归一化到0和1之间:

通过端到端训练,RoI 层引导加上的一组特别设定的卷积层来学习专门的 position-sensitive 得分图。我们进一步引入 position-sensitive RoI?pooling,引导得分图学习到用于目标检测任务的特征。?

下面分别是正例和负例:?

上图可以看出,如果越多黄色的框内包含物体,则越多特征图(即 Fig 1 中 RoI 的正方体在 k*k 的每一个位置上挑选出各自的特征块)中的区域被激活,就会得到更高的分数。

用同样的方法进行了 bounding box 的回归,在加在 backbone 上1024维的卷积层之后,增加一个回归分支。即加上一组特别设定的卷积层将其输出调整为(...,H,W,4*k^2*C)

Then it is aggregated into a 4-d vector by average voting.

损失函数是分类分支的交叉熵损失和回归分支的回归损失:

文中采用了?hole algorithm,似乎对精度的提升有帮助:

Experiments

各个模块的消融实验:

This RPN is trained following [19], except that the 2-class (object or not) convolutional classifier layer is replaced with a 21-class convolutional classifier layer. For fair comparisons, for this class-specific RPN we use ResNet-101’s conv5 layers with the à trous trick.

In fact, the class-specific RPN is similar to a special form of Fast R-CNN?that uses dense sliding windows as proposals.

在 VOC 数据集上的结果:

在 COCO 数据集上的结果:

Conclusion

很多情景下精度的提升并不大,但是比速度?baseline 几乎使其几倍,?position-sensitive 得分图和?position-sensitive RoI?pooling 的具体细节可能得看代码才能弄懂。

附加

  • GoogLeNet

基础卷积块叫做?Inception,4条线路都使用了合适的填充来使输入与输出的高和宽一致。

class Inception(nn.Module):
  def __init__(self,in_channels,c1,c2,c3,c4):
    super(Inception,self).__init__()
    self.conv1 = nn.Conv2d(in_channels,c1,kernel_size = 1)
    self.conv2 = nn.Sequential(
                nn.Conv2d(in_channels,c2[0],kernel_size = 1),nn.ReLU(),
                nn.Conv2d(c2[0],c2[1],kernel_size=3,padding=1),nn.ReLU()
            )
    self.conv3 = nn.Sequential(
                nn.Conv2d(in_channels,c3[0],kernel_size=1),nn.ReLU(),
                nn.Conv2d(c3[0],c3[1],kernel_size=5, padding=2),nn.ReLU()
            )
    self.conv4 = nn.Sequential(
                nn.MaxPool2d(kernel_size=3,stride=1,padding=1),
                nn.Conv2d(in_channels,c4,kernel_size = 1),nn.ReLU(),
            )
  def forward(self,X):
    return torch.cat(
            (
            self.conv1(X),
            self.conv2(X),
            self.conv3(X),
            self.conv4(X),
            ),
            dim = 1
    )

Inception 块相当于一个有4条线路的子网络。它通过不同窗口形状的卷积层和最大池化层来并行抽取信息,并使用1×1卷积层减少通道数从而降低模型复杂度。GoogLeNet 将多个设计精细的 Inception 块和其他层串联起来。其中 Inception 块的通道数分配之比是在 ImageNet 数据集上通过大量的实验得来的。

class GoogleNet(nn.Module):
  def __init__(self,in_channels,classes):
    super(GoogleNet,self).__init__()
    self.model = nn.Sequential(
              nn.Conv2d(in_channels,out_channels=64,kernel_size=7,stride=2,padding=3),nn.ReLU(),
              nn.MaxPool2d(kernel_size=3,stride=2),
              nn.Conv2d(in_channels=64,out_channels=64,kernel_size=1),nn.ReLU(),
              nn.Conv2d(in_channels=64,out_channels=192,kernel_size=3,padding=1),nn.ReLU(),
              nn.MaxPool2d(kernel_size=3,stride=2),
              Inception(192,c1=64,c2=[96,128],c3=[16,32],c4=32),
              Inception(256,c1=128,c2=[128,192],c3=[32,96],c4=64),
              nn.MaxPool2d(kernel_size=3,stride=2,padding=1),
              Inception(480,c1=192,c2=[96,208],c3=[16,48],c4=64),
              Inception(512,c1=160,c2=[112,224],c3=[24,64],c4=64),
              Inception(512,c1=128,c2=[128,256],c3=[24,64],c4=64),
              Inception(512,c1=112,c2=[144,288],c3=[32,64],c4=64),
              Inception(528,c1=256,c2=[160,320],c3=[32,128],c4=128),
              nn.MaxPool2d(kernel_size=3,stride=2,padding=1),
              Inception(832,c1=256,c2=[160,320],c3=[32,128],c4=128),
              Inception(832,c1=384,c2=[192,384],c3=[48,128],c4=128),
              nn.AvgPool2d(kernel_size=7,stride=1),
              nn.Dropout(p=0.4),
              nn.Flatten(),
              nn.Linear(1024,classes),
              nn.Softmax(dim=1)
            )
  def forward(self,X:torch.tensor):
    for layer in self.model:
      X = layer(X)
      print(layer.__class__.__name__,'output shape:',X.shape)

GoogLeNet 一共使用 9 个 Inception 块和 AvgPooling 的堆叠来生成其估计值,Inception块之间的 MaxPooling?可降低维度。

  • OHEM

记得看这篇文章。

  • hole algorithm

空洞卷积 hole Atrous 原理+图解析+应用_鹿鹿的博客-CSDN博客_空洞卷积应用

  • iterative box regression and multi-scale testing

目标检测中的Using multi scales training/testing_qq_409992227的博客-CSDN博客转:Cascade R-CNN,一个使你的检测更加准确的网络 - Augustone - 博客园
目标检测中的Using multi scales training/testing_qq_409992227的博客-CSDN博客

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:20:36  更:2021-09-14 13:23:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/22 3:53:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码