RetinaNet

论文信息

Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollár, Focal Loss for Dense Object Detection, ICCV 2017.

https://arxiv.org/abs/1708.02002

历史的发展

我们重点关注神经网络重新崛起之后的内容, 先前的内容以后也许会简单提一下.

两大门派

两大门派主要是one stage与two stage, 二者在accuracy与speed各有侧重, 但最终还是trade-off.

one stagetwo stage
algorithmsYOLO, YOLTR-CNN, SPPnet
accuracyLow(30% mAP)High(60%+ mAP)
speedFast(100+ FPS)Slow(5 FPS)

two stage

其主要特点是先使用某种算法(selective search, RPN, etc.)产生一系列proposal, 将这些proposal喂到某个预训练神经网络(VGG-16, ResNet, etc.)中, 之后对输出进行分类.

特别的, RPN会预分类(background vs foreground)

one stage

大多数模型会采用一系列类似于滑窗分类器或是"anchor"直接进行分类而无proposal过程.

RetinaNet

本文中的模型是基于one stage, 目的也显而易见便是为了提升accuracy.

主要贡献

提出观点: 导致one stage精确度不足的重要原因有class imbalance.

class imbalance

所谓class imbalance便是由于two stage模型大多会对bg与fg预分类, 因此bg数量不会远大于fg数量, 而one stage模型为了提升速度舍弃了proposal过程, 因此大多数模型也谈不上预分类问题,这样虽然速度提升并且使用交叉熵, 但往往还是由于easy sample(e.g. bg)远大于hard sample(e.g. fg), 往往相差2 order, 以至于easy sample的loss统治整体loss.

此前的一些解决方案

OHEM直接舍弃部分easy example, 毫无疑问会导致数据残缺, 进而影响结果

本文的解决方案

提出了一个新的loss func:
C E ( p t ) = − l o g ( p t ) F L ( p t ) = − α t ( 1 − p t ) γ C E ( p t ) CE(p_t) = -log(p_t)\\ FL(p_t) = -\alpha_t(1-p_t)^\gamma CE(p_t) CE(pt)=log(pt)FL(pt)=αt(1pt)γCE(pt)
其中
p t = { p y = 1 1 − p o t h e r w i s e α t = { α y = 1 1 − α o t h e r w i s e p_t=\left\{ \begin{aligned} p && y = 1\\ 1-p && otherwise \end{aligned} \right.\\ \alpha_t=\left\{ \begin{aligned} \alpha && y = 1\\ 1-\alpha && otherwise \end{aligned} \right. pt={p1py=1otherwiseαt={α1αy=1otherwise
特别的, C E CE CE是交叉熵. 在作者的实验中发现 γ = 2 , α = 0.25 \gamma = 2, \alpha = 0.25 γ=2,α=0.25时取得最好结果.

probability of ground truth class

通过仿真图我们可以发现, 对于相对有把握的类别(easy sample, e.g. bg), loss设置较小, 而对于较没有把握的类别(hard sample, e.g. fg), loss较大, 这样就防止出现把握较大的类别因为数量优势统治loss.

我们从四种情况分析loss函数:

  1. 正确分类 & 目标项容易分类 - y = 1 , p ≈ 1 y = 1, p \approx 1 y=1,p1

    此时 p t = p ≈ 1 p_t = p \approx 1 pt=p1, 而 γ &gt; 1 \gamma &gt; 1 γ>1, 因此 F L ( p t ) &lt; &lt; C E ( p t ) FL(p_t) &lt;&lt; CE(p_t) FL(pt)<<CE(pt)

  2. 正确分类 & 目标项不易分类 - y = 1 , p ≈ 0 y = 1, p \approx 0 y=1,p0

    此时 p t = p ≈ 0 p_t = p \approx 0 pt=p0, 而 γ &gt; 1 \gamma &gt; 1 γ>1, 因此 F L ( p t ) ≈ C E ( p t ) FL(p_t) \approx CE(p_t) FL(pt)CE(pt)

  3. 错误分类 & 目标项容易分类 - y = − 1 , p ≈ 1 y = -1, p \approx 1 y=1,p1

    此时 p t = 1 − p ≈ 0 p_t = 1 - p \approx 0 pt=1p0, 而 γ &gt; 1 \gamma &gt; 1 γ>1, 因此 F L ( p t ) ≈ C E ( p t ) FL(p_t) \approx CE(p_t) FL(pt)CE(pt)

  4. 错误分类 & 目标项不易分类 - y = − 1 , p ≈ 0 y = -1, p \approx 0 y=1,p0

    此时 p t = 1 − p ≈ 1 p_t = 1 - p \approx 1 pt=1p1, 而 γ &gt; 1 \gamma &gt; 1 γ>1, 因此 F L ( p t ) &lt; &lt; C E ( p t ) FL(p_t) &lt;&lt; CE(p_t) FL(pt)<<CE(pt)

以一言蔽之, 易分类未出错的影响大量减小.

特别的, 易分类出错影响基本不减小也很合理.

额外的 - 网络构建

Net Architecture

该网络很容易看出左半部分就是FPN, 而对于右半部分就是他们独创的, 很容易看出(论文中也提到了)他们分了上下两个parameter not shared卷积网络, 一个是用来classifying另一个是用来anchor box regressing(4 dims).

Initialization

Bias initialization for classification subnet:
b = − l o g ( 1 − π / π ) b = -log(1 - \pi/\pi) b=log(1π/π)
π \pi π是指所有初始化时所有anchor都有 π \pi π的把握被当作fg, 实践证明 π = 0.01 \pi = 0.01 π=0.01较为合适.

实验结果

Results

这里要补充的时OHEM 1 : 3指舍弃low probability后fg : bg.

one vs two

这张图的结果来看, RetinaNet也可以称得上名副其实的state-of-the-art.

Appendix

A

首先定义了:
x t = y x , y ∈ { ± 1 } x_t = yx, y\in\{\pm1\} xt=yx,y{±1}
其中 x x x表示数量.

尝试了一个Focal Loss的变体, 得出的结论用原文总结就是:

More generally, we expect any loss function with similar properties as FL or FL* to be equally effective.

B

d C E d x = y ( p t − 1 ) F L d x = y ( 1 − p t ) γ ( γ p t l o g ( p t ) + p t − 1 ) d F L ∗ d x = y ( p t ∗ − 1 ) \frac{dCE}{dx} = y(p_t - 1)\\ \frac{FL}{dx} = y(1 - p_t)^\gamma(\gamma p_t log(p_t) + p_t - 1)\\ \frac{dFL^*}{dx} = y(p_t^* - 1) dxdCE=y(pt1)dxFL=y(1pt)γ(γptlog(pt)+pt1)dxdFL=y(pt1)

Grad

得出结论, 当 x t &gt; 0 x_t &gt; 0 xt>0时, FL导数比CE更接近于零.

总结

要善于发现问题的本质 - 从当时流行的方法中看one stage algorithms比不上two stage algorithms的一个重要原因.

### 技术原理 RetinaNet是一种高效的单阶段目标检测算法,其核心创新在于引入了Focal Loss,这种损失函数能够有效地处理类别不平衡问题,从而提升检测性能[^2]。与传统的两阶段检测器(如R-CNN系列)相比,单阶段检测器(如RetinaNet)通常具有更快的速度,因为它们直接在卷积层中预测边界框和类别概率,而不需要区域提议网络(Region Proposal Network, RPN)来生成候选框。 Focal Loss的设计目的是解决目标检测中的类别不平衡问题,即背景类别的样本数量远多于前景类别。通过调整损失函数的权重,使得模型更加关注难分类的样本,从而提高了整体的检测精度。 ### 应用场景 RetinaNet作为一种高效的单阶段目标检测算法,在以下应用场景中发挥着重要作用: - **自动驾驶**:RetinaNet可以准确检测道路上的各类目标,如行人、车辆、交通标志等,为自动驾驶系统提供关键输入。 - **智能监控**:RetinaNet可以应用于视频监控系统,实现对场景中目标的实时检测和跟踪,提高监控系统的智能化水平。 - **医疗影像分析**:RetinaNet可用于医疗图像中的病变区域检测,辅助医生进行疾病诊断。 - **工业检测**:RetinaNet可应用于工业生产线上的缺陷检测,提高产品质量控制的精度和效率[^1]。 ### 示例代码 下面是一个使用Keras实现RetinaNet模型的基本示例。请注意,这只是一个简化的版本,实际部署可能需要更多的细节处理。 ```python from keras.models import Model from keras.layers import Input, Conv2D, Reshape, concatenate from keras.applications import ResNet50 def retina_net(input_shape, num_classes): inputs = Input(shape=input_shape) # 使用ResNet50作为骨干网络 base_model = ResNet50(weights='imagenet', include_top=False, input_tensor=inputs) # 获取中间层输出 c3 = base_model.get_layer('conv3_block4_out').output c4 = base_model.get_layer('conv4_block6_out').output c5 = base_model.get_layer('conv5_block3_out').output # 特征金字塔网络 (FPN) p5 = Conv2D(256, (1, 1), padding='same')(c5) p4 = Conv2D(256, (1, 1), padding='same')(c4) p3 = Conv2D(256, (1, 1), padding='same')(c3) # 上采样并融合特征图 p5_upsampled = UpSampling2D(size=(2, 2))(p5) p4_plus = Add()([p5_upsampled, p4]) p4_upsampled = UpSampling2D(size=(2, 2))(p4_plus) p3_plus = Add()([p4_upsampled, p3]) # 分类分支 classification = Conv2D(256, (3, 3), padding='same', activation='relu')(p3_plus) classification = Conv2D(num_classes * 9, (3, 3), padding='same', activation='sigmoid')(classification) classification = Reshape((-1, num_classes))(classification) # 回归分支 regression = Conv2D(256, (3, 3), padding='same', activation='relu')(p3_plus) regression = Conv2D(9 * 4, (3, 3), padding='same')(regression) regression = Reshape((-1, 4))(regression) model = Model(inputs=inputs, outputs=[classification, regression]) return model # 创建模型 model = retina_net((600, 800, 3), 20) # 假设有20个类别 model.compile(optimizer='adam', loss={'classification': focal_loss(), 'regression': smooth_l1()}) ``` 这段代码展示了如何构建一个基于ResNet50的RetinaNet模型,其中包括了特征金字塔网络(Feature Pyramid Network, FPN)的实现,以及分类和回归两个输出分支。注意,`focal_loss()` 和 `smooth_l1()` 函数需要根据具体需求自行定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值