背景
经典的R-CNN存在以下几个问题:
- 训练分多步骤(先在分类数据集上预训练,再进行fine-tune训练,然后再针对每个类别都训练一个线性SVM分类器,最后再用regression对bounding box进行回归,并且bounding box还需要通过selective search生成)
- 时间和空间开销大(在训练SVM和回归的时候需要用网络训练的特征作为输入,特征保存在磁盘上,再读入的时间开销比较大)
- 测试比较慢(每张图片的每个region proposal都要做卷积,重复操作太多),在Fast-RCNN之前提出过SPPnet来解决R-CNN中重复卷积问题,但SPPnet仍然存在R-CNN类似的缺陷。
- 训练分多步骤(需要SVM分类器,额外的regression)
- 空间开销大
训练过程
- 输入是224x224的固定大小图片
- 经过5个卷积层+2个降采样层(分别跟在第一和第二个卷积层后面)
- 进入ROIPooling层(其输入是conv5层的输出和region proposal,region proposal个数大约为2000个)
- 再经过两个output都为4096维的全连接层
- 分别经过output各位21和84维的全连接层(并列的,前者是分类输出,后者是回归输出)
- 最后连接两个损失层(分类是softmax,回归是smoothL1)
模型流程
更详细的解释
- 任意size图片输入CNN网络,经过若干卷积与池化层,得到特征图。
- 在任意size图片上采用selective search算法提取约2k个建议框。
- 根据原图中建议框到特征图映射关系,在特征图中找到每个建议框对应的特征框(深度与特征图一致),并在ROI池化层中将每个特征框池化到H x W(VGG-16网络是7 x 7)的size。
- 固定H x W大小的特征框经过全连接层得到固定大小的特征向量。
- 第4步所得的特征向量经由各自的全连接层(由SVD分解实现),分别得到两个输出变量:一个是softmax的分类得分,一个是bounding-box窗口回归。
- 利用窗口得分分别对每一类物体进行非极大值抑制删除重叠建议框,最终得到每个类别中回归修正后的得分最高的窗口。
关键点
ROI池化层
作用是用最大值池化将ROI内的特征转化成固定空间大小H x W(例如7x7)的特征图。ROI是一个矩形框,用(r,c,h,w)表示,(r, c)表示左上角,(h, w)表示高度和宽度。
损失函数
Fast R-CNN有两个输出层,第一个输出每个ROI在K+1个类上的离散概率分布,第二个是边框偏移。
单尺度与多尺度
多尺度表示输入图像采用多种尺度输入,在测试的时候发现,多尺度虽然在mAP上得到些许提升但也增加了时间开销。结论是:深度神经网络可以学习尺度不变性。