R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(二)
机器之心 2023-03-05 13:03 发表于北京
以下文章来源于机器之心SOTA模型,作者机器之心SOTA模型
机器之心专栏
本专栏由机器之心SOTA!模型资源站出品,每周日于机器之心公众号持续更新。 本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过 SOTA 的经典模型逐一详解。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
本文将分 3 期进行连载,共介绍 17 个在目标检测任务上曾取得 SOTA 的经典模型。
- 第 1 期:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN、OHEM
- 第 2 期:R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet
- 第 3 期:RRC detection、CornerNet、M2Det、FOCS、ObjectBox
您正在阅读的是其中的第 2 期。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
第 1 期回顾:R-CNN、SPP-Net、Fast R-CNN…你都掌握了吗?一文总结目标检测必备经典模型(一)
本期收录模型速览
模型 | SOTA!模型资源站收录情况 | 模型来源论文 |
R-FCN | https://sota.jiqizhixin.com/project/rfcn 收录实现数量:47 支持框架:PyTorch,TensorFlow等 |
R-FCN: Object Detection via Region-based Fully Convolutional Networks |
Mask RCNN | https://sota.jiqizhixin.com/project/mask-r-cnn 收录实现数量:13 支持框架:PyTorch,TensorFlow等 |
Mask R-CNN |
YoLo | https://sota.jiqizhixin.com/project/yolo-2017 收录实现数量:3 支持框架:PaddlePaddle、TensorFlow等 |
You Only Look Once: Unified, Real-Time Object Detection |
SSD | https://sota.jiqizhixin.com/project/ssd-4 收录实现数量:27 支持框架:PyTorch,TensorFlow等 |
SSD: Single Shot Multibox Detector |
FPN | https://sota.jiqizhixin.com/project/fpn-4 收录实现数量:4 支持框架:PaddlePaddle,TensorFlow等 |
Feature Pyramid Networks for Object Detection |
RetinaNet | https://sota.jiqizhixin.com/project/retinanet-2021 收录实现数量:210 支持框架:PyTorch,TensorFlow等 |
Focal Loss for Dense Object Detection |
目标检测作为计算机视觉的基本问题之一,是许多其他计算机视觉任务的基础,如实例分割、图像字幕、对象跟踪等。简单来说,目标检测就是对图片中物体正确分类,同时找到物体的具体位置,具体是指识别图片中有哪些物体以及物体的位置(坐标位置)的技术。在互联网、大数据、人工智能等技术的发展浪潮下,目标检测展现出巨大的应用价值,受到工业界、学术界越来越多的关注。
目标检测的发展大致经历了两个历史时期:“ 传统的目标检测时期 ” ( 2014年以前 ) 和 “ 深度学习的目标检测时期 ” ( 2014年以后 )。本文重点回顾深度学习时代的经典模型。在深度学习时代,目标检测可以分为两类:“ two-stage detection ” 和 “ one-stage detection ”,前者将检测框定为一个 “ 从粗到细 ” 的过程,而后者将其定义为 “ 一步完成 ”。我们在介绍过程中,将分两类进行分析。两阶段模型(two-stage detection)因其对图片的两阶段处理得名,也称为基于区域(Region-based)的方法,R-CNN系列工作就是这一类型的代表。单阶段模型(one-stage detection)没有中间的区域检出过程,直接从图片获得预测结果,也被称为Region-free方法。
本文回顾目标检测中必备的TOP模型,包括one-stage模型和two-stage模型。
一、two-stage 模型
1、 R-FCN
前文描述的 R-CNN,SPPNET,Fast R-CNN,Faster R-CNN 的目标检测都是基于全卷积网络彼此共同分享以及 ROI 相关的彼此不共同分享的计算的子网络,R-FCN算法使用的这两个子网络是位置比较敏感的卷积网络,而舍弃了之前算法所使用的最后的全连接层,目的是让所有的计算都可以共享。因此,R-FCN的出发点就是为了减少重复计算,尽可能地共享网络。为了将 translation variance 引入到全卷积网络中,本文设计了一种特殊的卷积层作为全卷积网络的输出,该卷积层输出 position-sensitive 的 score map,每个 score map 引入了位置信息。在网络的最后一层,再接一个 position-sensitive RoI pooling 层,完成对物体的检测。在整个网络框架中,所有可学习的层都是卷积层,同时把空间位置信息引入特征学习中,使得整个网络可以进行端到端的学习。
R-FCN 算法进行目标检测的步骤如下:(1)候选区域:使用的是 RPN(Region Proposal Network)候选区域网络,同时 RPN 网络结构是全卷积的网络;(2)分类和回归:采用的是 RPN 特征共享的性质来进行目标的分类。在进行 bbox 回归的时候,通常将 C 选取为 4。
R-FCN采用 ResNet 101 的卷积层作为基础的卷积网络结构,再接一个卷积层用于降维,最后接一个产生 k^2(C+1)个 score map 的 position-sensitive 的卷积层,然后接一个 position-sensitive RoI pooling 层,最后使用 Softmax 判断 RoI 的类别。此外,还可以接一个产生 4k^2个 map 用于回归 Bounding box 的位置,同样应用 position-sensitive RoI pooling 层,最后得到一个回归的位置。具体结构如图1所示。
图1. R-FCN的整体架构。使用区域建议网络(RPN)提出候选RoI,然后将其应用于score map。所有可学习的权重层都是卷积的,并且是在整个图像上计算的;每个RoI的计算成本可以忽略不计
对于position-sensitive 卷积层,为了将位置信息引入到 position-sensitive 的 feature map 中,对于每个 RoI,将其分割成 k*k 个 bins,每个 bin 的大小约等于 w/k∗h/k。最后一个卷积层为每个类别生成 k^2 个 score map。在第 (i,j)个 bin (0≤i,j≤k−1)上的 position RoI pooling 操作定义为:
每个类别上都可以得到 k 个 position-sensitive 的 score,文章直接对这些值求平均值,得到最终的 score,因为分母都相同,均为 k,因此这个 score 就可以写成 r_c(Θ)=∑_i.j r_c(i,j∣Θ),在对这个 RoI 分类时,采用 Softmax 的方式在每个类别上的响应可以写成 :
在训练过程中采用交叉熵的方式进行训练。图8给出了position-sensitive 卷积层的详细
展示
图2. R-FCN的关键思想。图中有一个全卷积网络产生的k×k=3×3的位置敏感分数图。对于一个RoI中的每一个k×k bins,只对k^2个map中的一个进行汇集(用不同的颜色标记)
R-FCN是 Faster R-CNN 的改进版本,其 loss function 定义基本上是一致的:
在该网络框架下,所有可学习的层都是卷积层,使用 Online Hard Example Mining (OHEM) ,几乎不会增加训练时间。
当前 SOTA!平台收录 R-FCN 共 47 个模型实现资源。
项目 | SOTA!平台项目详情页 |
R-FCN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/rfcn |
2、 Mask-RCNN
Mask R-CNN是一个两阶段的框架,第一个阶段扫描图像并生成建议区域(proposals,即有可能包含一个目标的区域),第二阶段分类提议并生成边界框和掩码。Mask R-CNN是在Faster R-CNN的基础上添加了一个预测分割mask的分支,即在目标检测的基础上再进行分割。Mask R-CNN算法主要是Faster R-CNN+FCN,更具体一点就是ResNeXt+RPN+RoI Align+Fast R-CNN+FCN,如下图所示:
图3. Mask R-CNN 结构图
Mask R-CNN算法步骤如下:(1)输入一张图片,进行数据预处理(尺寸,归一化等等);(2)将处理好的图片传入预训练的神经网络中(例如,ResNet)以获得相应的feature map;(3)通过feature map中的每一点设定ROI,获得多个ROI候选框;(4)对这些多个ROI候选框送到RPN中进行二值分类(前景或后景)和BB回归(Bounding-box regression),过滤掉一部分候选的ROI;(5)对剩下的ROI进行ROI Align操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);(6)对这些ROI进行分类(N类别分类),BB回归和Mask生成(在每一个ROI里面进行FCN操作)。
首先,Mask R-CNN采用ResNet-50或者ResNet-101作为特征提取器提取特征,然后采用FPN(特征金字塔网络)的结构来进行特征融合。FPN可以同时利用低层特征图的空间信息和高层特征图的语义信息,其原理就是把分辨率较小的高层特征首先通过1×1卷积降维(减少计算量),然后上采样至前一个特征图的相同尺寸,再进行逐元素相加,就能得到融合后的特征。在得到增强后的特征后,利用RPN(Region Proposal Network)帮助网络推荐感兴趣的区域(ROI区域)。
接下来,需要把所有的ROI都pooling成相同大小的feature map后,才能将它reshape 成一个一维的向量,从而完成后面的分类与回归任务。与Faster RCNN中的ROI pooling不同,使用ROI pooling会造成较大的量化误差,这对于分割任务来说会造成较大的误差,因此Mask R-CNN中对ROI pooling进行了改进,提出了ROI Align。RoI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。值得注意的是,在具体的算法操作上,RoI Align并不是简单地补充候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套流程:(1)遍历每一个候选区域,保持浮点数边界不做量化。(2)将候选区域分割成 𝑘×𝑘 个单元,每个单元的边界也不做量化。(3)在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
图4. RoIAlign: 虚线代表一个特征图,实线代表一个RoI (在本例中为2×2 bins)。RoIAlign通过对特征图上附近的网格点进行双线性插值来计算每个采样点的值。在RoI、bins或采样点中涉及的任何坐标都不进行量化处理
根据论文所述,我们通过ROI Align可以把RPN生成并筛选后的框所对应的区域全部变成我们需要大小的特征图。而最后的任务就是对这些特征图来做进一步的分类、定位、分割。分类和定位和RPN里面的分类定位原理相同,对于分割,如图11右侧所示,在得到ROI Align处理过的特征后,由于前面进行了多次卷积和池化,减小了对应的分辨率,mask分支开始利用反卷积进行分辨率的提升,同时减少通道的个数,maskrcnn使用到了FPN网络,通过输入单一尺度的图片,最后可以对应的特征金字塔,首先将ROI变化为14x14x256的feature,然后进行了5次相同的卷积操作,然后进行反卷积操作,最后输出28x28x80的mask,即输出了更大的mask。
图5. 网络头结构
最后,整个Mask RCNN网络结构包含两部分,一部分是backbone用来提取特征(上文提到的采用ResNet-50或者ResNet-101作为特征提取器提取特征),另一部分是head用来对每一个ROI进行分类、框回归和mask预测。为了产生对应的Mask,文中提出了两种架构,即左边的Faster R-CNN/ResNet和右边的Faster R-CNN/FPN,如图11所示。
当前 SOTA!平台收录 Mask RCNN 共 13 个模型实现资源。
项目 | SOTA!平台项目详情页 |
Mask RCNN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/mask-r-cnn |
二、one-stage 模型
1、 YOLO
YOLO是one-stage方法的开山之作。它将检测任务表述成一个统一的、端到端的回归问题,并且以只处理一次图片同时得到位置和分类而得名。YOLO 是基于回归方法的,不需要区域选择操作,替换成了回归操作来完成目标检测和目标分类。YOLO架构如图12所示。相比Faster RCNN,YOLO结构简单,网络中只包含conv,relu,pooling和全连接层,以及最后用来综合信息的detect层。其中使用了1x1卷积用于多通道信息融合。
图6. 检测网络有24个卷积层,然后是2个全连接层。交替出现的1×1卷积层减少了前几层的特征空间。在ImageNet分类任务中以一半的分辨率(224×224输入图像)对卷积层进行预训练,然后以两倍的分辨率进行检测
YOLO的工作步骤如下:第一步:输入一张需要检测的图片,将这张图片分割为 7×7 的网络结构(即图13中的S=7);第二步:对于 7×7 网格中的每一个网络,都提供 2 个预测的边框,这两个边框包含了每个边框的目标的置信信息和每一个边框区域在不同类别上的可能性;第三步:将第二步中预测出的 7×7×2 个目标网络的性能进行排列,设定合适的阈值进行筛选,依据设定的阈值将目标所在可能性比较低的网络窗口剔除,留下可能性比较高的网络窗口,同时用 NMS 将冗余窗口去除即可。
图7. 模型。YOLO将检测建模为一个回归问题。它将图像划分为一个S×S的网格,并为每个网格单元预测B的边界框、这些框的置信度和C类概率。这些预测被编码为一个S×S×(B∗5+C)张量
YOLO 前半部分的网络结构和GoogleNet 的结构模型比较相似,YOLO 网络结构的特点主要在后面两层结构上,是在卷积层操作之后连接了一个全连接层,同时这个全连接层是 4096维度的,然后在这个全连接层之后又连接了一个 7×7×30 维度的向量。这个 7×7 就是上文中的将图片分割成的 7×7 的网络结构,之后就需要在每一个网络上预测目标可能会出现的两个可能的位置,同时预测这个目标出现的位置在图片目标上的置信信息和类别,也就是说需要预测两个目标在每一个网格中,每一个目标都是有中心点坐标和长宽这 4 个维度的信息,1 个目标的置信信息,还有 20 个目标的类别数,使用 VOC上面的 20 个类别,就会有(4+1)×2+20=30维度,因此后面连接了一个 7×7×30 维度的向量。所以,就可以使用前文的 4096 维度的全连接层在每一个网格上直接回归出目标所需要的置信信息和类别数。
YOLO训练过程中最终优化的目标函数为Loss = λ_coord权重* 坐标预测误差 + (含object的box confidence预测误差 + λ——noobj* 不含object的box confidence预测误差) + 类别预测误差:
当前 SOTA!平台收录 YOLO 共 3 个模型实现资源。
项目 | SOTA!平台项目详情页 |
YOLO |
前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/yolo-2017 |