抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

CodingStudio

努力进步

论文总览

backbone Two-stage One-stage Anchor-Free Other
VGG RCNN YOLO CornerNet PANet
ResNet SPP Net YOLOv2 CenterNet DETR*
ResNetv2 Fast RCNN YOLOv3 FCOS
DenseNet Faster RCNN RetinaNet
CSPNet FPN YOLOv5
Mask RCNN YOLOv8
Cascade RCNN

backbone

VGG

  • 证明了增加网络的深度能够在一定程度上影响网络的性能
  • 结构(VGG16)
    • INPUT(224*224*3) -> Conv(k3,s1,c64) -> Conv(k3,s1,c64) -> maxpool(s2) -> Conv(k3,s1,c128) -> Conv(k3,s1,c128) -> maxpool(s2) -> Conv(k3,s1,c256) -> Conv(k3,s1,c256) -> Conv(k3,s1,c256) -> maxpool(s2) -> Conv(k3,s1,c512) -> Conv(k3,s1,c512) -> Conv(k3,s1,c512) -> maxpool(s2) -> Conv(k3,s1,c512) -> Conv(k3,s1,c512) -> Conv(k3,s1,c512) -> maxpool(s2) -> FC(4096) -> FC(4096) -> FC(1000) -> softmax
    • 13个卷积层, 3个全连接层
    • 通道输出64, 128, 256, 512, 512
    • 5个Block中卷积层数量2,2,3,3,3
    • 都是k3*3, s1的卷积与s2的最大池化层
  • 原理
    • 使用连续的几个3*3卷积代替较大的卷积核, 给定感受野下, 堆积的小卷积核优于大卷积核(多层非线性层可以增加网络的深度来保证学习更复杂的模式, 且参数更少)
    • 2个3*3卷积核代替5*5卷积核, 3个3*3卷积核代替7*7卷积核
  • 相较于其他方法, VGG的参数空间较大训练时间较长,但一般采用pretrained model训练

ResNet

  • 目的: 为解决深度神经网络的优化问题
    • 网络越深, 反传回来的梯度之间的相关性越来越差, 最后接近白噪声导致梯度消失,网络无法得到有效的训练
  • 初衷: 让模型的内部结构至少有恒等映射的能力(什么都不做的能力, 保持初心的能力), 这样可以保证更深的卷积层不会因为网络更深而产生退化
  • 原理
    • 假定block的输入为x, 期望输出H(x), block完成非线性映射的功能
    • 如何实现恒等映射: 假定直连(plain)卷积的输入为x, 期望输出为H(x), 则学习H(x) = x即可实现恒等映射
    • 但上述较难学习, 利用shortcut可以让H(x)学习其他的, 而直连block网络输出学习为0即可,
      • 上述直连卷积block输出学习为0比学习成恒等映射更简单(可通过L2正则化, 无限趋近于0)
    • H(x)=F(x)+x, 只需要F(x)=0即可实现恒等映射

Residual

  • 两个不同的结构
    • 不使用bottleneck结构, 2个输出通道相同的3*3卷积层构成
    • 使用bottleneck结构, 使用1*1卷积层, 3*3卷积层, 1*1卷积层构成
      • 使用1*1卷积层先减小后增加维度, 该方式使3*3卷积的通道数目下降, 降低参数量, 减少算力瓶颈
  • **使用两种不同的shortcut**对网络的性能提升不明显: 一种shortcut不添加1*1卷积层, 另一种添加1*1卷积层
  • ResNet18, ResNet34使用两层残差结构, 更深的网络采用三层残差结构

Resnet18

  • ResNet187*7卷积+池化层降采样至原尺寸的14\frac{1}{4}, 随后4个残差块分别降采样至原尺寸的12\frac{1}{2}
    • 残差块数量[2, 2, 2, 2], 再加上第一层和最后一层, 共计18层
  • ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度

ResNetV2

  • 目的: 在更深的ResNet(>110layers)网络中, 使用预激活残差单元的网络更易训练且精度更高
  • 预激活: 将激活函数(ReLuBN)移到权值层(Weight)之前, 形成预激活(pre-activation)方式

  • 公式推导
    • 原先ResNet的残差单元: yl=h(xl)+F(xl,Wl),xl+1=f(yl).\begin{gathered}\mathbf{y}_l=h\left(\mathbf{x}_l\right)+\mathcal{F}\left(\mathbf{x}_l, \mathcal{W}_l\right), \mathbf{x}_{l+1}=f\left(\mathbf{y}_l\right) .\end{gathered}, 其中hh是恒等映射,h(xl)=xlh(x_l)=x_l
    • 若函数ff也是恒等映射, 则xl+1=xl+F(xl,Wl)x_{l+1} = x_l+\mathcal{F}\left(\mathbf{x}_l, \mathcal{W}_l\right), 任意深层的单元LL与浅层单元ll之间的关系, xL=xl+i=lL1F(xi,Wi)x_{L} = x_l+\sum_{i=l}^{L-1} \mathcal{F}\left(\mathbf{x}_i, \mathcal{W}_i\right)
      • 深层单元的特征可以由浅层单元的特征和残差函数相加得到; 任意深度单元的特征可以由起始特征与先前的残差函数相加得到(残差网络是相加, 普通网络是连乘)
    • 反向传播: Exl=ExLxLxl=ExL(1+xli=lL1F(xi,Wi))\frac{\partial \mathcal{E}}{\partial \mathbf{x}_l}=\frac{\partial \mathcal{E}}{\partial \mathbf{x}_L} \frac{\partial \mathbf{x}_L}{\partial \mathbf{x}_l}=\frac{\partial \mathcal{E}}{\partial \mathbf{x}_L}\left(1+\frac{\partial}{\partial \mathbf{x}_l} \sum_{i=l}^{L-1} \mathcal{F}\left(\mathbf{x}_i, \mathcal{W}_i\right)\right)
      • 反向传播也是两条路径, 其中之一将信息回传, 另一条经过所有的权重层,且回传的梯度不会消失
  • h(xl)=λlxlh(x_l)=\lambda_l x_l, 反向传播时Exl=ExL((i=lL1λi)+xli=lL1F^(xi,Wi))\frac{\partial \mathcal{E}}{\partial \mathbf{x}_l}=\frac{\partial \mathcal{E}}{\partial \mathbf{x}_L}\left(\left(\prod_{i=l}^{L-1} \lambda_i\right)+\frac{\partial}{\partial \mathbf{x}_l} \sum_{i=l}^{L-1} \hat{\mathcal{F}}\left(\mathbf{x}_i, \mathcal{W}_i\right)\right), 若λ>1\lambda>1, 则这一项指数级增大, 若λ<1\lambda<1, 则这一项很小甚至消失, 阻断反向传播
  • 文章中的实验分析
    • 激活函数的使用
      • BNaddition之后: 较基准差, BN在相加之后阻碍信号传播, 训练初期误差下降缓慢
      • ReLUaddition之前: 输出保持非负, 影响模型表示能力
      • 后激活(post-activation)
      • RuLU-only pre-activation
      • full pre-activation: 效果最好
  • 使用预激活的优点
    • ff变成恒等映射, 网络更易优化
    • 使用BN作为预激活可以加强模型正则化, 减小过拟合

DenseNet

  • 目的: 建立前面所有层与后层的密集连接, 让网络的每一层都直接与前面层相连, 实现特征的重复利用; 同时把网络的每一层设计特别窄(特征图/滤波器数量少), 即只学习非常少的特征图(最极端情况就是每一层只学习一个特征图), 达到降低冗余性
  • 网络结构: DenseNet模型主要是由DenseBlock(密集块)组成, 密集块中每一层都将前面层concate后作为输入, xl=Hl([x0,x1,...,xl1])x_l=H_l([x_0, x_1, ..., x_{l-1}])
    • DenseBlock中, 每个网络层的特征图大小是一样的. Hl()H_l(\cdot)是非线性转化函数, 由BN, ReLU, Conv组成
    • DenseBlock中, 参数k为网络的增长率, 表示任何一个3×33 \times 3卷积层的滤波器个数(输出通道数), 若每个Hl()H_l(\cdot)函数都输出kk个特征图, 第ll层的输入特征图数量为k0+k×(l1)k_0+k \times (l-1), k0k_0DenseBlock的输入特征图数量
    • DenseBlock中, 为保持卷积层的feature map大小一致, 在两个DenseBlock中间插入transition层(其由BN + ReLU + 1*1 Conv + 2*2 Avgpooling)
    • CNN网络一般通过Pooling层或Stride > 1的卷积层来降低特征图大小
  • 优点
    • 省参数: DenseNet所需的参数量和计算量都不及ResNet的一半
    • 省计算量: 工业界而言, 小模型可以显著节省带宽, 降低存储开销(参数量小的模型计算量肯定也小)
    • 抗过拟合: 神经网络每一层提取的特征都相当于对输入数据进行非线性变换, 随着网络加深, 变换的复杂度逐渐增加(更多非线性函数的复合); 相比于一般神经网络的分类器直接依赖于网络最后一层(复杂度最高)的特征, DenseNet可以综合利用浅层复杂度低的特征, 因而更容易得到一个光滑的具有更好泛化性能的决策函数
  • 缺点: 密集连接会导致中间层的很多特征冗余
    • DenseNet中去掉中间层的密集连接, 只有最后一层聚合前面所有层的特征, 结果表明最后一层的连接强度变得更好

CSPNet

  • MobileNetv1/v2/v3ShuffleNetv1/v2为移动端(CPU)设计的轻量级网络采用**深度可分离卷积技术(基础技术)**并不适用于 NPU 芯片
  • 目的: 优化DenseNet中梯度信息重复, 通过将梯度的变化从头到尾地集成到特征图中, 在减少计算量的同时保证准确率. 可以减小模型计算量, 提高运算速度, 还不降低模型精度.
  • CSPNet解决的三个问题:
    1. 增强CNN的学习能力, 能够在轻量化的同时保持准确性
    2. 降低计算瓶颈和DenseNet的梯度信息重复
    3. 降低内存成本
  • 原理
    • DenseNet中大量的梯度信息被重用来更新不同密集层的权值, 导致无差异的密集层反复学习复制的梯度信息
    • CSPNet利用跨阶段特征融合策略和截断梯度流增强不同层间学习特征的可变性
    • EFM结构结合Maxout操作来压缩从特征金字塔生成的特征映射, 大大降低了所需的内存带宽, 推理的效率可以与边缘计算设备兼容
  • 跨级部分密集网: CSPDenseNet的一阶段由局部密集块和局部过渡层组成, 保留了DenseNet重用特征特性的优点, 但同时通过截断梯度流防止了过多的重复梯度信息, 设计了一种分层的特征融合策略实现并应用于局部过渡层
    • 局部密集块:
      1. 增加梯度路径: 通过分块归并策略, 可以使梯度路径的数量增加一倍. 利用跨阶段策略, 可以减轻使用显式特征图copy进行拼接带来的弊端
      2. 每一层的平衡计算: 通常DenseNet基层的通道数远大于生长速率; 由于在局部稠密块中,参与密集层操作的基础层通道仅占原始数据的一半,可以有效解决近一半的计算瓶颈
      3. 减少内存流量
    • 局部过渡层: 使梯度组合的差异最大
      • 是一种层次化的特征融合机制, 利用梯度流的聚合策略来防止不同的层学习重复的梯度信息

局部密集块

局部过渡层

  • 局部过渡层说明:
    • Transition layer的含义和DenseNet类似, 是一个1x1的卷积层(没有再使用average pool), Transition layer的位置决定了梯度的结构方式
    • c图: Fusion First先将两个部分进行concate然后输入到Transition中, 采用这种做法会使大量的梯度信息被重用, 有利于网络学习
    • d图: Fusion Last先将部分特征输入Transition然后进行concate, 采用这种做法会使梯度信息被截断, 损失了部分的梯度复用, 但由于Transition输入维度少, 大大减少计算复杂度
    • b图: CSPNet采用的, 结合了c图d图特点, 提升了学习能力的同时也提高计算复杂度

Two-stage

RCNN

  • CNN方法引入目标检测领域, 大大提高了目标检测效果
  • 基本流程:
    1. 候选框生成: 一张图像采用选择性搜索方法生成1K~2K个候选区域
    2. 特征提取: 对每个候选区域, 使用CNN网络提取特征
    3. 类别判断: 特征送入每一类的SVM分类器判别是否属于该类
    4. 位置精修: 使用回归其精细修正候选框位置
  • 测试过程:
    1. 候选框生成: 采用选择性搜索方法提取2K个候选框
    2. 在每个候选框周围加上16个像素值为候选框像素平均值的边框, 在各向异性变换成277*277大小
    3. 将所有候选框像素值减该候选框像素平均值后(预处理), 将其送入AlexNet中获取4096维特征, 将2000个候选框组合成2000*4096维矩阵
    4. 2000*4096维矩阵与20个SVM组成的权值矩阵相乘获得2000*20维矩阵表示每个建议框使某个物体类别的得分
    5. 分别对上述2000*20维矩阵每一类进行非极大值抑制剔除重叠建议框, 得到该类中得分最高的一些建议框
    6. 分别用20个回归器对上述20个类别中剩余的建议框进行回归操作, 最终得到每个类别的修正后得分最高的BBox
  • 基础知识
    • 重叠率(IOU): 定义了BBox的重叠率
    • 非极大值抑制(NMS):
      1. 从最大概率的矩形框开始, 分别判断各个预测框与该矩形框的IOU是否大于某个设定的阈值
      2. 若大于阈值则舍弃该矩形框, 并标记第一个矩形框为保留下来的矩形框
      3. 从剩下的矩形框中选择概率最大的矩形框, 重复上述判断直至找到所有被保留下的矩形框
  • 流程中各个阶段详解
    • 选择性搜索: 需要将不同大小的候选区域处理成相同的大小
      • 各向异性缩放: 不管图像的长宽比例直接缩放(实验效果好)
      • 各向同性缩放
    • 位置精修: 使用回归器进行位置精修
      • Pi=(Pxi,Pyi,Pwi,Phi)P^i=(P_x^i, P_y^i, P_w^i, P_h^i)表示Region Proposal, Gi=(Gxi,Gyi,Gwi,Ghi)G^i=(G_x^i, G_y^i, G_w^i, G_h^i)表示Ground Truth, G^i=(G^xi,G^yi,G^wi,G^hi)\hat{G}^i=(\hat{G}_x^i, \hat{G}_y^i, \hat{G}_w^i, \hat{G}_h^i)表示Region Proposal经过回归后的预测框, 为找到PPG^\hat{G}的线性变换, 使得G^\hat{G}GG相近, 该问题为线性回归问题, 可使用最小二乘法进行解决
      • G^x=Pwdx(P)+Px,G^y=Phdy(P)+Py,G^w=Pwexp(dw(P)),G^h=Phexp(dh(P))\hat{G}_x=P_w d_x(P)+P_x, \hat{G}_y=P_h d_y(P)+P_y, \hat{G}_w=P_w exp(d_w(P)), \hat{G}_h=P_h exp(d_h(P)), 其中d(P)=wTϕ5(P)d_*(P)=w_*^T \phi_5(P)为CNN输出特征的线性函数, wTw_*^T为需要学习的回归参数, d(P)d_*(P)训练目标
      • 损失函数为Loss=argmini=0N(tiw^Tϕ5(Pi))2+λw^2Loss=argmin \sum_{i=0}^N (t_*^i - \hat{w}_*^T \phi_5(P^i))^2 + \lambda|| \hat{w}_*||^2, 正则项λw^2\lambda|| \hat{w}_*||^2为防止回归参数过大
        • 而回归目标为tx=(GxPx)/pw,ty=(GyPy)/ph,tw=log(GwPw),th=log(GhPh)t_x=(G_x-P_x)/p_w, t_y=(G_y-P_y)/p_h, t_w=log(\frac{G_w}{P_w}), t_h=log(\frac{G_h}{P_h})
    • 训练过程: 首先使用Alexnet模型进行训练, 随后利用选择性搜索得到的候选框对模型进行fine-tuning训练, 随后训练SVM
      • finetune中正负样本划分: ground truth和与ground truthIOU大于0.5BBox为正样本, 否则为背景类别(负样本)
      • SVM中正负样本划分: ground truth为正样本, 与ground truthIOU小于0.3的为负样本
      • 位置回归中正负样本划分: 与Ground Truth相交, IoU最大且>0.6Region Proposal
  • 问题总结:
    • 进行finetune的必要性: 针对特定任务进行finetune可以使CNN更加针对特定的任务, 不仅仅知识得到共性特征
    • 为什么finetuneSVM时采用的正负样本阈值不一致
      • 微调阶段CNN对小样本容易过拟合, 需要大量训练数据, 故IOU限制较为宽松,为0.5
      • SVM适合小样本训练, 因此对IOU限制严格; GroundTruth为正样本, 与其IOU<0.3的建议框为负样本
    • 为什么不采用finetune后的AlexNet最后一层Softmax进行21分类
      • 微调时和训练SVM时正负样本阈值不同, 导致最后采用CNN softmax输出比SVM精度低, 因此最后选用SVM进行21分类

SPPNet

  • 解决的问题:卷积神经网络的全连接层需要固定的输入, 而候选区域存在尺寸差异; 将不同候选区域依次输入卷积神经网络中进行特征提取存在大量冗余计算
  • 解决方法
    • SPPNet采用选择性搜索获取候选区域, 将整张图像送入网络获取特征图随后再特征图上获取候选区域的特征
    • 空间金字塔池化: 将任意大小的特征图划分成若干数量的子块, 随后对这些子块计算最大池化, 将计算结果进行拼接得到固定大小的输出
      • 论文中使用3个分支, 将特征图划分为1*1, 2*2,4*4子块, 对每个子块进行最大池化, 随后将其进行拼接成21维的输出

Fast-RCNN

  • 解决的问题:RCNNSPPNet需要多步训练, 步骤繁琐; 时间和内存消耗较大; 测试时较慢
  • Fast RCNN优点:
    1. 高精度检测, 单步训练, multi-loss
    2. 训练可以更新所有网络层, 且内存不需要太大
  • 网络架构
    • 网络具有两个输入, 图像和对应已框出来的Region Proposal, 其中Region Proposal是由选择性搜索方法得到, 对每个类别都训练一个回归其, 且只有非背景Region Proposal才需要进行回归
    • SPPNet相似, 将整张图像作为CNN输入, 将选择性搜索得到的候选框映射到特征图上, 以此减少计算量
    • 使用ROI池化层解决候选框大小不一的问题, 将其转换为相同的大小
    • 使用卷积神经网络输出分类和预测框的位置大小, 不采用SVM分类器和回归器
    • 为提高速度使用SVD代替全连接层
  • 预测流程
    1. 使用选择性搜索获取候选框
    2. 将原始图像送入网络中得到特征图(最后一次池化前的卷积计算结果)
    3. 对每个建议框, 从特征图中找到对应位置, 截取出特征框
    4. 将特征框划分为H*W(7*7)个网格进行池化(ROI池化)
    5. 将矩阵拉成一个向量分别作为全连接层的输入
    6. 全连接层输出分类得分和BBox回归(20*4矩阵)
    7. 对输出结果使用NMS选出结果
  • 训练流程
    • 使用VGG16对模型进行改进, 将最后的池化层换成ROI池化层; 将最后一个全连接层和softmax分类器换成两个并行层用于输出分类得分和坐标回归; 双输入, 将图像和建议框信息输入
  • 损失函数:
    • 损失函数包括分类损失位置损失:L(p,u,tu,v)=Lcls(p,u)+1[u1]Lbox(tu,v)\mathcal{L}\left(p, u, t^u, v\right)=\mathcal{L}_{\mathrm{cls}}(p, u)+1[u \geq 1] \mathcal{L}_{\mathrm{box}}\left(t^u, v\right)
    • 分类损失使用log损失: Lcls(p,u)=logpu\mathcal{L}_{\mathrm{cls}}(p, u)=-\log p_u
    • 回归损失使用smooth_L1损失, 与RCNN相似: Lbox(tu,v)=i{x,y,w,h}L1smooth (tiuvi)\mathcal{L}_{\mathrm{box}}\left(t^u, v\right)=\sum_{i \in\{x, y, w, h\}} L_1^{\text {smooth }}\left(t_i^u-v_i\right)
      • L1smooth (x)={0.5x2 if x<1x0.5 otherwise L_1^{\text {smooth }}(x)= \begin{cases}0.5 x^2 & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise }\end{cases}

Fast RCNN

Faster-RCNN

  • 流程: 首先将图像缩放至固定大小后送入网络; 利用卷积神经网络得到特征图后, 在RPN网络中首先经过3*3卷积, 再分别产生positive anchors和对应BBox regression偏移量, 计算出proposals; 利用ROI Poolingfeature maps中提取proposal feature送入后续全连接和softmax网络做分类

  • 网络结构详解
    • backbone: 使用VGG16等网络进行特征提取, 卷积层设置padding1, stride1(经卷积后大小不变), 只在池化层使输出长宽为输入的一半
    • RPN(Pegion Proposal Networks): 在feature maps上利用3*3卷积转换语义空间, 随后利用两个1*1卷积进行二分类位置回归; 因此分为两条线,一条使用softmax分类anchor获得positivenegative; (卷积核的通道数9*2).第二条计算对于anchorsBBox regression偏移量获得proposals, 同时剔除太小和超出边界的proposals(卷积核的通道数9*4)
      • 重点过程分析
        • Anchors生成: 在特征图的每一个像素点上生成9个(3种形状, 长宽比不同)矩形框, 每一个像素点对应原图上一个16*16大小(bakcbone下采样16倍)的区域;
        • Softmax判定positivenegative: 由1*1卷积实现, 通道数为9*2(每个点9个anchor, 每个anchor二分类), 随后利用softmax分类获取positive anchors(有目标), 也就相当于初步提取了检测目标候选区域, 总共选取正负样本比1:1256个anchor
        • BBox Regression原理: 沿用RCNN的方法
        • Proposal Layer原理: 负责综合所有的BBox regression偏移量和positive anchors计算出精确的proposal, 其输入包含分类结果, BBox regression偏移量和im_info=[M, N, scale_fator](保留缩放的信息), 具体步骤如下
          1. 生成anchors, 利用BBox regression偏移量对所有anchors做回归
          2. 按照positive softmax scores对修正后的anchors进行排序, 提取前pre_nms_top 12000anchors
          3. 限定超出图像边界的anchor为图像边界, 防止后续roi pooling时超出图像边界
          4. 剔除尺寸非常小的positive anchors
          5. 对剩下的positive anchors进行NMS选出概率大的2000ROIS
          6. 输出proposal box()(这里是对应原图输入尺寸)
      • :在推理时为加快速度12000和2000分别变为6000和300
    • ROI Head: ROI Head在给出的2000个候选框上继续进行分类和位置参数的回归, 包括ROI PoolingClassification(全连接分类两部分); 首先挑选除128sample_roi, 使用ROI Pooling将不同尺寸的区域池化到同一尺寸7*7, 随后送至后续的两个全连接层(FC21(20个类+背景), FC84(21个类, 每个类4个位置参数))分别完成类别分类和BBox回归
      • 设定7*7的原因: 为了可以共享VGG后面两个全连接的权重, 512*7*7=4096, 可以利用VGG16预训练权重来初始化前两层全连接层
      • ROI Pooling:
        • ROI Pooling 两次量化过程
          1. proposals是对应M*N的原图尺寸,在原图上生成的region proposal需要映射到 feature map上(坐标值缩小 16 倍),需要除以16/32(下采样倍数), 边界会出现小数, 自然就需要量化
          2. proposals对应的 feature map 区域水平划分成k×kk\times k(7×77\times 7)的 bins, 并对每个bin中均匀选取多少个采样点, 然后进行max pooling,也会出现小数,自然就产生了第二次量化
        • 训练过程: 对RPN生成的2000RoIs, 选出128个(正负比3:1)进行分类和位置参数回归. IoU>0.5内选32个作为正样本, IoU<=0或0.1内选96个作为负样本
        • 测试过程: 对RPN生成的300个RoIs计算概率, 利用位置参数调节预测框位置, 随后使用NMS进行处理

  • 注意点
    • 两次NMS操作, RPN中使用一次, 测试时在ROI Head中使用一次
    • 两次位置回归, RPN中使用一次, 测试时在ROI Head中再回归一次
    • RPN时为二分类, 在ROI Head中为21分类
    • 四个损失:
      • RPN 分类损失:anchor 是否为前景(二分类)
      • RPN 位置回归损失:anchor 位置微调
      • RoI 分类损失:RoI 所属类别(21 分类,多了一个类作为背景)
      • RoI 位置回归损失:继续对 RoI 位置微调

FPN

  • 低层的特征语义信息比较少, 但目标位置准确; 高层的特征语义信息比较丰富, 但目标位置粗略;
    • 大多数的算法采用多尺度特征融合方式, 但一般采用融合后的特征进行预测, 而本方法在不同特征层独立进行预测
  • 特征金字塔网络(FPN): 包含自底向上自顶向下的线路以及横向连接
    • 自底向上: 卷积神经网络的前向过程, feature map经过某些层后大小发生变化
    • 自顶向下: 采用上采样(最邻近插值)进行, 好处是即利用顶层较强的语义信息, 又利用率底层的高分辨率信息
    • 横向连接: 将上采样的结果和自底向上生成的相同大小的feature map进行融合; 融合之后使用3*3卷积核进行卷积以消除混叠效应.
      • 为修正通道数, 会使用1*1卷积进行调整
      • 可以将高层的语义信息逐渐传播到低层

  • 结合Faster-RCNN
    • 由于此时RPN的输入为多尺度的输入, 因此不需要设置不同尺寸大小的anchor, 仅需要设置3种不同的宽高比即可
    • 不同尺度的RoIs使用不同特征图作为RoI Pooling的输入, 为每个RoIs提取特征之后使用RoI Pooling输出相同结果

Mask-RCNN

  • Faster-RCNN (FPN)基础上进行改进
    • ROI Pooling改成ROI Align
    • RPN之后增加卷积分支以实现mask分割
  • ROI Align: 更加精准的RoI Pooling
    • 在Faster RCNN中由于两次量化操作会影响精度, ROI Align采用双线性插值的方式解决该问题
      • 取消取整操作, 保留小数
      • 首先将ROI切分成NNN*N的单元格, 将每个单元格均匀分成4份, 每个小方格是一个采样点, 使用双线性插值计算出该采样点的像素值. 最终在每个单元格内进行maxpooling, 最终可以得到NNN*N维的结果
  • 损失函数: L=Lcls+Lbox+LmaskL=L_{cls}+L_{box}+L_{mask}
    • 其中分类损失和位置损失与Faster RCNN一致
    • 分割的LmaskL_{mask}
    • 假定共有k个类别, mask分割分支输出的维度是KmmK*m*m, 对于mmm*m中的每个点, 都会输出kk个二值Mask
    • 计算损失时, 该像素属于哪个类, 哪个类的sigmoid输出才需要计算损失(可以避免类间竞争, 提升性能)
      • 在推理时, 通过分类分支预测的类别选择对应的mask预测(mask预测与分类预测解耦)

Cascade-RCNN

  • IoU阈值被用来定义正负样本
    • 阈值过低, 学习大量背景框, 产生大量噪声预测
    • 阈值过高, 正样本数量减少, 容易产生过拟合;
  • 解决mismatch问题: 训练时, 由于知道Ground Truth, 可以较自然地将IoU>0.5的划分为正样本; 而推理时, 不知道Ground Truth, 只能将所有的proposal作为正样本;
    • 因此BBox回归器的输入分布不一致, 训练阶段的proposal质量更高, 推理阶段的proposal质量较差
  • 途径: 多阶段方法, 利用多个感知器通过递增的IOU阈值分级训练(一个感知器输出一个良好的数据分布作为输入训练下一个高质量感知器)
    • 其中三个stageIOU阈值分别为0.5, 0.6, 0.7

One-stage

YOLO

  • 核心思想: 利用深度学习的回归方法预测物体位置和物体类别
  • 预测阶段(推理):
    • 将输入图像分为SSS*S个网格grid cell, 如果某个物体的中心落在这个网格中, 这个网格就负责预测这个物体
    • 每个网格需要预测BBBox的位置信息(x,y,w,h)和置信度信息confidence. 其中x,yBBox的中心点位置, w,hBBox的宽高; 每个置信度包含两个方面, 一是该边界框含有目标的可能性大小Pr(object)Pr(object), 二是该边界框的置信度, 用预测框和实际框的IOU表示,记作IOUpredtruthIOU_{pred}^{truth}. 因此confidence=Pr(object)IOUpredtruthconfidence = Pr(object) * IOU_{pred}^{truth}
      • 中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移量
    • 对于具有C个类别, 输出的维度为SS(5B+C)S*S*(5*B+C), C表示由该单元格负责预测的两个边界框中属于各个类别的概率Pr(classiobject)Pr(class_i | object), 因此每个BBox的类别置信度为Pr(classiobject)confidencePr(class_i | object) * confidence
    • 在得到每个BBox的类别置信度后, 设置阈值过滤掉的得分低的BBox, 对剩下的BBox使用NMS处理得到最终结果
  • 训练过程
    • 输入图像为448*448, S=7,B=2,C=20, 输出为7*7*30维张量, 对于每一个单元格, 前20个元素是类别概率, 然后2个元素是边界框置信度, 相乘可以得到类别置信度. 最后8个元素是边界框的(x,y,w,h)

7*7网格, 共98个边界框, 2个框对应一个类别, 因此单张图片最多预测49个目标

  • 损失函数: YOLO算法将检测问题看作回归问题, 选用了容易优化的均方根误差作为损失函数
    • 为了平衡定位误差和分类误差, 引入λcoord=5\lambda_{coord}=5来使定位误差具有较大的权重, 可以使含有目标的边界框具有较大的权重, λnoobj=0.5\lambda_{noobj}=0.5使不包含目标的边界框具有较小的权重
    • 对于大小不同的边界框, 小边界框的坐标误差更加敏感, 因此将网络的边界框的宽高预测改为对其平方根的预测(x,y,w,h)(x,y,\sqrt{w},\sqrt{h})
    • 总体损失函数: λcoord i=0S2j=0B1ijobj [(xix^i)2+(yiy^i)2]+λcoord i=0S2j=0B1ijobj [(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj (CiC^i)2+λnoobj i=0S2j=0B1ijnoobj (CiC^i)2+i=0S21iobj c classes (pi(c)p^i(c))2\begin{aligned} & \lambda_{\text {coord }} \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{i j}^{\text {obj }}\left[\left(x_i-\hat{x}_i\right)^2+\left(y_i-\hat{y}_i\right)^2\right] \\ &+\lambda_{\text {coord }} \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{i j}^{\text {obj }} {\left[\left(\sqrt{w_i}-\sqrt{\hat{w}_i}\right)^2+\left(\sqrt{h_i}-\sqrt{\hat{h}_i}\right)^2\right] } \\ &+ \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{i j}^{\text {obj }}\left(C_i-\hat{C}_i\right)^2 \\ &+\lambda_{\text {noobj }} \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{i j}^{\text {noobj }}\left(C_i-\hat{C}_i\right)^2 \\ &+\sum_{i=0}^{S^2} \mathbb{1}_i^{\text {obj }} \sum_{c \in \text { classes }}\left(p_i(c)-\hat{p}_i(c)\right)^2\end{aligned}
      • IijobjI_{ij}^{obj} 指的是第 ii 个单元格存在目标, 且该单元格中的第 jj 个边界框负责预测该目标. IiobjI_{i}^{obj} 指的是第 ii 个单元格存在目标.
      • 前2行计算前景的geo_loss(定位loss)
      • 第3行计算前景的confidence_loss(包含目标的边界框的置信度误差项)
      • 第4行计算背景的confidence_loss
      • 第5行计算分类损失class_loss
      • 值得注意的是,对于不存在对应目标的边界框,其误差项就是只有置信度,坐标项误差是没法计算的.而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的

YOLOv2

  • YOLOv1的缺点:
    • 每个grid预测两个框, 但是只能对应一个目标, 对于同一个grid有两个目标的情况下, YOLOv1检测补全, 且模型最多检测7*7=49个目标, 查全率Recall较低
    • 预测框不够准确, 回归(x,y,w,h)的方法不够精准, 模型精确率低
    • 回归参数网络使用全连接层参数量太大, 模型检测头不够快

改进方法

  • 添加BN层: 卷积层的组成从原先的线性卷积与激活函数组合改进为卷积三件套

  • 新的backbone: 使用Darknet-19, 该网络与VGG相似, 使用3*3卷积, 并且在每个2*2池化操作之后通道数加倍

  • 全卷积网络结构: 将YOLOv1最后的一个池化层和全部的全连接层修改为卷积层, 虽然mAP有所下降, 但召回率有所上升

  • 中心坐标预测的改进: 参考两阶段网络anchor boxes来预测边界框相对先验框的偏移, 同时用YOLOv1的方法预测边界框中心相对于grid左上角的相对偏移量

  • 各个字母的含义:

    • bx,by,bw,bhb_x,b_y,b_w,b_h :模型预测结果转化为 box 中心坐标和宽高后的值(归一化之后的值)
    • tx,ty,tw,tht_x,t_y,t_w,t_h :模型要预测的偏移量
    • cx,cyc_x,c_ygrid 的左上角坐标
    • pw,php_w,p_hanchor 的宽和高,这里的 anchor 是人为定好的一个框,宽和高是固定的
  • location prediction: 利用上述定义, 可以从直接预测位置改为预测偏移量, 即基于anchor的宽高和grid的先验位置偏移, 位置上使用grid, 宽高上使用anchor框, 得到最终目标的位置

    • 预测偏移而不直接预测位置, 可以使神经网络训练时更加稳定, 性能提升5%
    • 使用σ\sigma函数可以将边界框的中心坐标限制在grid内部, 防止偏移过多
  • 在解码过程中, 使用边界框的偏移量(tx,ty,tw,th)(t_x,t_y,t_w,t_h)可计算出边界框的位置和大小

    • 在模型推理的时候,还需将对应的值乘以图片的宽度和长度(像素点值)才可得到边界框的实际中心坐标和大小
  • 一个grid只能对应一个目标的改进

    • 7*7区域改为13*13, 每个区域内5anchor, 且每个anchor对应一个类别. 因此输出的尺寸为[N, 13, 13, 125], 125=5*(5+20)
    • YOLOv11个grid只能预测一个目标的分类概率, 两个boxes共享这个置信度概率; YOLOv2每个grid的每个anchor都单独预测一个目标的分类概率值
    • 每个grid5anchor使因为k-means聚类实验后, 当k=5时, 模型mAP与复杂度可以较好的平衡
      • 聚类分析时, 选用box与聚类中心box之间的IOU作为距离指标d(box, centroid)=1-IOU(box, centroid)
    • Faster RCNN的不同: 利用数据集聚类统计得到anchor, 而不是手动设置anchor的大小和宽高
  • 多尺度训练: 增加鲁棒性

    • 在训练过程中每间隔一定的iterations之后改变模型输入图片的大小
    • 由于YOLOv2下采样总步长为32, 输入图像大小选择为32倍数的值{320, 352,...,608}, 在训练过程中每隔10iterations随机选择一种输入图像大小
  • 损失函数

    • losst=i=0Wj=0Hk=0A1Max IOU < Thresh λnoobj (bijko)2+1t<12800λprior r(x,y,w,h)( prior krbijkr)2+1ktruth (λcoord r(x,y,w,h)( truth rbijkr)2+λobj (IOUtruth kbijko)2+λclass (c=1c(truthcbijkc)2))\begin{aligned} \operatorname{loss}_t=\sum_{i=0}^W \sum_{j=0}^H \sum_{k=0}^A & 1_{\text {Max IOU }<\text { Thresh }} \lambda_{\text {noobj }} *\left(-b_{i j k}^o\right)^2 \\ + & 1_{t<12800} \lambda_{\text {prior }} * \sum_{r \in(x, y, w, h)}\left(\text { prior }_k^r-b_{i j k}^r\right)^2 \\ +1_k^{\text {truth }}\left(\lambda_{\text {coord }} *\right. & \sum_{r \in(x, y, w, h)}\left(\text { truth }^r-b_{i j k}^r\right)^2 \\ & +\lambda_{\text {obj }} *\left(I O U_{\text {truth }}^k-b_{i j k}^o\right)^2 \\ & \left.+\lambda_{\text {class }} *\left(\sum_{c=1}^c\left(t r u t h^c-b_{i j k}^c\right)^2\right)\right)\end{aligned}
    • 第 2,3 行:tt 是迭代次数,即前 12800 步我们计算这个损失,后面不计算了
    • 12800步优化预测的(x,y,w,h)(x,y,w,h)anchor(x,y,w,h)(x,y,w,h)的距离+预测的(x,y,w,h)(x,y,w,h)GT(x,y,w,h)(x,y,w,h)的距离, 12800步之后就只优化预测的(x,y,w,h)(x,y,w,h)GT(x,y,w,h)(x,y,w,h)的距离, 原因是这时的预测结果已经较为准确了, anchor已经满足检测系统的需要, 而在一开始预测不准的时候, 用上anchor可以加速训练
  • 使用passthrough技术将融合特征

YOLOv3

  • 改进总结: 结合前人的工作, 同时训练了一个更好的分类器网络

改进方法

  • 新的backbone
    • 使用Darknet53, 引入残差模块, 使用53个卷积层; 使用平均池化替换最大池化, 较少信息损失; 总体卷积核个数减少, 模型参数减小
  • 引入特征金字塔网络(FPN)与多级检测
    • 浅层网络负责检测较小的目标, 深度网络负责检测较大的目标
    • YOLOv33个尺度上进行预测, 分别在经过8倍降采样的特征图, 16倍降采样的特征图, 32倍降采样的特征图上进行多级检测
  • 边界框预测: 更加细致, 阈值的取值有所改进
    • 使用逻辑回归预测每个边界框是否存在检测目标.如果边界框先前与真实目标重叠超过任何其他边界框, 则该值为1. 如果候选的边界框不是最好的但是与真实目标重叠超过某个阈值(0.5)则忽略预测
    • Faster-RCNN不同, 只为每个真实目标分配一个边界框, 若先前的边界框未分配给真实目标, 则不会导致坐标或类预测的损失, 只会导致是否存在目标的损失
  • 类别预测
    • 不适用softmax, 而只是使用独立logistic分类器. 在训练期间, 使用二元交叉熵损失进行类别预测
    • 对复杂场景有帮助, 具有较多重叠标签时, softmax输出只有一个类, 多标签的方法可以更好的拟合数据
  • 损失函数
    • YOLOv3使用多标签分类, 用多个独立的logistic分类器代替softmax函数以计算输入属于特定标签的可能性
    • 计算分类损失时, 对每个类别使用二元交叉熵损失

  • 正负样本确定
    • 正样本:与GTIOU最大的框
    • 负样本:与GTIOU<0.5的框
    • 忽略的样本:与GTIOU>0.5但不是最大的框
    • 使用 txt_xtyt_y(不是bxb_xbyb_y)来计算损失
  • 注意:每个GT目标仅与一个先验边界框相关联. 如果没有分配先验边界框, 则不会导致分类和定位损失, 只会有目标的置信度损失

RetinaNet

  • 目的: 为了解决one-stage算法中正负样本比例严重失衡的问题
  • 网络结构特征
    • Neck部分采用FPN结构
    • Head部分分为两路, 一路为分类预测, 一路为BBox预测, 但Head采用共享权重, 可以较好的控制参数量
      • 4次通道数2561*1卷积后, channel数分别为anchor数*类别数anchor数* 4
    • YOLOv3RCNN系列结构不同的是, 类别的预测没有背景预测.
      • 在类别分支输出后只能加sigmoid(归一化)函数, 而不能加softmax函数, 当前位置所有anchor类别预测值都很小时, 预测背景
  • 改进方法: 使用新的损失函数Focal Loss
    • CE(pt)=log(pt)CE(p_t)=-log(p_t)
    • FL(pt)=(1pt)γlog(pt),pt为预测类别的概率FL(p_t)=-(1-p_t)^\gamma log(p_t), p_t为预测类别的概率
    • 对于确定的类别, ptp_t较大, 则认为这是一个简单样本, 将其对整体loss权重降低, 因此前面乘上1pt1-p_t; 为了泛化公式, 可以增加一个指数函数的超参数γ\gamma调节整个公式力度

Anchor-Free

CornerNet

  • 先验问题:
    • 什么是一对关键点: 只需要预测物体包围框的左上角坐标右下角坐标就可以完成对物体的检测
    • 如何匹配同一物体BBox左上角右下角: 会为每个点分配一个embeding vector, 属于同一个物体的点的vector的距离较小
    • 什么是corner pooling:
      • 目的: 为了建立点corner和目标的位置关系
      • 一般而言, 知道了bbox的左上角和bbox的右下角就可以确定目标所在的范围和区域; 若从bbox左上角看物体.横着看,物体在视线的下方.竖着看, 物体在视线的右边; 当求解一个点的top left corner pooling时, 就是以该点为起点, 水平向右看遇到的最大值以及竖直向下看遇到的最大值之和
      • 快速实现方法: 方向进行颠倒, 每次都将沿着该方向上遇到的最大值作为填充值即可实现.
    • 网络输出: heatmaps, embeddings, offsets
      • heatmap表示不同类别的左上corner和右下corner位置信息以及位置置信度信息
      • embedding用于衡量左上corner和右下corner的距离, 从而判断某一对角点是否属于同一物体的两个角点
      • offsetsheatmapdownsample至原来1/n后, 想继续upsample回去时精度损失的补偿值

embeding vector

corner pooling

corner pooling快速实现

  • 网络结构
    • backbone: Hourglass Network, 两个沙漏模块头尾相接. 使用两个Hourglass进行堆叠以提高特征提取能力
    • Head: 二分支输出Top-left cornersBottom-right corners
      • 经过backbone之后需要各自再通过一个3*3卷积才能获得两个corners分支, 每个corners进行corner pooling操作和三分支的输出

网络整体框架图

PredictionModule结构图

  • 将标签映射为监督信息(类似网络的输出格式): 输入图像为511*511, 输出的特征图宽高均为128*128
    • heatmaps的大小(batch_size, 128, 128, 80), embedding的大小(batch_size, 128, 128, 1), offsets的大小(batch_size, 128, 128, 2)
    • heatmaps反映不同类别(80个类)左上角或右下角的角点的位置范围. 将物体bbox的一个角点映射到heatmap中对应的一个小型的圆形区域(使用高斯分布获取其邻域, 越靠近真实角点的值越大, 越远离的越小), 又称真实框角点的邻近区域(positive location)
    • offsetembedding
      • offset为精确映射位置与真实映射位置相减的值
      • embedding: 相当于将二维平面铺平成一维向量, 然后求解再二维平面上坐标为(x,y)的点在一维向量中的索引
  • 损失函数
    • 以输出的heatmap和监督的heatmap为输入计算focal loss: Ldet=1Nc=1Ci=1Hj=1W{(1pcij)αlog(pcij) if ycij=1(1ycij)β(pcij)αlog(1pcij) otherwise L_{d e t}=\frac{-1}{N} \sum_{c=1}^C \sum_{i=1}^H \sum_{j=1}^W\left\{\begin{array}{cc}\left(1-p_{c i j}\right)^\alpha \log \left(p_{c i j}\right) & \text { if } y_{c i j}=1 \\ \left(1-y_{c i j}\right)^\beta\left(p_{c i j}\right)^\alpha \log \left(1-p_{c i j}\right) & \text { otherwise }\end{array}\right.
    • embedding损失: 该损失用于减小同一物体bbox左上角和右下角embedding的距离, 增大不同物体bbox左上角和右下角的距离
      • Lpull =1Nk=1N[(etkek)2+(ebkek)2],Lpush =1N(N1)k=1Nj=1jkNmax(0,Δekej),\begin{gathered}L_{\text {pull }}=\frac{1}{N} \sum_{k=1}^N\left[\left(e_{t_k}-e_k\right)^2+\left(e_{b_k}-e_k\right)^2\right], \\ L_{\text {push }}=\frac{1}{N(N-1)} \sum_{k=1}^N \sum_{\substack{j=1 \\ j \neq k}}^N \max \left(0, \Delta-\left|e_k-e_j\right|\right),\end{gathered}
    • 修正损失: Loff=1Nk=1NSmoothL1Loss(ok,o^k)L_{o f f}=\frac{1}{N} \sum_{k=1}^N \operatorname{SmoothL1Loss}\left(\boldsymbol{o}_k, \hat{\boldsymbol{o}}_k\right), ok=(xknxkn,yknykn)\boldsymbol{o}_k=\left(\frac{x_k}{n}-\left\lfloor\frac{x_k}{n}\right\rfloor, \frac{y_k}{n}-\left\lfloor\frac{y_k}{n}\right\rfloor\right)
    • 总的损失函数: L=Ldet+Lpull+Lpush+LoffL = L_{det}+L_{pull}+L_{push}+L_{off}

CenterNet

  • CenterNet只需要进行一个关键点的检测来判断物体位置, 故网络结构只需要一个大的分支, 该分支包含3个小分支. 3个小分支分别输出heatmap, offset, Height&Weight
    • HeatMap: 输出不同类别(80个类)物体中心点的位置([W/4, H/4, 80])
    • Offset: 对HeatMap的输出进行精练, 提高定位准确度([W/4, H/4, 2])
    • Height&Width: 预测以关键点为中心的检测框的宽和高([W/4, H/4, 2])
  • 与CornerNet区别
    • embedding分支替换成Height&Width
    • 删除了Corner Pooling

  • Decode过程: 主要通过NMSheatmap上寻找topk个最大值(可能成为物体中心的索引), 然后根据这topK个中心点, 寻找其对应的类别,宽高和offset信息
    • NMS过程: 寻找某点与周围的八个点之间最大值, 作为其NMS极大值
  • Encode过程:
    • 将原图中的某关键点映射到Heatmap中的某一高斯核区域内
    • 根据获得的Heatmap可以将GT Box的偏移信息和宽高信息按照该映射关系等同地映射到OffsetHeight&Weight特征图中
  • 损失函数
    • Heatmap对应的损失(Focal Loss):Lk=1Nxyc{(1Y^xyc)αlog(Y^xyc) if Yxyc=1(1Yxyc)β(Y^xyc)α otherwise log(1Y^xyc)L_k=\frac{-1}{N} \sum_{x y c}\left\{\begin{array}{cl}\left(1-\hat{Y}_{x y c}\right)^\alpha \log \left(\hat{Y}_{x y c}\right) & \text { if } Y_{x y c}=1 \\ \left(1-Y_{x y c}\right)^\beta\left(\hat{Y}_{x y c}\right)^\alpha & \text { otherwise } \\ \log \left(1-\hat{Y}_{x y c}\right) & \end{array}\right.
    • Offset对应的loss: Loff=1NpO^p~(pRp~)L_{o f f}=\frac{1}{N} \sum_p\left|\hat{O}_{\tilde{p}}-\left(\frac{p}{R}-\tilde{p}\right)\right|, p~=pR\tilde{p}=\left\lfloor\frac{p}{R}\right\rfloor
      • pp是检测框中心点(原图)的真实坐标, pR\frac{p}{R}是理论上该中心点映射到特征图的准确位置区域. 实际上经取整后坐标pp在特征图的位置是p~=pR\tilde{p}=\left\lfloor\frac{p}{R}\right\rfloor, Op~^\hat{O_{\tilde{p}}}是网络的Offset输出特征图, p~\tilde{p}指关键点实际落入的区域
    • Height&Weight损失: Lsize=1Nk=1NS^pksk,sk=(x2(k),x1(k),y2(k),y1(k))L_{s i z e}=\frac{1}{N} \sum_{k=1}^N\left|\hat{S}_{p_k}-s_k\right|, s_k=(x_2^{(k)}, x_1^{(k)}, y_2^{(k)}, y_1^{(k)})
    • 总损失: Ldet=Lk+λsizeLsize+λoffLoffL_{det} = L_{k}+\lambda_{size}L_{size}+\lambda_{off}L_{off}

FCOS

  • FCOS逐像素预测的范式, 在每个像素点位置都产生预测结果. 当一个像素点位于多个重叠部分的GT Boxes内时, 容易产生歧义, FCOS使用FCN能很大程度上解决该问题. 使用centerness分支用来预测像素点位置与物体中心点的远近关系. 在推理时, 可以用该分数乘上分类得分, 以此降低低质量预测框的得分, 从而使其在NMS时排在后面以过滤掉低质量的边界框
  • FCOS的思想
    • 假定FiF_iCNN Backbone的第i层特征图, s是到这一层的总步长. 输入图像GT BBox定义为Bi=(x0(i),y0(i),x1(i),y1(i),c(i))B_i=(x_0(i),y_0(i),x_1(i),y_1(i),c(i))
    • 对于FiF_i上的每个像素(x,y)(x,y), 可以将其映射到原输入图像(s2+xs,s2+ys)\left(\left\lfloor\frac{s}{2}\right\rfloor+x s,\left\lfloor\frac{s}{2}\right\rfloor+y s\right). 在映射后的该点直接回归目标框, 而不是把这个点看成目标框的中心点.(FCOS相当于把每个点看成训练的样本)
    • 对于每个(x,y)(x,y), 若其落在GT的框内, 并且类别和GT框的类别一致, 那么就将其看成正样本, 否则看成负样本. 因此FCOS可以利用更多的前景样本, 而不是只有和GT框有高IOUAnchor当作正样本
    • 每个点都有一个4为向量t=(l,t,r,b)t^*=(l^*,t^*,r^*,b^*), 分别对应(x,y)到左, 上, 右, 下的距离. 因为这个距离总是正值, 故会使用exp()保证得到的都是正值
  • 检测流程
    1. 对每一层的feature map上的每一个点, 可以将其映射回原图的(s2+xs,s2+ys)\left(\left\lfloor\frac{s}{2}\right\rfloor+x s,\left\lfloor\frac{s}{2}\right\rfloor+y s\right)位置上
    2. 如果该点落在一个GT Box内部, 则该店为正样本, 否则为负样本. 正样本回归的目标为上下左右四条边的距离.(若该点落在多个GT Box内, 回归面积最小的GT Box, 在结合FPN之后出现这种情况的概率减小)
    3. 可以利用更多的前景样本来训练回归器(FCOS效果好的原因之一)
    4. 使用C个二分类器进行分类, 而不是一个多分类器(和Focal loss一致)
    5. 损失函数: L({px,y},{tx,y})=1Nposx,yLcls(px,y,cx,y)+λNposx,y1{cx,y>0}Lreg(tx,y,tx,y)\begin{aligned} L\left(\left\{\boldsymbol{p}_{x, y}\right\},\left\{\boldsymbol{t}_{x, y}\right\}\right) & =\frac{1}{N_{\mathrm{pos}}} \sum_{x, y} L_{\mathrm{cls}}\left(\boldsymbol{p}_{x, y}, c_{x, y}^*\right) \\ & +\frac{\lambda}{N_{\mathrm{pos}}} \sum_{x, y} 1_{\left\{c_{x, y}^*>0\right\}} L_{\mathrm{reg}}\left(\boldsymbol{t}_{x, y}, \boldsymbol{t}_{x, y}^*\right)\end{aligned}, LregL_{reg}使用IOU损失
    6. 推理阶段, 对每一层feature map上的每一个点, 都预测一个分类分数和四个回归值, 将分类分数大于0.05的作为正样本

网络结构

  • FPN结合的问题
    • 通过设定每个层级上BBox回归大小的范围来将不同尺寸的物体约束在不同层级的feature map
    • 不同层的Head共享权重, 但不同层需要回归的数值大小不一致, 通过在回归偏移量上加上一个可训练的scaler参数用exp(sx)来代替exp(x)作为输出
    • 重点解决低召回率和重叠目标情况下的歧义性问题
      • 低召回率问题: 使用多层感受野不同的特征, 不同层可以对应分配给不同尺寸的物体, 为不同尺寸的物体提供了合适的样本去负责召回
      • 重叠目标歧义性问题: 假设大部分重叠目标的尺寸存在一定程度的差异, 处于重叠Boxes内的一个特征点, 因为不同特征层会负责预测不同尺度的物体, 只需要看其属于哪个特征层就可以解决重叠目标的问题. 当两个重叠目标的尺度水平一致, 哪个物体的面积小就负责预测哪个.
  • 检测头: Classification, Regression, Centerness
  • Classification
    • 先经过4个卷积块(3*3卷积->Group Normalization->ReLu), 随后利用13*3卷积将输出通道映射成物体类别数(将多分类当作多个二分类处理,损失函数使用Focal Loss)
  • Regression
    • Classification几乎一样, 先经过4个卷积块(与上述相同), 最后使用1个独立的3*3卷积进行预测, 不同的是最后卷积输出通道数为4, 代表回归的四个量l,t,r,bl,t,r,b, 分别是像素点位置距离GT Box左边, 上边, 右边和下边的距离
    • 使用exp()函数将回归量的值域调节到正值
    • 不同层的Head共享权重, 但不同层需要回归的数值大小不一致, 通过在回归偏移量上加上一个可训练的scaler参数用exp(sx)来代替exp(x)作为输出
    • Loss使用IoU Loss
  • Centerness
    • 原因: 只要x,y落入到GT Box中就进行训练. 位置太多, 会存在一些低质量或较难学习的位置, 学习这些位置之后, 模型会产生较大的偏差. 加入centerness可以修正这种问题
    • 在分类并行的位置上添加一个一层卷积来预测当前位置上的"中心程度", 以此来过滤低质量的偏差很远的预测框. 推理时, 分类分数会乘上centerness的数值
    • centerness=min(l,r)max(l,r)×min(t,b)max(t,b)centerness^*=\sqrt{\frac{\min \left(l^*, r^*\right)}{\max \left(l^*, r^*\right)} \times \frac{\min \left(t^*, b^*\right)}{\max \left(t^*, b^*\right)}}
    • 开根号让centerness下降慢一些, 由于centerness值域为[0-1]故可以直接用BCE LOSS进行训练
  • 标签分配策略
    • 流程
      1. 将各层特征点位置映射回输入图像
      2. 位于物体框内的位置点作为正样本筛选, 只有min()l,t,r,b>0min()l,t,r,b>0的为支点才可以作为正样本候选
      3. 某位置点到物体边框的距离只有位于一定范围内才可作为正样本
        • 对于第ii层的特征点, 只有当mi1<=max(l,t,r,b)<=mim_{i-1} <= max(l,t,r,b) <= m_i时, 该点才可以作为相应物体的正样本
        • 该条件代表第ii层特征负责预测的GT Box的边长在[mi1,mi][m_{i-1}, m_i]范围内, 实际上就是要让不同层的特征负责不同尺寸的物体
      4. 选择物体框面积最小的作为目标(标签)

Other

PANet

只针对YOLO中出现得点进行总结

  • 自底向上Bottom-up Path Augmentation
    • 原始Mask RCNN没有很好的利用低层信息. 高层的Feature maps关注物体整体, 低层的Feature maps关注物体纹理图案, 使用低层信息可以更好的对物体进行定位. 因此将低层信息传导到高层中, 可以减少高层到低层的信息流通需要穿过的卷积层数
    • PANet融合时, 通过一个更浅层的NiN_i和更深层的$$P_{i+1}融合的方式得到下一层Ni+1N_{i+1}
      • 首先通过一个步长为23*3卷积进行降采样, 再通过单位加的方式对特征进行融合, 接着再使用一个3*3卷积对特征进行融合, 增加融合之后的特征表征能力, 再使用ReLu激活函数进行非线性化
    • 此外还在自顶向下模块和自底向上模块间各添加了一个跨越多层的shortcut

评论