├── GCNet.md ├── LICENSE ├── README.md ├── loss篇 ├── Generalized Focal Loss - SRC.md ├── Generalized Focal Loss.md ├── 分类loss-SRC.md ├── 分类loss.md ├── 回归损失函数 - SRC.md └── 回归损失函数.md ├── 优化篇 ├── Batch-Normilize-DRC.md ├── Batch-Normilize.md ├── 优化器-scr.md ├── 优化器.md ├── 正则项-SRC.md ├── 正则项.md ├── 激活函数-SRC.md └── 激活函数.md ├── 分割篇 ├── readme.md ├── 实例分割 │ ├── Hybrid Task Cascade for Instance Segmentation.md │ ├── InstaBoost-SRC.md │ ├── InstaBoost.md │ ├── Mask-Scoring-R-CNN.md │ ├── mask-rcnn.md │ └── readme.md └── 语义分割 │ └── readme.md ├── 分类篇 └── 长尾效应 │ ├── Bilateral-Branch Network with Cumulative Learning.md │ ├── DECOUPLING REPRESENTATION AND CLASSIFIER SRC - 副本.md │ ├── DECOUPLING REPRESENTATION AND CLASSIFIER.md │ └── readme.md ├── 多任务篇 ├── readme.md └── yolop.md ├── 目标检测篇 ├── Anchor-Base │ ├── one-stage │ │ ├── EfficientDet-SRC.md │ │ ├── EfficientDet.md │ │ ├── GHM-SRC.md │ │ ├── GHM.md │ │ ├── RetinaNet.md │ │ ├── SSD.md │ │ ├── Yolo4.md │ │ └── Yolo5.md │ └── two-stage │ │ ├── CARAFE-SRC.md │ │ ├── Cascade-RCNN - SRC.md │ │ ├── Cascade-RCNN.md │ │ ├── Double-Head-RCNN.md │ │ ├── Dynamic-RCNN.md │ │ ├── Faster-RCNN-SRC.md │ │ ├── Faster-RCNN.md │ │ ├── Libra R-CNN-SRC.md │ │ ├── Libra R-CNN.md │ │ └── R-FCN.md ├── Anchor-Free │ ├── Anchor-Point │ │ ├── CenterNet - SRC.md │ │ ├── CenterNet.md │ │ ├── FASF-src.md │ │ ├── FASF.md │ │ ├── FCOS-SRC.md │ │ ├── FCOS.md │ │ ├── Soft Anchor-Point Object Detection - SRC.md │ │ └── Soft Anchor-Point Object Detection.md │ └── Key-Point │ │ ├── ATSS-SRC.md │ │ ├── CornerNet - SRC.md │ │ ├── CornerNet.md │ │ ├── Densebox-SRC.md │ │ ├── Densebox.md │ │ ├── FoveaBox-SRC.md │ │ ├── FoveaBox.md │ │ ├── RepPoints-SRC.md │ │ └── Yolo.md ├── 插件式 │ ├── readme.md │ └── soft-nms-src.md ├── 数据集 │ ├── ms-coco.md │ └── pascal-voc.md └── 评测指标 │ └── mAP.md └── 网络篇 ├── GCNet-SRC.md ├── GCNet.md └── readme.md /GCNet.md: -------------------------------------------------------------------------------- 1 | ## ****GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond**** 2 | 3 | ## 1.概述: 4 | 5 | **GCNet通过分析No-Local(Non-local Neural Networks)网络,实现发现No-Local网络用了大量的计算量来建立的特征长程关系,但是却发现通过No-local网络来建模的全局语义信息在不同的点上几乎是相同的。对于这一现象,作者进行了改进。** 6 | 7 | 8 | 9 | 10 | ## 2. 具体实现: 11 | 12 | ### 2.1 No-Local Net 13 | 14 | **No-Local信息能够更好的理解图像,不管是RNN还是CNN,都通过重复堆叠的形式来获取No-Local信息,但是这会存在几个问题:** 15 | 16 | - **为了获取No-Local信息,通常需要堆叠很深的深度** 17 | - **大量的参数导致优化并不容易** 18 | - **这种方式提取的特征也并不是那么No-Local,比如通过卷积,最终32倍下采样,那么特征图的右下角和左上角肯定还是没什么交集的,所以并不是那么No-Local** 19 | 20 | **为此No-Local网络的提出使得网络能够以更浅的层实现完全No-Local的目的,主要分为3个步骤:** 21 | 22 | 1. **一个上下文建模单元通过聚集所有点的特征形成一个全局上下文特征** 23 | 2. **一个特征转换单元获取channel-wise的互相依赖关系** 24 | 3. **一个融合单元融合所有点全局上下文特征** 25 | 26 | **只看这三个步骤可能有些疑惑,看公式和框架图会更加清楚一点:** 27 | 28 |
29 | 30 |
31 | 32 | 33 |
34 | 35 |
36 | 37 | ​ 图1 38 | 39 | ### 2.2 No-Local Net缺点 40 | 41 | 为了更加直观的了解No-Local block,作者可视化了不同位置的attention map,如下图所示: 42 | 43 |
44 | 45 |
46 | 47 | **图中红色的点是query position,可以看到不同的query position的attention map竟然几乎相同,如果说图像比较直观,那么数据就更加客观,作者分析特征之间的距离,主要包括:1. no-local block input之间的距离,2. no-local block output before fusio之间的距离,3. query position attention map之间的距离,结果如下图所示:** 48 | 49 |
50 | 51 |
52 | 53 | 54 | 55 | **从上图中可以看出不同input的余弦距离还是蛮大的,但是output的距离却很小,attention map的距离也很小。说明为每一个query position通过一个No-Local block获取global context,global context随着训练的进行会变得相似。** 56 | 57 | ### 2.2 Simplify-No-Local Net 58 | 59 | **有了以上发现,这座机智的设计了一个简化版本的 No-Local Net,既然global context与query position关系不大,那么就没必要为每一个query position获取其global context,这样太耗时。于是作者就为每一个query position共享一个global attention map,反正都是一样的,那么共享一个能够省掉很多计算量,岂不美哉。** 60 |
61 | 62 |
63 | 64 |
65 | 66 |
67 | 68 | ### 2.3 GC Net 69 | 70 | **GCNet是作者分析SENet得出的,其实就是通过1*1的卷积达到降维的目的:** 71 | 72 |
73 | 74 |
75 | 76 | 77 | 78 | ## 3. 总结: 79 | 80 | **** 81 | 82 | **GCNet我觉得十一篇非常棒的文章,我个人非常喜欢这种类型的文章,通过试验分析然后再解决问题,不像很多文章基本都是发现一个提升点就在那里狂讲故事。作者通过删掉每个query position的no-local bkock,建立一个共享global attention为每一个query position享用,这一步能省去很多计算量,最后再通过1*1卷积降维的作用进一步减小计算量,使之能够嵌到网络的每一个residual block中可以提升精度。no-local net的层数一般不会太多,计算负担不起,而嵌入GCNet的网络类似resnet,层数一般很深又加持了no-local特征精度当然蹭蹭涨。** -------------------------------------------------------------------------------- /loss篇/Generalized Focal Loss - SRC.md: -------------------------------------------------------------------------------- 1 | ## **Generalized Focal Loss** 2 | 3 | ## 1.概述: 4 | 5 | **文章争对分类问题,提出Quality Focal Loss。核心目的是解决在训练阶段和测试阶段bbox置信度与类别置信度不统一问题,训练阶段bbox置信度与类别置信度单独训练,但是在测试阶段bbox置信度又内别置信度相乘。针对回归问题,提出Distribution Focal Loss,把bbox的回归当成一个任意随机分布问题来看待。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | 13 | ## 2. 具体实现: 14 | 15 | ### 2.1 Quality Focal Loss: 16 | 17 | $$ 18 | \large Q F L ( \sigma ) = - | y - \sigma | ^ { \beta } ( ( 1 - y ) \log ( 1 - \sigma ) + y \log ( \sigma ) ) \\ 19 | \large \sigma为预测值,y为标签。值得注意的是这里的标签不再是one-hot标签,而是改预测框和gt的iou值。这个很好理解,相当于软化标签。 20 | $$ 21 | 22 | 23 | 24 | **** 25 | 26 |
27 | 28 |
29 | 30 | ### 2.2 **Distribution Focal Loss**: 31 | 32 | **Distribution Focal Loss提出的目的是为了在一定程度上反应目标框的不确定程度。如下图所示:** 33 | 34 |
35 | 36 |
37 | 38 | **可以看出上下左右四条边,上下左三条边还是不容易混淆的,但是右边这条边就比较容易混淆了。普通的标签做法就是按照狄拉克分布来标记即认为在标注出置信度最高其余都为0,也有一些做法是按照高斯分布,对每一条边学习额外2个参数(高斯的均值和方差),但是这里有一个先验知识即这些目标框是按照高斯分布。这两种做法都有一定的局限性,作为认为目标狂应该是General分布的。** 39 | $$ 40 | \large \hat { y } = \int _ { - \infty } ^ { + \infty } P ( x ) x d x = \int _ { y _ { 0 } } ^ { y _ { n } } P ( x ) x d x\\ 41 | \large y_0<=y<=y;\hat {y}是预测值,且y_0<=\hat {y} <=y;\\ 42 | \large 为了离散化把y_0,y_n分成n等分\{ y _ { 0 } , y _ { 1 } , \ldots , y _ { i } , y _ { i + 1 } , \ldots , y _ { n - 1 } , y _ { n } \}\\ 43 | \large \sum _{i=0}^{n}P(y_{i})=1 \\ 44 | \large \hat { y } = \sum _ { i = 0 } ^ { n } P ( y _ { i } ) y _ { i }\\ 45 | \large 一般情况下P(y_i)用softmax函数得到。y_0=0,y_1=1,y_2=2,....,y_n=n 46 | $$ 47 | **如果按照上市的预测值去做回归,这满足预测条件的情况太多收敛速度会很慢如下图所示:** 48 | 49 |
50 | 51 |
52 | 53 | $$ 54 | \large 上图三种形式都满足 \sum _{i=0}^{n}P(y_{i})=1 \\ 55 | $$ 56 | 57 | **很第三张更符合要求,于是为了限制这种情乱使网络更加关注标签周边的值,通过简单的扩大标签周边值得概率,DFL Loss表示如下:** 58 | $$ 59 | \large DFL(S_{i},S_{i+1})=-((y_{i+1}-y) \log (S_{i})+(y-y_{i}) \log (S_{i+1})).\\ 60 | \large P(x)用S(.)表示。y _ { i } \leq y \leq y _ { i + 1 }表示标签得左右俩个点。 61 | $$ 62 | 63 | 64 | ## 3. 总结: 65 | 66 | **** 67 | 68 | **Quality Focal Loss比较好理解,通过软化标签用IOU值替换one-hot标签,再利用focal-loss的形式组成分类loss;Distribution Focal Loss还是没有理解透彻,大致是围绕坐标标签定义一个离散空间,然后把这个离散空间通过softmax函数表示每个离散空间可能是坐标的概率,同事为了加快收敛速度只计算坐标左右两点的loss。** -------------------------------------------------------------------------------- /loss篇/Generalized Focal Loss.md: -------------------------------------------------------------------------------- 1 | ## **Generalized Focal Loss** 2 | 3 | ## 1.概述: 4 | 5 | **文章争对分类问题,提出Quality Focal Loss。核心目的是解决在训练阶段和测试阶段bbox置信度与类别置信度不统一问题,训练阶段bbox置信度与类别置信度单独训练,但是在测试阶段bbox置信度又内别置信度相乘。针对回归问题,提出Distribution Focal Loss,把bbox的回归当成一个任意随机分布问题来看待。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | 13 | ## 2. 具体实现: 14 | 15 | ### 2.1 Quality Focal Loss: 16 | 17 |
18 | 19 |
20 | 21 | 22 | 23 | **** 24 | 25 |
26 | 27 |
28 | 29 | ### 2.2 **Distribution Focal Loss**: 30 | 31 | **Distribution Focal Loss提出的目的是为了在一定程度上反应目标框的不确定程度。如下图所示:** 32 | 33 |
34 | 35 |
36 | **可以看出上下左右四条边,上下左三条边还是不容易混淆的,但是右边这条边就比较容易混淆了。普通的标签做法就是按照狄拉克分布来标记即认为在标注出置信度最高其余都为0,也有一些做法是按照高斯分布,对每一条边学习额外2个参数(高斯的均值和方差),但是这里有一个先验知识即这些目标框是按照高斯分布。这两种做法都有一定的局限性,作为认为目标狂应该是General分布的。** 37 | 38 |
39 | 40 |
41 | 42 | **如果按照上市的预测值去做回归,这满足预测条件的情况太多收敛速度会很慢如下图所示:** 43 | 44 |
45 | 46 |
47 |
48 | 49 |
50 | 51 | **很第三张更符合要求,于是为了限制这种情乱使网络更加关注标签周边的值,通过简单的扩大标签周边值得概率,DFL Loss表示如下:** 52 | 53 |
54 | 55 |
56 | 57 | 58 | ## 3. 总结: 59 | 60 | **** 61 | 62 | **Quality Focal Loss比较好理解,通过软化标签用IOU值替换one-hot标签,再利用focal-loss的形式组成分类loss;Distribution Focal Loss还是没有理解透彻,大致是围绕坐标标签定义一个离散空间,然后把这个离散空间通过softmax函数表示每个离散空间可能是坐标的概率,同事为了加快收敛速度只计算坐标左右两点的loss。** -------------------------------------------------------------------------------- /loss篇/分类loss-SRC.md: -------------------------------------------------------------------------------- 1 | # 交叉熵损失函数 2 | #### 概念 3 | - **信息量** 4 | 5 | 信息奠基人香农(Shannon)认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量越大。设某一事件发生的概率P(x),其信息量表示为: 6 | $$ 7 | I(x) = -logp(x) 8 | $$ 9 | 10 | - **信息熵** 11 | 12 | 信息熵也被称为熵,用来表示所有信息量的期望。 13 | $$ 14 | H ( X ) = - \sum _ { i = 1 } ^ { n } P ( x _ { i } ) \log ( P ( x _ { i } ) ) ,X = ( x _ { 1 } , x _ { 2 } , \ldots , x _ { n } ) 15 | $$ 16 | 17 | - **KL散度** 18 | 19 | KL散度用来衡量两个概率分布之间的相似度。 20 | $$ 21 | D_{KL}(P||Q)=\sum_{i=1}^{n}P(x_{i})\frac{log(P(x_{i}))}{log(Q(x_{i})}\\ 22 | P(x_{i})表示真实概率分布、Q(x_{i})表示预测概率分布,\\Q(x_{i})越接近P(x_{i}),KL散度越小。 23 | $$ 24 | 25 | - **交叉熵** 26 | 27 | KL散度拆开形似为: 28 | $$ 29 | D_{KL}(P||Q)=\sum_{i=1}^{n}P(x_{i})\frac{log(P(x_{i}))}{log(Q(x_{i})}\\=\sum_{i=1}^{n}P(x_{i})\log(P(x_{i}))-\sum_{i=1}^{n}P(x_{i})\log(Q(x_{i}))\\ 30 | \sum_{i=1}^{n}P(x_{i})\log(P(x_{i}))为信息熵;\\ 31 | \sum_{i=1}^{n}P(x_{i})\log(Q(x_{i}))为交叉熵;\\ 32 | $$ 33 | 由于信息熵不变,所以交叉熵越小,预测概率的分布和原始分布越接近, 34 | 所以优化的时候按交叉熵来优化即可。 35 | 36 | - **求导** 37 | $$ 38 | 分类问题中,P(x_{i})为目标one-hot形似的标签,这里用y_{i}表示,Q(x_{i})为\\softmax函数的输出用a_{i}表示,交叉熵形式为\\ 39 | L=-\sum_{j}y_{i}lna_{j}\\ 40 | a_{i} = \frac{e^{z^i}}{\sum_{k}e^{z^k}} 41 | $$ 42 | 43 | $$ 44 | \left\{\begin{array}{ll} 45 | \frac{dL}{dz^i}=\frac{d(-\sum_{j}y_{i}lna_{j})}{da_{j}}.\frac{da_{j}}{dz^i}=-\frac{dL}{da_{j}}.\frac{da_{j}}{dz^i}\\ 46 | =-\sum_{j}\frac{y_{j}}{a_{j}}.\frac{da_{j}}{dz_{j}}\\ 47 | =-(\sum_{i=j}\frac{y_{i}}{a_{i}}.\frac{da_{i}}{dz_{i}}+\sum_{i!=j}\frac{y_{j}}{a_{j}}.\frac{da_{j}}{dz_{i}})\\ 48 | \frac{da_{i}}{dz_{i}}=a_{i}.(1-a_{i}),i==j\\ 49 | \frac{da_{j}}{dz_{i}}=-a_{j}.a_{i},i!=j\\ 50 | \frac{dL}{dz^i}=a_{i}.\sum_{j}y_{j}-y_{i}\\ 51 | 因为y_{i}是one-hot标签,所以\frac{dL}{dz^i}=a_{i}-y_{i} 52 | \end{array}\right. 53 | $$ 54 | $$ 55 | - **注意点** \\ 56 | a_{i} = \frac{e^{z^i}}{\sum_{k}e^{z^k}},当z^i过大时会造成内存上溢出,过小时会造成内存下溢,为了避免内存上溢。\\通常z^i会减去一个最大值\\ 57 | softmax(z^i-max)=\frac{e^{z^i-max}}{\sum_{k}e^{z^k-max}},\\ 58 | ln(a_{i}) = ({z^i-max})-ln(\sum_{k}e^{z^k-max}) 59 | $$ 60 | 61 | 62 | 63 | 64 | # Focal-loss 65 | 66 | ## 概述 67 | 68 | **Focal-Loss可以在一定程度上降低样本类别不均衡带来的精度损失,通过简单easy-sample的loss值,提升hard-sample的loss值(相对提升)来促使网络更加关注难例。** 69 | 70 |
71 | 72 |
73 | 74 | 75 | **公式如下式所示:** 76 | $$ 77 | \large \mathrm{L}_{f l}= \begin{cases}-\alpha\left(1-y^{\prime}\right)^{\gamma} \log y^{\prime} \quad, & y=1 \\ -(1-\alpha) y^{\prime \gamma} \log \left(1-y^{\prime}\right), & y=0\end{cases}\\ 78 | \large 从上公式可以看出,focal-loss是从BCEloss的基础上添加了两部分:\gamma和\alpha,以y=1为例,当y^{\prime}越大时认为该样本比较容易学习就降低\\ 79 | \large 该样本的loss值,当y^{\prime}越小时就认为该样本越难学习就相对增加该样的权重(就是减小的少了)。 80 | $$ 81 | 82 | 83 | 84 | 85 | # Bi-Tempered Logistic Loss 86 | 87 | ## 概述 88 | 89 | **Bi-Tempered Logistic Loss可以在一定程度上解决错误样本标记带来的问题,通过改进log函数和exp函数,添加两个tempered变量减轻错误样本的影响。** 90 | 91 | **常见样本标注错误一般分两种情况:** 92 | 93 | - **远离分类边界面的样本标注错误:** 94 | 95 | **这种情况《In *Proceedings of the 25th international conference on Machine learning*》证明了像如下图所示的convex losses,原理分界面的错误样本标注会极大增加loss值,由于softmax loss的无界性,会导致loss值会非常大。** 96 | 97 |
98 | 99 |
100 | 101 | 102 | 103 | ​ **解决这个问题的方法是使得softmax-loss有界,因此需要改进softmax-loss,改进形式如下:** 104 | 105 | ​ 106 | $$ 107 | \large \log _{t}(x):=\frac{1}{1-t}\left(x^{1-t}-1\right) 108 | $$ 109 | ​ **当limit t 趋近1 的时候上式子就退化成了普通的log函数,函数图像如下所示:** 110 | 111 |
112 | 113 |
114 | 115 | ​ **可以看出改进后的函数变得有界,能够缓解极端错误标签对网络的影响** 116 | 117 | ​ 118 | 119 | - **靠近分类面的样本标注错误** 120 | 121 | **exp的短尾效应会迫使分类器扩大至噪声样本边界,重尾效应能够显著解决该问题,参考论文《Nan Ding and S. V. N. Vishwanathan. *t*-logistic regression. In *Proceedings of the 23th*** 122 | 123 | ***International Conference on Neural Information Processing Systems*, NIPS’10, pages 514–522,** 124 | 125 | **Cambridge, MA, USA, 2010》** 126 | 127 | **通过改进exp函数可以减轻轻尾效应:** 128 | $$ 129 | \large \exp _{t}(x):=[1+(1-t) x]_{+}^{1 /(1-t)} 130 | $$ 131 | 132 | 133 |
134 | 135 |
136 | 137 | -------------------------------------------------------------------------------- /loss篇/分类loss.md: -------------------------------------------------------------------------------- 1 | # 交叉熵损失函数 2 | #### 概念 3 | - **信息量** 4 | 5 | 信息奠基人香农(Shannon)认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量越大。设某一事件发生的概率P(x),其信息量表示为: 6 | 7 |
8 | 9 |
10 | 11 | - **信息熵** 12 | 13 | 信息熵也被称为熵,用来表示所有信息量的期望。 14 | 15 |
16 | 17 |
18 | 19 | - **KL散度** 20 | 21 | KL散度用来衡量两个概率分布之间的相似度。 22 | 23 |
24 | 25 |
26 | 27 | - **交叉熵** 28 | 29 | KL散度拆开形似为: 30 | 31 |
32 | 33 |
34 | 35 | 由于信息熵不变,所以交叉熵越小,预测概率的分布和原始分布越接近, 36 | 所以优化的时候按交叉熵来优化即可。 37 | 38 | - **求导** 39 | 40 |
41 | 42 |
43 | 44 |
45 | 46 |
47 | 48 | - **注意点** 49 | 50 |
51 | 52 |
53 | 54 | # Focal-loss 55 | 56 | ## 概述 57 | 58 | **Focal-Loss可以在一定程度上降低样本类别不均衡带来的精度损失,通过简单easy-sample的loss值,提升hard-sample的loss值(相对提升)来促使网络更加关注难例。** 59 | 60 |
61 | 62 |
63 | 64 | **公式如下式所示:** 65 | 66 |
67 | 68 |
69 | 70 | # Bi-Tempered Logistic Loss 71 | 72 | ## 概述 73 | 74 | **Bi-Tempered Logistic Loss可以在一定程度上解决错误样本标记带来的问题,通过改进log函数和exp函数,添加两个tempered变量减轻错误样本的影响。** 75 | 76 | **常见样本标注错误一般分两种情况:** 77 | 78 | - **远离分类边界面的样本标注错误:** 79 | 80 | **这种情况《In *Proceedings of the 25th international conference on Machine learning*》证明了像如下图所示的convex losses,原理分界面的错误样本标注会极大增加loss值,由于softmax loss的无界性,会导致loss值会非常大。** 81 | 82 |
83 | 84 |
85 | 86 | 87 | 88 | 89 | ​ **解决这个问题的方法是使得softmax-loss有界,因此需要改进softmax-loss,改进形式如下:** 90 | 91 | ​ 92 | $$ 93 | \large \log _{t}(x):=\frac{1}{1-t}\left(x^{1-t}-1\right) 94 | $$ 95 | ​ **当limit t 趋近1 的时候上式子就退化成了普通的log函数,函数图像如下所示:** 96 | 97 |
98 | 99 |
100 | 101 | 102 | ​ **可以看出改进后的函数变得有界,能够缓解极端错误标签对网络的影响** 103 | 104 | ​ 105 | 106 | - **靠近分类面的样本标注错误** 107 | 108 | **exp的短尾效应会迫使分类器扩大至噪声样本边界,重尾效应能够显著解决该问题,参考论文《Nan Ding and S. V. N. Vishwanathan. *t*-logistic regression. In *Proceedings of the 23th*** 109 | 110 | ***International Conference on Neural Information Processing Systems*, NIPS’10, pages 514–522,** 111 | 112 | **Cambridge, MA, USA, 2010》** 113 | 114 | **通过改进exp函数可以减轻轻尾效应:** 115 | $$ 116 | \large \exp _{t}(x):=[1+(1-t) x]_{+}^{1 /(1-t)} 117 | $$ 118 | 119 | 120 |
121 | 122 |
123 | 124 | -------------------------------------------------------------------------------- /loss篇/回归损失函数 - SRC.md: -------------------------------------------------------------------------------- 1 | # L1 Loss 2 | #### 公式 3 | 4 | $$ 5 | \large L_{L1}=\sum_{i=0}^{n}\left|y_{i}-y_{i}^{p}\right| / n 6 | $$ 7 | 8 | #### 优点 9 | 不论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,对离群点不敏感,具有较为稳健性的解。 10 | 11 | #### 缺点 12 | 在中心点是折点,不能求导,不方便求解。其导数为常数,导致训练后期,预测值与真是差异很小时,损失函数的导数绝对值仍然为1,而如果learning rate不变,损失函数将在稳定值附近波动,难以继续收敛达到更高精度 13 | 14 | 15 | # L2 Loss 16 | #### 公式 17 | 18 | $$ 19 | \large L_{L2}=\sum_{i=0}^{n}\left|y_{i}-y_{i}^{p}\right|^2 / n 20 | $$ 21 | 22 | #### 优点 23 | 各点都连续光滑,方便求导,而且梯度值也是动态变化的,能够快速的收敛,得到较为稳定的解 24 | 25 | #### 缺点 26 | 真实值和预测值的差值大于1时,会放大误差;而当差值小于1时,则会缩小误差,这是平方运算决定的。MSE对于较大的误差>1给予较大的惩罚,较小的误差<1给予较小的惩罚。也就是说,对离群点比较敏感,受其影响较大。所以训练初期,一旦出现预测值和真实值差异很大时,就很容易出现梯度爆炸。 27 | 28 | # SmoothL1 Loss 29 | #### 公式 30 | 31 | $$ 32 | \large S m o o t h_{L 1}(x)=\left\{\begin{array}{ll} 33 | 0.5 x^{2} & \text { if }|x|<1 ; \\ 34 | \large |x|-0.5 & \text { else. } 35 | \large \end{array} \quad x=y_{i}-y_{i}^{p}\right. 36 | $$ 37 | 38 | #### 优点 39 | 综合了L1和L2的优点,相比于L2损失函数,对离群点、异常值使用L1,梯度变化相对更小,训练时不容易跑飞。当预测值与真是差异很小时,使用L2损失,快速得到较为稳定的解。 40 | 41 | #### 缺点 42 | L1,L2 loss也有相同缺点,就是他们都是分别回归宽高和中心点,没有把box当成一个整体看待。 43 | 44 | # IOU Loss 45 | #### 公式 46 |
47 | 48 |
49 | 50 | 51 | 52 | #### 优点 53 | 如下图所示,L1 和 L2 的边界框 L1 和 L2 loss 是相同的,但是他们的 IOU 却相差很大: 54 | 55 |
56 | 57 |
58 | 59 | 如果宽高和中心点使用分别优化的话就会损失他们之间的相关性,实际上目标回归框之间存在相关性,并不是相互独立的,使用 IOU LOSS可以把回归框当成一个整体去优化,如上图最右边的回归情况最好,最左边的回归情况最差,但是它们的 LS Loss 确实相同的,所以不合理。 60 | 61 | #### 缺点 62 | - 预测值和 gt 不重叠,iou 始终为 0 且无法优化 63 | - IOU 无法辨别不同的对其方式,如下图所示,下图三个的iou都是一样的 64 | 65 |
66 | 67 |
68 | 69 | # GIOU LOSS 70 | 71 | #### 公式 72 |
73 | 74 |
75 | 76 | $$ 77 | \large B^p = (x_{1}^p,y_{1}^p,x_{2}^p,y_{2}^p),B^g = (x_{1}^g,y_{1}^g,x_{2}^g,y_{2}^g) 78 | $$ 79 | 80 | 1. $$ 81 | \large 计算B^g的面积A^g = (x_{2}^g - x_{1}^g) * (y_{2}^g - y_{1}^g) 82 | $$ 83 | 84 | 85 | 86 | 87 | 88 | 2. $$ 89 | \large 计算B^p的面积A^p = (x_{2}^p - x_{1}^p) * (y_{2}^p - y_{1}^p) 90 | $$ 91 | 92 | 3. 93 | 94 | $$ 95 | \large 计算B^p,B^g重叠面积: 96 | 97 | \large \begin{aligned} 98 | \large x_{1}^{I}=\max \left(x_{1}^{p}, x_{1}^{g}\right), x_{2}^{I}=\min \left(x_{2}^{p}, x_{2}^{g}\right) \\ 99 | \large y_{1}^{I}=\max \left(y_{1}^{p}, y_{1}^{g}\right), x_{2}^{I}=\min \left(y_{2}^{p}, y_{2}^{g}\right) \\ 100 | \large I=\left\{\begin{array}{cc} 101 | \large \left(x_{2}^{I}-x_{1}^{I}\right) *\left(y_{2}^{I}-y_{1}^{I}\right) & x_{2}^{I}>x_{1}^{I}, y_{2}^{I}>y_{1}^{I} \\ 102 | \large 0 & \text { otherwise } 103 | \large \end{array}\right. 104 | \large \end{aligned} 105 | $$ 106 | 107 | 4. 108 | 109 | $$ 110 | \large 找到课可以包含B^p,B^g最小的box,B^c: 111 | \large \begin{aligned} 112 | \large x_{1}^{c} &=\min \left(x_{1}^{p}, x_{1}^{g}\right), x_{2}^{c}=\max \left(x_{2}^{p}, x_{2}^{g}\right) \\ 113 | \large y_{1}^{c} &=\min \left(y_{1}^{p}, y_{1}^{g}\right), x_{2}^{c}=\max \left(y_{2}^{p}, y_{2}^{g}\right) 114 | \large \end{aligned} 115 | $$ 116 | 117 | 5. 118 | 119 | $$ 120 | \large 计算IOU,IOU = I / U = I / (A^P+A^g-I) 121 | $$ 122 | 123 | 6. 124 | 125 | $$ 126 | \large 计算GIOU, GIOU = IOU - (A^c - U) / A^c 127 | $$ 128 | 129 | 7. ​ 130 | $$ 131 | \large 计算GIOU Loss,L_{giou} = 1-GIOU 132 | $$ 133 | 134 | #### 优点 135 | - 预测值和 gt 不重叠时也可以优化 136 | - 可以辨别不同的对其方式 137 | 138 | #### 缺点 139 | - 收敛速度比较慢 140 | 141 | - Faster RCNN,MaskRCNN这种涨点少了些。猜测原因在于Faster RCNN,MaskRCNN本身的Anchor很多,出现完全无重合的情况比较少,这样GIOU和IOU Loss就无明显差别,所以提升不是太明显。 142 | 143 | - 网络容易选择学习扩大面积来减小loss,而不是移动box位置去覆盖gt,如下图所示,当box被gt覆盖时,不管怎么移动box,iou和Giou loss的值都不变。 144 | 145 |
146 | 147 |
148 | 149 | 150 | 151 | # DIOU Loss 152 | #### 公式 153 | 154 | $$ 155 | \large D I o U=\operatorname{IoU}-\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}}\\ 156 | \large b,b^{gt}分别代表预测宽和真实框的中心点,\rho表示欧式距离,c表示最小闭合曲线的欧式距离。\\ 157 | \large L_{DIou} = 1 - DIoU 158 | $$ 159 | 160 |
161 | 162 |
163 | 164 | #### 优点 165 | 1. 直接最小化预测框与目标框之间的归一化距离,以达到更快的收敛速度。 166 | 2. 使回归在与目标框有重叠甚至包含时更准确、更快。 167 | 3. 对于目标框包裹预测框的这种情况,DIoU Loss可以收敛的很快,而GIoU Loss此时退化为IoU Loss收敛速度较慢 168 | 169 | #### 缺点 170 | 没有考虑到形状差异 171 | 172 | 173 | # CIOU Loss 174 | #### 公式 175 | 176 | $$ 177 | \large D I o U=\operatorname{IoU}-\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}} + \alpha*v\\ 178 | \large \alpha=\frac{v}{(1-I o U)+v}\\ 179 | \large v=\frac{4}{\pi^{2}}\left(\arctan \frac{w^{g t}}{h^{g t}}-\arctan \frac{w}{h}\right)^{2} 180 | \large \alpha是个平衡参数,不参与梯度计算。 181 | $$ 182 | 183 | $$ 184 | \large 直接看括号里的arctan\frac{w}{h}根据反三角函数,就是矩形对角线的倾斜角度., 185 | \large 也就是反应预测框跟真实框的宽高比相似度。\\ 186 | \large \frac{4}{\pi^{2}}是一个归一化常数,arctan\frac{w}{h}的范围是\\ 187 | \large (0,\frac{\pi}{2}),平方后就是(0,\frac{\pi^{2}}{4}) 188 | $$ 189 | 190 | 191 | 192 | #### 优点 193 | - 可以在DIOU Loss基础上回归宽高比差异 -------------------------------------------------------------------------------- /loss篇/回归损失函数.md: -------------------------------------------------------------------------------- 1 | # L1 Loss 2 | #### 公式 3 | 4 |
5 | 6 |
7 | 8 | #### 优点 9 | 10 | 不论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,对离群点不敏感,具有较为稳健性的解。 11 | 12 | #### 缺点 13 | 在中心点是折点,不能求导,不方便求解。其导数为常数,导致训练后期,预测值与真是差异很小时,损失函数的导数绝对值仍然为1,而如果learning rate不变,损失函数将在稳定值附近波动,难以继续收敛达到更高精度 14 | 15 | 16 | # L2 Loss 17 | #### 公式 18 | 19 |
20 | 21 |
22 | 23 | #### 优点 24 | 25 | 各点都连续光滑,方便求导,而且梯度值也是动态变化的,能够快速的收敛,得到较为稳定的解 26 | 27 | #### 缺点 28 | 真实值和预测值的差值大于1时,会放大误差;而当差值小于1时,则会缩小误差,这是平方运算决定的。MSE对于较大的误差>1给予较大的惩罚,较小的误差<1给予较小的惩罚。也就是说,对离群点比较敏感,受其影响较大。所以训练初期,一旦出现预测值和真实值差异很大时,就很容易出现梯度爆炸。 29 | 30 | # SmoothL1 Loss 31 | #### 公式 32 | 33 |
34 | 35 |
36 | 37 | #### 优点 38 | 39 | 综合了L1和L2的优点,相比于L2损失函数,对离群点、异常值使用L1,梯度变化相对更小,训练时不容易跑飞。当预测值与真是差异很小时,使用L2损失,快速得到较为稳定的解。 40 | 41 | #### 缺点 42 | L1,L2 loss也有相同缺点,就是他们都是分别回归宽高和中心点,没有把box当成一个整体看待。 43 | 44 | # IOU Loss 45 | #### 公式 46 |
47 | 48 |
49 | 50 | 51 | 52 | #### 优点 53 | 如下图所示,L1 和 L2 的边界框 L1 和 L2 loss 是相同的,但是他们的 IOU 却相差很大: 54 | 55 |
56 | 57 |
58 | 59 | 如果宽高和中心点使用分别优化的话就会损失他们之间的相关性,实际上目标回归框之间存在相关性,并不是相互独立的,使用 IOU LOSS可以把回归框当成一个整体去优化,如上图最右边的回归情况最好,最左边的回归情况最差,但是它们的 LS Loss 确实相同的,所以不合理。 60 | 61 | #### 缺点 62 | - 预测值和 gt 不重叠,iou 始终为 0 且无法优化 63 | - IOU 无法辨别不同的对其方式,如下图所示,下图三个的iou都是一样的 64 | 65 |
66 | 67 |
68 | 69 | # GIOU LOSS 70 | 71 | #### 公式 72 |
73 | 74 |
75 |
76 | 77 |
78 | 79 | #### 优点 80 | - 预测值和 gt 不重叠时也可以优化 81 | - 可以辨别不同的对其方式 82 | 83 | #### 缺点 84 | - 收敛速度比较慢 85 | 86 | - Faster RCNN,MaskRCNN这种涨点少了些。猜测原因在于Faster RCNN,MaskRCNN本身的Anchor很多,出现完全无重合的情况比较少,这样GIOU和IOU Loss就无明显差别,所以提升不是太明显。 87 | 88 | - 网络容易选择学习扩大面积来减小loss,而不是移动box位置去覆盖gt,如下图所示,当box被gt覆盖时,不管怎么移动box,iou和Giou loss的值都不变。 89 | 90 |
91 | 92 |
93 | 94 | 95 | 96 | # DIOU Loss 97 | #### 公式 98 | 99 |
100 | 101 |
102 | 103 |
104 | 105 |
106 | 107 | 108 | #### 优点 109 | 1. 直接最小化预测框与目标框之间的归一化距离,以达到更快的收敛速度。 110 | 2. 使回归在与目标框有重叠甚至包含时更准确、更快。 111 | 3. 对于目标框包裹预测框的这种情况,DIoU Loss可以收敛的很快,而GIoU Loss此时退化为IoU Loss收敛速度较慢 112 | 113 | #### 缺点 114 | 没有考虑到形状差异 115 | 116 | 117 | # CIOU Loss 118 | #### 公式 119 | 120 |
121 | 122 |
123 | 124 | 125 | 126 | #### 优点 127 | - 可以在DIOU Loss基础上回归宽高比差异 -------------------------------------------------------------------------------- /优化篇/Batch-Normilize-DRC.md: -------------------------------------------------------------------------------- 1 | # BN 2 | 3 | ## 1.概述 4 | 5 | **深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。Internal Covariate Shift的存在使得上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低;网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度** 6 | 7 | 8 | 9 | ## 2.如何减缓Internal Covariate Shift 10 | 11 | ### 白化: 12 | 13 | - **白化(Whitening)是机器学习里面常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。白化是对输入数据分布进行变换,进而达到以下两个目的** 14 | 15 | 1. **使得输入特征分布具有相同的均值与方差。其中PCA白化保证了所有特征分布均值为0,方差为1;而ZCA白化则保证了所有特征分布均值为0,方差相同;** 16 | 17 | 2. **去除特征之间的相关性。** 18 | 19 | - 白化缺点: 20 | 1. **白化过程计算成本太高**; 21 | 2. **白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力。底层网络学习到的参数信息会被白化操作丢失掉。** 22 | 23 | ### BN: 24 | 25 | **白化计算过程比较复杂,BN就简化一点:** 26 | 27 | 1. **单独对每个特征进行normalizaiton,让每个特征都有均值为0,方差为1的分布;** 28 | 2. **既然白化操作减弱了网络中每一层输入数据表达能力,那就再加个线性变换操作,让这些数据再能够尽可能恢复本身的表达能力。** 29 | 30 | **BN优点:** 31 | 32 | - **BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度;** 33 | - **BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定;** 34 | - **BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题;** 35 | - **BN具有一定的正则化效果:在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。** 36 | 37 | 38 | 39 | 40 | 41 | ## 3.公式: 42 | 43 | $$ 44 | \tilde{x}= \frac{x- \mu }{ \sqrt{ \sigma ^{2}+ \varepsilon }}\\ 45 | \mu = \frac{1}{N} \sum _{i}^{N}x_{i} , \sigma ^{2}= \frac{1}{N} \sum _{i}^{N}(x_{i}- \mu )^{2} \\ 46 | N为batchsize,x_{i}为batch的每一个样本,在具体实现时\\(如果网络的输入是二维的图像),一般BN层的前面一层的卷积输出为(N,C,H,W),\\C,H,W分别为特征图的通道、宽、高。那么每一个样本可以表示为x_{c,i,j},\\BN实际上是对各个x_{c,i,j}分别进行归一化,因此计算得到的\mu 也相应的有C,H,W个。 47 | $$ 48 | 49 | **为了这些数据再能够尽可能恢复本身的表达能力,会另外学历两个参数** 50 | $$ 51 | y = \gamma \cdot \tilde{x} + \beta \\特别地,当\gamma^2 = \sigma^2,\beta = \mu时,以实现等价变换\\(identity transform)并且保留了原始输入特征的分布信息。 52 | $$ 53 | **测试阶段:测试阶段可能不是分batch测试的,并且在模型推断时常常只输入一个样本,那么就不能再计算测试阶段的batch的均值和方差,这就需要用到训练集的数据。训练时计算的均值和方差会不断累积下来,通过移动平均的方法来近似得到整个样本集的均值和方差。** 54 | $$ 55 | \tilde{ \mu }= \mu _{n}= \alpha \mu _{n-1}+(1- \alpha ) \cdot \frac{1}{N} \sum _{i}^{N}x_{i,n} \\ 56 | x_{i,n}表示第n的batch的一个样本,\mu_{n}表示第n个batch的均值,同理\sigma^2也可以同样得到。 57 | $$ 58 | 59 | 60 | 61 | 62 | ## 4.求导: 63 | 64 | $$ 65 | \frac{dl}{d\gamma} = \sum _{i}^{N}\frac{dl}{dy_{i}}\cdot \frac{dy_{i}}{d_{\gamma}}=\sum _{i}^{N}\frac{dl}{dy_{i}}\cdot \tilde{x_{i}}\\ 66 | \frac{dl}{d\beta} = \sum _{i}^{N}\frac{dl}{dy_{i}}\cdot \frac{dy_{i}}{d_{\beta}}=\sum _{i}^{N}\frac{dl}{dy_{i}}\\ 67 | \frac{dl}{dx_{i}}= 68 | \frac { \partial l } { \partial \tilde { x } _ { i } } \cdot \frac { \partial \tilde { x } _ { i } } { \partial x _ { i } } + \frac { \partial l } { \partial \sigma _ { B } ^ { 2 } } \cdot \frac { \partial \sigma _ { B } ^ { 2 } } { \partial x _ { i } } + \frac { \partial l } { \partial \mu _ { B } } \cdot \frac { \partial \mu _ { B } } { \partial x _ { i } }\\ 69 | 1.\frac { \partial l } { \partial \tilde { x } _ { i } } = \frac { \partial l } { \partial y _ { i } } \cdot \frac { \partial y _ { i } } { \partial \tilde { x } _ { i } } = \frac { \partial l } { \partial y _ { i } } \cdot \gamma\\ 70 | 2. \frac { \partial l } { \partial \sigma _ { B } ^ { 2 } } = \sum _ { i = 1 } ^ { m } \frac { \partial l } { \partial \tilde { x } _ { i } } \cdot \frac { \partial \tilde { x } _ { i } } { \partial \sigma _ { B } ^ { 2 } } = \sum _ { i = 1 } ^ { m } \frac { \partial l } { \partial \tilde { x } _ { i } } \cdot ( x _ { i } - \mu _ { B } ) \cdot \frac { - 1 } { 2 } ( \sigma _ { B } ^ { 2 } + \varepsilon ) ^ { - 3 / 2 }\\ 71 | 3. \frac { \partial l } { \partial \mu _ { B } } = \frac { \partial l } { \partial \sigma _ { B } ^ { 2 } } \cdot \frac { \partial \sigma _ { B } ^ { 2 } } { \partial \mu _ { B } } + \sum _ { i = 1 } ^ { m } \frac { \partial l } { \partial \tilde { x } _ { i } } \cdot \frac { \partial \tilde { x } _ { i } } { \partial \mu _ { B } }= \frac { \partial l } { \partial \sigma _ { B } ^ { 2 } } \cdot \frac { 1 } { m } \sum _ { i = 1 } ^ { m } - 2 ( x _ { i } - \mu _ { B } ) + \sum _ { i = 1 } ^ { m } \frac { \partial l } { \partial \tilde { x } _ { i } } \cdot \frac { - 1 } { \sqrt { \sigma _ { B } ^ { 2 } + \varepsilon } }\\ 72 | \frac{dl}{dx_{i}}= \frac { \partial l } { \partial \tilde { x } _ { i } } \cdot \frac { 1 } { \sqrt { \sigma _ { B } ^ { 2 } + \varepsilon } } + \frac { \partial l } { \partial \sigma _ { B } ^ { 2 } } \cdot \frac { 2 ( x _ { i } - \mu _ { B } ) } { m } + \frac { \partial l } { \partial \mu _ { B } } \cdot \frac { 1 } { m } 73 | $$ 74 | 75 | -------------------------------------------------------------------------------- /优化篇/Batch-Normilize.md: -------------------------------------------------------------------------------- 1 | # BN 2 | 3 | ## 1.概述 4 | 5 | **深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。Internal Covariate Shift的存在使得上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低;网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度** 6 | 7 | 8 | 9 | ## 2.如何减缓Internal Covariate Shift 10 | 11 | ### 白化: 12 | 13 | - **白化(Whitening)是机器学习里面常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。白化是对输入数据分布进行变换,进而达到以下两个目的** 14 | 15 | 1. **使得输入特征分布具有相同的均值与方差。其中PCA白化保证了所有特征分布均值为0,方差为1;而ZCA白化则保证了所有特征分布均值为0,方差相同;** 16 | 17 | 2. **去除特征之间的相关性。** 18 | 19 | - 白化缺点: 20 | 1. **白化过程计算成本太高**; 21 | 2. **白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力。底层网络学习到的参数信息会被白化操作丢失掉。** 22 | 23 | ### BN: 24 | 25 | **白化计算过程比较复杂,BN就简化一点:** 26 | 27 | 1. **单独对每个特征进行normalizaiton,让每个特征都有均值为0,方差为1的分布;** 28 | 2. **既然白化操作减弱了网络中每一层输入数据表达能力,那就再加个线性变换操作,让这些数据再能够尽可能恢复本身的表达能力。** 29 | 30 | **BN优点:** 31 | 32 | - **BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度;** 33 | - **BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定;** 34 | - **BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题;** 35 | - **BN具有一定的正则化效果:在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。** 36 | 37 | 38 | 39 | 40 | 41 | ## 3.公式: 42 | 43 |
44 | 45 |
46 | 47 | **为了这些数据再能够尽可能恢复本身的表达能力,会另外学历两个参数** 48 | 49 |
50 | 52 | 53 | **测试阶段:测试阶段可能不是分batch测试的,并且在模型推断时常常只输入一个样本,那么就不能再计算测试阶段的batch的均值和方差,这就需要用到训练集的数据。训练时计算的均值和方差会不断累积下来,通过移动平均的方法来近似得到整个样本集的均值和方差。** 54 | 55 |
56 | 58 | 59 | 60 | 61 | 62 | 63 | ## 4.求导: 64 | 65 |
66 | 67 |
68 | 69 | -------------------------------------------------------------------------------- /优化篇/优化器-scr.md: -------------------------------------------------------------------------------- 1 | # 优化器 2 | 3 | ## 概述: 4 | 5 | **优化器在DL中起着灯塔的作用,指引参数往正确的方向更新,一个好的优化器能够使模型收敛速度加快,跳出局部最优,训练过程平稳等** 6 | 7 | 8 | 9 | ## 定义: 10 | 11 | $$ 12 | \Large 1.待优化参数:w\\ 13 | \Large 2.迭代次数: t\\ 14 | \Large 3.一阶动量:m _ { t } = \phi ( g _ { 1 } , g _ { 2 } , \cdots , g _ { t } )\\ 15 | \Large 4.二阶动量:V _ { t } = \psi ( g _ { 1 } , g _ { 2 } , \cdots , g _ { t } )\\ 16 | \Large 5.当前时刻下降梯度: \Delta w_{t}= -\alpha \cdot m_{t}/ \sqrt{V_{t}} \\ 17 | \Large 6.根据下降梯度参数进行更新: w_{t+1}=w_{t} + \Delta w_{t} 18 | $$ 19 | 20 | 21 | 22 | ## SGD 23 | 24 | $$ 25 | \Large SGD算法没有动量的概率,一阶动量m_{t} = g_{t};二阶动量V_{t} = I^2;\\ 26 | \Large \Delta w_{t} = -\alpha * g_{t}\\ 27 | \Large w_{t+1} = w_{t} + \Delta w_{t} 28 | $$ 29 | 30 | 31 | 32 | #### 优点: 33 | 34 | - **SGD法由于每次仅仅采用mini-batch来迭代,计算速度很快。** 35 | 36 | #### 缺点: 37 | 38 | - **下降速度慢,训练容易震荡** 39 | - **可能陷入局部最优点** 40 | 41 | 42 | 43 | # SGDM:SGD with Nesterov Moment 44 | 45 | **为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性即历史时刻的梯度信息。** 46 | $$ 47 | \Large m_{t} = \beta_{1} * m_{t-1} + (1-\beta_{1}) * g_{t}\\ 48 | \Large \Delta w_{t} = -\alpha*m_{t}\\ 49 | \Large w_{t+1} = w_{t} + \Delta w_{t}\\ 50 | \Large 例如:\\ 51 | \Large m_{1} = \beta_{0}*m_{0}+(1-\beta_{1})*g_{1},m_{0}=0\\ 52 | \Large m_{1} = (1-\beta_{1})*g_{1}\\ 53 | \Large m_2 = \beta_{1}*m_{1}+(1-\beta_{1})*g_{1}=\beta_{1}*((1-\beta_{1})*g_{1}) + (1-\beta_{1})*g_{2}\\ 54 | \Large m_3 = \beta_{1}*m_{2}+(1-\beta_{1})*g_{3} = \beta_{1}*(\beta_{1}*((1-\beta_{1})*g_{1}) + (1-\beta_{1})*g_{2})+(1-\beta_{1})*g_{3}\\ 55 | \Large 从上式可以看出离当前时刻越远的惯性,它对当前时刻的m_{t}影响呈指数衰减。只有越近时刻的惯性对当前时刻的m_{t}影响越大。 56 | $$ 57 | 58 | #### 优点: 59 | 60 | - **动量的存在使得 SGD 算法在训练的过程中更加的稳定。** 61 | 62 | #### 缺点: 63 | 64 | - **没有解决SGD容易陷入局部最优的问题** 65 | 66 | 67 | 68 | # NAG:SGD with Nesterov Acceleration 69 | 70 | **SGD 还有一个问题是困在局部最优的沟壑里面震荡。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。 NAG全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于定义1。我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。因此,NAG在步骤1,不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:** 71 | $$ 72 | \Large g_{t}= \nabla f( \omega _{t}- \alpha \cdot m_{t-1}) \\ 73 | \Large m_{t} = \beta_{1} * m_{t-1} + (1-\beta_{1}) * g_{t}\\ 74 | \Large \Delta w_{t} = -\alpha*m_{t}\\ 75 | \Large w_{t+1} = w_{t} + \Delta w_{t} 76 | $$ 77 | 78 | #### 优点: 79 | 80 | - **收敛快** 81 | - **在一定程度上解决了陷入局部最优的问题** 82 | 83 | #### 缺点: 84 | 85 | - **学习率未自适应** 86 | 87 | 88 | 89 | # AdaGrad 90 | 91 | **此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。** 92 | $$ 93 | \Large 二阶动量就是迄今为止该维度上所有梯度的和 \\ 94 | \Large V_{t}= \sum _{ \tau =1}^{t}g_{ \tau }^{2} \\ 95 | \Large m_{t} = g_{t} (这时还没用到一阶动量)\\ 96 | \Large \Delta w_{t} = -\alpha*m_{t} / \sqrt{V_{t}} \\ 97 | \Large w_{t+1} = w_{t} + \Delta w_{t}\\ 98 | \Large 从上式可以看出实际上学习率\alpha变成了\alpha / \sqrt{V_{t}},\\ 99 | \Large 一般为了避免分母为0,会在分母上加一个小的平滑项。 100 | \Large 所以参数更新的越频繁\Large \sqrt{V_{t}}就越大,\Delta w_{t}就变化越小。 101 | $$ 102 | 103 | #### 优点: 104 | 105 | - **引入二阶动量可以对不同参数进行不同速度的改变,达到自适应学习率的目的** 106 | 107 | #### 缺点: 108 | 109 | - **由于二阶动量是单调递增的,所以会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。** 110 | 111 | 112 | 113 | # AdaDelta / RMSProp 114 | 115 | **由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。修改的思路很简单。前面我们讲到,指数移动平均值大约就是过去一段时间的平均值,因此我们用这一方法来计算二阶累积动量:** 116 | $$ 117 | \Large V_{t}= \beta _{2}*V_{t-1}+(1- \beta _{2})g_{t}^{2} \\ 118 | \Large m_{t} = g_{t} (这时还没用到一阶动量)\\ 119 | \Large \Delta w_{t} = -\alpha*m_{t} / \sqrt{V_{t}} \\ 120 | \Large w_{t+1} = w_{t} + \Delta w_{t}\\ 121 | $$ 122 | 123 | #### 优点: 124 | 125 | - **使用加权平均使得学习率不会单调递减至0,可以加快收敛速度。** 126 | 127 | 128 | 129 | # Adam 130 | 131 | **Adam和Nadam的出现就很自然而然了——它们是前述方法的集大成者。我们看到,SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。** 132 | $$ 133 | \Large m_{t}= \beta _{1} \cdot m_{t-1}+(1- \beta _{1}) \cdot g_{t} \\ 134 | 135 | \Large V _ { t } = \beta _ { 2 } * V _ { t - 1 } + ( 1 - \beta _ { 2 } ) g _ { t } ^ { 2 } \\ 136 | 137 | \Large \Delta w_{t} = -\alpha*m_{t} / \sqrt{V_{t}} \\ 138 | 139 | \Large w_{t+1} = w_{t} + \Delta w_{t}\\ 140 | 141 | \Large \beta_{1}一般取0.9,\beta_{2}一般取0.999初始化的时候m_{0} = 0,V_{0}=0,所以在训练初期m_{t},V_{t}都会接近0,因此我们常常\\ 142 | \Large 根据下式进行误差修正:\tilde { m } _ { t } = m _ { t } / ( 1 - \beta _ { 1 } ^ { t } )tilde{V}_{t}=V_{t}/(1- \beta _{2}^{t}) 143 | $$ 144 | 145 | 146 | # Nadam 147 | 148 | **Adam是集大成者,但它居然遗漏了Nesterov, Nadam就是加上了Nesterov按照NAG的步骤1:** 149 | $$ 150 | \Large g _ { t } = \nabla f ( w _ { t } - \alpha \cdot m _ { t - 1 } / \sqrt { V _ { t } } )\\ 151 | \Large m_{t}= \beta _{1} \cdot m_{t-1}+(1- \beta _{1}) \cdot g_{t} \\ 152 | 153 | \Large V _ { t } = \beta _ { 2 } * V _ { t - 1 } + ( 1 - \beta _ { 2 } ) g _ { t } ^ { 2 } \\ 154 | 155 | \Large \Delta w_{t} = -\alpha*m_{t} / \sqrt{V_{t}} \\ 156 | 157 | \Large w_{t+1} = w_{t} + \Delta w_{t}\\ 158 | $$ -------------------------------------------------------------------------------- /优化篇/优化器.md: -------------------------------------------------------------------------------- 1 | # 优化器 2 | 3 | ## 概述: 4 | 5 | **优化器在DL中起着灯塔的作用,指引参数往正确的方向更新,一个好的优化器能够使模型收敛速度加快,跳出局部最优,训练过程平稳等** 6 | 7 | 8 | 9 | ## 定义: 10 | 11 |
12 | 13 |
14 | 15 | 16 | 17 | ## SGD 18 | 19 |
20 | 21 |
22 | 23 | 24 | 25 | #### 优点: 26 | 27 | - **SGD法由于每次仅仅采用mini-batch来迭代,计算速度很快。** 28 | 29 | #### 缺点: 30 | 31 | - **下降速度慢,训练容易震荡** 32 | - **可能陷入局部最优点** 33 | 34 | 35 | 36 | # SGDM:SGD with Nesterov Moment 37 | 38 | **为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性即历史时刻的梯度信息。** 39 | 40 |
41 | 42 |
43 | 44 | #### 优点: 45 | 46 | - **动量的存在使得 SGD 算法在训练的过程中更加的稳定。** 47 | 48 | #### 缺点: 49 | 50 | - **没有解决SGD容易陷入局部最优的问题** 51 | 52 | 53 | 54 | # NAG:SGD with Nesterov Acceleration 55 | 56 | **SGD 还有一个问题是困在局部最优的沟壑里面震荡。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。 NAG全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于定义1。我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。因此,NAG在步骤1,不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:** 57 | 58 |
59 | 60 |
61 | 62 | #### 优点: 63 | 64 | - **收敛快** 65 | - **在一定程度上解决了陷入局部最优的问题** 66 | 67 | #### 缺点: 68 | 69 | - **学习率未自适应** 70 | 71 | 72 | 73 | # AdaGrad 74 | 75 | **此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。** 76 | 77 |
78 | 79 |
80 | 81 | #### 优点: 82 | 83 | - **引入二阶动量可以对不同参数进行不同速度的改变,达到自适应学习率的目的** 84 | 85 | #### 缺点: 86 | 87 | - **由于二阶动量是单调递增的,所以会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。** 88 | 89 | 90 | 91 | # AdaDelta / RMSProp 92 | 93 | **由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。修改的思路很简单。前面我们讲到,指数移动平均值大约就是过去一段时间的平均值,因此我们用这一方法来计算二阶累积动量:** 94 | 95 |
96 | 97 |
98 | 99 | #### 优点: 100 | 101 | - **使用加权平均使得学习率不会单调递减至0,可以加快收敛速度。** 102 | 103 | 104 | 105 | # Adam 106 | 107 | **Adam和Nadam的出现就很自然而然了——它们是前述方法的集大成者。我们看到,SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。** 108 | 109 |
110 | 111 |
112 | 113 | 114 | # Nadam 115 | 116 | **Adam是集大成者,但它居然遗漏了Nesterov, Nadam就是加上了Nesterov按照NAG的步骤1:** 117 | 118 |
119 | 120 |
-------------------------------------------------------------------------------- /优化篇/正则项-SRC.md: -------------------------------------------------------------------------------- 1 | # 机器学习中的正则项 2 | 3 | ## 概述: 4 | 5 | **在机器学习或深度学习过程中,我们的目的是学习一个模型或则函数*f*,使得代价函数*L*在训练集中最小。这就涉及到一个问题,由于损失函数只考虑在训练集上的最小值,称之为经验风险最小化,由于训练集当中噪声的存在,冗余的特征可能成为过拟合的一种来源。这是因为,对于噪声,模型无法从有效特征当中提取信息进行拟合,故而会转向冗余特征。** 6 | 7 |
8 | 9 |
10 | 11 | **如上图最右边所示,函数为了拟合噪声产生的冗余特征,引入了额外的参数使模型出现了过拟合现象。为了对抗过拟合,我们需要向损失函数中加入描述模型复杂程度的正则项将经验风险最小化问题转化为结构风险最小化。正则化是结构风险最小化策略的实 现,是在经验风险上加一个正则化项或罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。比如,正则化项可以是模型参数向量的范数。** 12 | 13 | ## 正则项: 14 | 15 | 模型选择如下式子所示: 16 | $$ 17 | f^* = \min _ { f \in F } \frac { 1 } { N } \sum _ { i = 1 } ^ { N } L ( y _ { i } , f ( x _ { i } ) ) + \lambda J ( f )\\ 18 | x_{i},y_{i}分别是训练样本的特征的标签,特征可以是D维的即x_{i} = [{x_{i}^{1},x_{i}^{2},...,x_{i}^{D}}],N为训练样本的个数,深度学习中一般为mini-batch的大小,\\L是损失函数,f是模型由D个参数构成:W=[{w^{1},w^{2},...,w^{D}}],J是正则项,\lambda是常数。 19 | $$ 20 | 21 | #### L0正则项: 22 | 23 | $$ 24 | f^* = \min _ { f \in F } \frac { 1 } { N } \sum _ { i = 1 } ^ { N } L ( y _ { i } , f ( x _ { i } ) ) + \lambda ||W||_{0}\\ 25 | 通过引入L0正则,实际上是向优化过程引入了一种惩罚机制:当优化算法希望增加模型复杂度(此处特指将原来为零的参数更新为非零的情形)\\以降低模型的经验风险(即降低全局损失)时,在结构风险上进行大小为\lambda||W||_{0}的的惩罚,当增加模型复杂度在经验风险上的收益不足时整个结\\构风险实际上会增大而非减小。因此优化算法会拒绝此类更新。 26 | $$ 27 | 28 | 29 | 30 | **引入L0正则项会使模型更加稀疏,以及使得模型易于解释,但L0正则项也有无法避免的问题:非连续、非凸、不可微。因此,在引入L0正则项的目标函数无法在方向传播中进行优化。** 31 | 32 | 33 | 34 | #### L1正则项目: 35 | 36 | $$ 37 | f^* = \min _ { f \in F } \frac { 1 } { N } \sum _ { i = 1 } ^ { N } L ( y _ { i } , f ( x _ { i } ) ) + \lambda ||W||_{1}\\ 38 | 通过引入L0正则项类似,引入L1正则项是在结构风险上进行大小为\lambda|W|的惩罚,以达到稀疏化的目的。 39 | $$ 40 | 41 | #### L2正则项目: 42 | 43 | **L1正则项能够到达抗过拟合并使参数空间更稀疏,但是L1正则项是不连续的,所以在参数空间内不可求导,所以引入L2正则项:** 44 | $$ 45 | f^* = \min _ { f \in F } \frac { 1 } { N } \sum _ { i = 1 } ^ { N } L ( y _ { i } , f ( x _ { i } ) ) + \lambda ||W||_{2}\\ 46 | $$ 47 | 48 | #### L1正则与L2正则对比: 49 | 50 | - **L1正则鲁棒性更强,对异常值更不敏感**。 51 | 52 | - **L2正则较L1正则运算更方变** 53 | 54 | - **L1正则比L2正则更容易稀疏:** 55 | $$ 56 | \frac{dL_{1}}{dw}=sign(w)\\ 57 | \frac{dL_{2}}{dw}=w 58 | $$ 59 | 60 | 61 |
62 | 63 |
64 | 65 |
66 | 67 |
68 | 69 | ​ **于是会发现,在梯度更新时,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。** 70 | 71 | ​ **而看 L2 的话,就会发现它的梯度会越靠近0,就变得越小。也就是说加了 L1 正则的话基本上经过一定步数后很可能变为0,** 72 | 73 | ​ **而 L2 几乎不可能,因为在值小的时候其梯度也会变小。于是也就造成了 L1 输出稀疏的特性。** -------------------------------------------------------------------------------- /优化篇/正则项.md: -------------------------------------------------------------------------------- 1 | # 机器学习中的正则项 2 | 3 | ## 概述: 4 | 5 | **在机器学习或深度学习过程中,我们的目的是学习一个模型或则函数*f*,使得代价函数*L*在训练集中最小。这就涉及到一个问题,由于损失函数只考虑在训练集上的最小值,称之为经验风险最小化,由于训练集当中噪声的存在,冗余的特征可能成为过拟合的一种来源。这是因为,对于噪声,模型无法从有效特征当中提取信息进行拟合,故而会转向冗余特征。** 6 | 7 |
8 | 9 |
10 | 11 | **如上图最右边所示,函数为了拟合噪声产生的冗余特征,引入了额外的参数使模型出现了过拟合现象。为了对抗过拟合,我们需要向损失函数中加入描述模型复杂程度的正则项将经验风险最小化问题转化为结构风险最小化。正则化是结构风险最小化策略的实 现,是在经验风险上加一个正则化项或罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。比如,正则化项可以是模型参数向量的范数。** 12 | 13 | ## 正则项: 14 | 15 | 模型选择如下式子所示: 16 | 17 |
18 | 19 |
20 | 21 | #### L0正则项: 22 | 23 |
24 | 25 |
26 | 27 | 28 | 29 | **引入L0正则项会使模型更加稀疏,以及使得模型易于解释,但L0正则项也有无法避免的问题:非连续、非凸、不可微。因此,在引入L0正则项的目标函数无法在方向传播中进行优化。** 30 | 31 | 32 | 33 | #### L1正则项目: 34 | 35 |
36 | 37 |
38 | 39 | #### L2正则项目: 40 | 41 | **L1正则项能够到达抗过拟合并使参数空间更稀疏,但是L1正则项是不连续的,所以在参数空间内不可求导,所以引入L2正则项:** 42 | 43 |
44 | 45 |
46 | 47 | #### L1正则与L2正则对比: 48 | 49 | - **L1正则鲁棒性更强,对异常值更不敏感**。 50 | 51 | - **L2正则较L1正则运算更方变** 52 | 53 | - **L1正则比L2正则更容易稀疏:** 54 | 55 |
56 | 57 |
58 | 59 |
60 | 61 |
62 | 63 |
64 | 65 |
66 | 67 | ​ **于是会发现,在梯度更新时,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。** 68 | 69 | ​ **而看 L2 的话,就会发现它的梯度会越靠近0,就变得越小。也就是说加了 L1 正则的话基本上经过一定步数后很可能变为0,** 70 | 71 | ​ **而 L2 几乎不可能,因为在值小的时候其梯度也会变小。于是也就造成了 L1 输出稀疏的特性。** -------------------------------------------------------------------------------- /优化篇/激活函数-SRC.md: -------------------------------------------------------------------------------- 1 | # 激活函数 2 | 3 | ## 概述 4 | 5 | **激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。** 6 | 7 | 8 | 9 | ## 1.Sigmoid激活函数 10 | 11 | $$ 12 | \large \sigma (x)= \frac{1}{1+e^{-x}} \\ 13 | \large \sigma^, (x) = \sigma (x)*(1 - \sigma (x)) 14 | $$ 15 | 16 |
17 | 18 |
19 | 20 | #### 优点: 21 | 22 | - **平滑,处处可导数** 23 | - **求导容易** 24 | - **能够把输入的连续实值变换为0和1之间的输出** 25 | 26 | #### 缺点: 27 | 28 | - **非0均值,会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入, 改变了数据的分布,收敛速度变慢。** 29 | - **容易梯度爆炸或消失** 30 | - **存在梯度饱和区** 31 | 32 | $$ 33 | \large \left\{\begin{array}{l} 34 | \large y_{1} = w_{1} * x_{1} \\ 35 | \large z_{1} = \sigma(y_{1}) \\ 36 | \large y_{2} = z_{1}*w_{2} \\ 37 | \large z_{2} = \sigma(y_{2}) \\ 38 | \large y_{out} = z_{2}*w_{3} 39 | \large \end{array}\right. \\ 40 | \large 损失函数L_{loss}=||y_{out} - y_{truth}||^2 \\ 41 | \large \frac{dL_{loss}}{dw_{1}}=\frac{dL_{loss}}{dy_{out}}*\frac{dy_{out}}{dz_{2}} 42 | \large *\frac{dz_{2}}{dy_{2}}*\frac{dy_{2}}{dz_{1}}*\frac{dz_{1}}{dy_{1}}*\frac{dy_{1}}{dw_{1}}\\ 43 | \large \frac{dL_{loss}}{dw_{1}}=||y_{out} - y_{truth}||*w_{3}*\sigma^,(y_{2})* 44 | \large w_{2}*\sigma^,(y_{1})*x_{1}\\ 45 | \large 由于\sigma^,(x)在[0.0.25]之间,所以当初始化参数在[0,4]之间的时候,\\ 46 | \large 会发生梯度消失,参数初始化在[4,~]的时候会发生梯度爆炸。 47 | $$ 48 | 49 | - **指数操作比较耗时。** 50 | 51 | 52 | 53 | ## 2.tanh函数 54 | 55 | **tanh为双曲正切函数。tanh和 sigmoid 相似,都属于饱和激活函数,区别在于输出值范围由 (0,1) 变为了 (-1,1),可以把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。** 56 | $$ 57 | \large \tanh(x)= \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} \\ 58 | \large \tanh(x)= \frac{2}{1+e^{-2x}}-1 59 | $$ 60 | **从公式中,可以更加清晰看出tanh与sigmoid函数的关系(平移+拉伸)。** 61 | 62 |
63 | 64 |
65 | 66 | #### 优点: 67 | 68 | - **平滑,处处可导数** 69 | - **求导容易** 70 | - **能够把输入的连续实值变换为0和1之间的输出** 71 | - **是0均值的,不会改变数据分布** 72 | 73 | #### 缺点: 74 | 75 | - **幂运算的问题仍然存在;** 76 | - **tanh导数范围在(0, 1)之间,相比sigmoid的(0, 0.25),梯度消失(gradient vanishing)问题会得到缓解,但仍然还会存在。** 77 | - **同样存在梯度饱和区** 78 | 79 | 80 | 81 | ## 3.ReLU函数 82 | 83 | **relu(Rectified Linear Unit)——修正线性单元函数:该函数形式比较简单** 84 | $$ 85 | \large relu(x) = max(0,x) 86 | $$ 87 | 88 |
89 | 90 |
91 | 92 | #### 优点: 93 | 94 | - **ReLU将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征**。 95 | - **解决了梯度消失问题,收敛速度快于Sigmoid和tanh函数** 96 | - **计算速度快** 97 | - **使网络变得更加稀疏** 98 | 99 | 100 | 101 | #### 缺点: 102 | 103 | - **ReLU函数在0出不可导** 104 | 105 | - **还是存在梯度爆炸的问题** 106 | 107 | - **ReLU 强制将x<0部分的输出置为0(置为0就是屏蔽该特征),可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于‘dead’状态,所以使用ReLU的网络,学习率不能设置太大。** 108 | 109 | - **非0均值** 110 | 111 | 112 | 113 | ## 4.Leaky ReLU, PReLU(Parametric Relu), RReLU(Random ReLU)函数 114 | 115 | ### 1.Leaky ReLU 116 | 117 | $$ 118 | \large Leaky Relu(x) = \left\{\begin{array}{l} x,x>0 \\ 119 | \large \alpha * x, x < 0 120 | \large \end{array}\right. 121 | $$ 122 | 123 |
124 | 125 |
126 | 127 | #### 优点: 128 | 129 | - **LeakyReLU的提出就是为了解决神经元”死亡“问题,LeakyReLU与ReLU很相似,仅在输入小于0的部分有差别,ReLU输入小于0的部分值都为0,而LeakyReLU输入小于0的部分,值为负,且有微小的梯度。** 130 | 131 | #### 缺点: 132 | 133 | - **少了Relu的稀疏性** 134 | 135 | #### 2.ReLU 136 | 137 | ***PRelu*(参数化修正线性单元)中的作为一个可学习的参数,会在训练的过程中进行更新。** 138 | 139 | #### 3.RReLU 140 | 141 | ***RReLU*,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。** 142 | 143 | 144 | 145 | ## 5.ELU 函数 146 | 147 | $$ 148 | \LARGE ELU(x) = \left\{\begin{array}{l} x,x>0 \\ 149 | \alpha * (e^x-1), x < 0 150 | \end{array}\right. 151 | $$ 152 | 153 |
154 | 155 |
156 | 157 | #### 优点: 158 | 159 | - **解决RELU非0均值,输出的分布是零均值的,可以加快训练速度。** 160 | 161 | - **解决LeakyReLU单侧不饱和,ELU是单侧饱和的,可以更好的收敛。** 162 | 163 | #### 缺点 164 | 165 | - **计算复杂** 166 | - **在0处不可导** -------------------------------------------------------------------------------- /优化篇/激活函数.md: -------------------------------------------------------------------------------- 1 | # 激活函数 2 | 3 | ## 概述 4 | 5 | **激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。** 6 | 7 | 8 | 9 | ## 1.Sigmoid激活函数 10 | 11 |
12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 | #### 优点: 20 | 21 | - **平滑,处处可导数** 22 | - **求导容易** 23 | - **能够把输入的连续实值变换为0和1之间的输出** 24 | 25 | #### 缺点: 26 | 27 | - **非0均值,会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入, 改变了数据的分布,收敛速度变慢。** 28 | 29 | - **容易梯度爆炸或消失** 30 | 31 | - **存在梯度饱和区** 32 | 33 |
34 | 35 |
36 | 37 | - **指数操作比较耗时。** 38 | 39 | 40 | 41 | ## 2.tanh函数 42 | 43 | **tanh为双曲正切函数。tanh和 sigmoid 相似,都属于饱和激活函数,区别在于输出值范围由 (0,1) 变为了 (-1,1),可以把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。** 44 | 45 |
46 | 47 |
48 | 49 | **从公式中,可以更加清晰看出tanh与sigmoid函数的关系(平移+拉伸)。** 50 | 51 |
52 | 53 |
54 | 55 | #### 优点: 56 | 57 | - **平滑,处处可导数** 58 | - **求导容易** 59 | - **能够把输入的连续实值变换为0和1之间的输出** 60 | - **是0均值的,不会改变数据分布** 61 | 62 | #### 缺点: 63 | 64 | - **幂运算的问题仍然存在;** 65 | - **tanh导数范围在(0, 1)之间,相比sigmoid的(0, 0.25),梯度消失(gradient vanishing)问题会得到缓解,但仍然还会存在。** 66 | - **同样存在梯度饱和区** 67 | 68 | 69 | 70 | ## 3.ReLU函数 71 | 72 | **relu(Rectified Linear Unit)——修正线性单元函数:该函数形式比较简单** 73 | 74 |
75 | 76 |
77 | 78 |
79 | 80 |
81 | 82 | #### 优点: 83 | 84 | - **ReLU将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征**。 85 | - **解决了梯度消失问题,收敛速度快于Sigmoid和tanh函数** 86 | - **计算速度快** 87 | - **使网络变得更加稀疏** 88 | 89 | 90 | 91 | #### 缺点: 92 | 93 | - **ReLU函数在0出不可导** 94 | 95 | - **还是存在梯度爆炸的问题** 96 | 97 | - **ReLU 强制将x<0部分的输出置为0(置为0就是屏蔽该特征),可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于‘dead’状态,所以使用ReLU的网络,学习率不能设置太大。** 98 | 99 | - **非0均值** 100 | 101 | 102 | 103 | ## 4.Leaky ReLU, PReLU(Parametric Relu), RReLU(Random ReLU)函数 104 | 105 | ### 1.Leaky ReLU 106 | 107 |
108 | 109 |
110 | 111 |
112 | 113 |
114 | 115 | #### 优点: 116 | 117 | - **LeakyReLU的提出就是为了解决神经元”死亡“问题,LeakyReLU与ReLU很相似,仅在输入小于0的部分有差别,ReLU输入小于0的部分值都为0,而LeakyReLU输入小于0的部分,值为负,且有微小的梯度。** 118 | 119 | #### 缺点: 120 | 121 | - **少了Relu的稀疏性** 122 | 123 | #### 2.ReLU 124 | 125 | ***PRelu*(参数化修正线性单元)中的作为一个可学习的参数,会在训练的过程中进行更新。** 126 | 127 | #### 3.RReLU 128 | 129 | ***RReLU*,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。** 130 | 131 | 132 | 133 | ## 5.ELU 函数 134 | 135 |
136 | 137 |
138 | 139 |
140 | 141 |
142 | 143 | #### 优点: 144 | 145 | - **解决RELU非0均值,输出的分布是零均值的,可以加快训练速度。** 146 | 147 | - **解决LeakyReLU单侧不饱和,ELU是单侧饱和的,可以更好的收敛。** 148 | 149 | #### 缺点 150 | 151 | - **计算复杂** 152 | - **在0处不可导** -------------------------------------------------------------------------------- /分割篇/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /分割篇/实例分割/Hybrid Task Cascade for Instance Segmentation.md: -------------------------------------------------------------------------------- 1 | # **Hybrid Task Cascade for Instance Segmentation** 2 | 3 | ## 1.概述 4 | 5 | **Hybrid Task Cascade for Instance Segmentation在cascade mask rcnn基础上进行改进,充分利用detection与segmentation的联系,使得detection与segmentation由之前的并行学习改为串行学习,让segmentation能够学习到detection信息,同时也添加语义分割模块辅助训练进一步提升网路性能。** 6 | 7 | **paper link:https://arxiv.org/pdf/1901.07518.pdf** 8 | 9 | **code link: https://github.com/open-mmlab/mmdetection** 10 | 11 |
12 | . 13 |
14 | 15 | ​ **图1** 16 | 17 | ## 2.具体实现 18 | 19 | ### 2.1 提出背景 20 | 21 | **cascade rcnn证明通过级联的方式确实能够提升网络的性能,参看[cascade rcnn](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/two-stage/Cascade-RCNN.md),所以提出了cascade mask rcnn,但是cascade mask-rcnn存在如下问题:** 22 | 23 | - **图1(a)所示,cascade Mask R-CNN的每一级的mask分支与bbox分支是并行训练的,也就是说两个分支没有进行相互作用,mask分支没有从bbox学到任何信息。** 24 | - **各级mask分支之间没有进行相互作用,互相独立,这不利于网络性能提升。** 25 | 26 | **Cascade Mask R-CNN公式如下式所示:** 27 | $$ 28 | \large \begin{aligned} 29 | \mathbf{x}_{t}^{b o x} &=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t-1}\right), & \mathbf{r}_{t}=B_{t}\left(\mathbf{x}_{t}^{b o x}\right) \\ 30 | \mathbf{x}_{t}^{\text {mask }} &=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t-1}\right), & \mathbf{m}_{t}=M_{t}\left(\mathbf{x}_{t}^{\text {mask }}\right) 31 | \end{aligned} \\ 32 | \large x为backbone输出的特征,x_t^{box},x_t^{mask}分别表示roi经过x后通过roi pooling得到的box和mask特征。\\ 33 | \large r_t和m_t分别代表预测的box和mask,B_t,M_t代表box和mask的head。 34 | $$ 35 | 36 | ### **2.2解决方案** 37 | 38 | - **针对2.1的第一个问题,提出了图1(b)的结构,每一级的mask特征都由这一级的box提供,而不是上一级。** 39 | $$ 40 | \large \begin{array}{ll} 41 | \mathbf{x}_{t}^{b o x}=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t-1}\right), & \mathbf{r}_{t}=B_{t}\left(\mathbf{x}_{t}^{b o x}\right) \\ 42 | \mathbf{x}_{t}^{\text {mask }}=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t}\right), & \mathbf{m}_{t}=M_{t}\left(\mathbf{x}_{t}^{m a s k}\right) 43 | \end{array} 44 | $$ 45 | 46 | - **针对2.1中问题2,提出了图1(c)的结构,不同级的mask特征进行融合** 47 | $$ 48 | \large \begin{array}{ll} 49 | \mathbf{x}_{t}^{b o x}=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t-1}\right), & \mathbf{r}_{t}=B_{t}\left(\mathbf{x}_{t}^{b o x}\right) \\ 50 | \mathbf{x}_{t}^{\text {mask }}=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t}\right), & \mathbf{m}_{t}=M_{t}\left(\mathcal{F}\left(\mathbf{x}_{t}^{\text {mask }}, \mathbf{m}_{t-1}^{-}\right)\right) 51 | \end{array}\\ 52 | \large \mathcal{F}\left(\mathbf{x}_{t}^{\text {mask }}, \mathbf{m}_{t-1}\right)=\mathbf{x}_{t}^{m a s k}+\mathcal{G}_{t}\left(\mathbf{m}_{t-1}^{-}\right)\\ 53 | \large \mathcal{G}_{t}是1*1的卷积层 54 | $$ 55 | 56 | 57 | **其中**: 58 | $$ 59 | \large \begin{aligned} 60 | \mathbf{m}_{1}^{-} &=M_{1}^{-}\left(\mathbf{x}_{t}^{\text {mask }}\right) \\ 61 | \mathbf{m}_{2}^{-} &=M_{2}^{-}\left(\mathcal{F}\left(\mathbf{x}_{t}^{\text {mask }}, \mathbf{m}_{1}^{-}\right)\right) \\ 62 | & \vdots \\ 63 | \mathbf{m}_{t-1}^{-} &=M_{t}^{-}\left(\mathcal{F}\left(\mathbf{x}_{t}^{\text {mask }}, \mathbf{m}_{t-2}^{-}\right)\right) 64 | \end{aligned}\\ 65 | \large M_t^{-}代表mask-head,M_{t}的特征转换单元,由4个连续的3*3卷积组成,转换特征m_{t-1}^{-}\\ 66 | \large 再接一个1*1的卷积为了维度对齐。 67 | $$ 68 | 69 |
70 | . 71 |
72 | 73 | ​ 图2 74 | 75 | - **在上面基础上添加一个语义分割部分辅助训练,语义分割部分能够提供一个全局的空间上下文信息,帮助区分正负样本,如图1(d)所示。** 76 | 77 | $$ 78 | \large \begin{aligned} 79 | \mathbf{x}_{t}^{b o x} &=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t-1}\right)+\mathcal{P}\left(S(\mathbf{x}), \mathbf{r}_{t-1}\right) \\ 80 | \mathbf{r}_{t} &=B_{t}\left(\mathbf{x}_{t}^{b o x}\right) \\ 81 | \mathbf{x}_{t}^{\text {mask }} &=\mathcal{P}\left(\mathbf{x}, \mathbf{r}_{t}\right)+\mathcal{P}\left(S(\mathbf{x}), \mathbf{r}_{t}\right) \\ 82 | \mathbf{m}_{t} &=M_{t}\left(\mathcal{F}\left(\mathbf{x}_{t}^{\text {mask }}, \mathbf{m}_{t-1}^{-}\right)\right) 83 | \end{aligned} 84 | $$ 85 | 86 | **语义分割S由特征由FPN组成,如下图所示:** 87 | 88 |
89 | . 90 |
91 | 92 | ​ 图3 93 | 94 | ## 3.总结 95 | 96 | **Hybrid Task Cascade for Instance Segmentation最指的学习的地方应该是其对网路设计的思路,通过分析baseline(cascade mask-rcnn)再结合其它论文(cascade rcnn)的有点来改进网路,再在其基础上进行改进,这种网络设计的思路可以指导我们以后自己设计网络。Segmentation和detection本来就是一个相辅相成的东西,让它们相互作用是一个非常棒的idea,可以互相学习。** 97 | 98 | -------------------------------------------------------------------------------- /分割篇/实例分割/InstaBoost-SRC.md: -------------------------------------------------------------------------------- 1 | # ****InstaBoost**** 2 | 3 | ## 1.概述 4 | 5 | **InstaBoost是一种数据增广方式,用在示例分割和目标检测上。通过把实例crop出来再随机放置在图像背景区域来达到数据增广提升检测精度的目的。** 6 | 7 | ## 2.具体实现 8 | 9 | ### 2.1 随机InstaBoost 10 | 11 | **随机InstaBoost主要是通过随机仿射变化把crop出的实例随机安放在目标周围,仿射变换的公式如下:** 12 | $$ 13 | \large \mathbf{H}=\left[\begin{array}{ccc} 14 | s \cos r & s \sin r & t_{x} \\ 15 | -s \sin r & s \cos r & t_{y} \\ 16 | 0 & 0 & 1 17 | \end{array}\right]\\ 18 | \large 其中t_{x},t_{y}表示平移量,s表示缩放量,r表示旋转量。通过\left\{t_{x},t_{y},s,r\right\}4维空间可以定义一个目标自然出现频率的模型\\ 19 | \large 定义一个概率密度函数f(.)测量把目标O放置在图像I中的合理性: 20 | \large P(x,y,s,r|I,O) = f(t_{x},t_{y},s,r|I,O),x = x_{0} + t_{x},y = y_{0}+t_{y}\\ 21 | \large 在\left\{x_{0},y_{0},1,0\right\}的概率应该为最大值(这个比较好理解,目标不动当然概率密度函数在这个点的值最大),\\ 22 | \large argmaxP(x,y,s,r)=(x_{0},y_{0},1,0)\\ 23 | \large 按常理分析,在\left\{x_{0},y_{0},1,0\right\}处的一个小的区域,概率图P(x,y,s,r|I,O)应该有一个较大响应,\\ 24 | \large 那么InstaBoost则通过在目标\left\{x_{0},y_{0},1,0\right\}处的一个小的区域范围内随机采样,最后通过仿射矩阵\mathbf{H}把目标移动到相应区域。 25 | $$ 26 | **随机InstaBoost这样做比较直观好理解,但是也有一个明显的短板就是实例只能在原周围区域进行变换。为了补充这个短板作者又提出了** **Appearance consistency heatmap guided InstaBoost来接触只能在目标周围区域变换的限制。** 27 | 28 | 29 | 30 | ### 2.2 Appearance consistency heatmap guided InstaBoost 31 | 32 | **appearance consistency heatmap是用来评估在任意位置(x0,y0)转换到(x,y)的RGB空间相似性。** 33 | $$ 34 | \large 通过把上式的概率密度函数f(.)分成3个独立的条件概率分布f_{x,y}(,),f_{s}(.),f_{r}(.),则\\ 35 | P(x,y,s,r)=f_{xy}(t_{x},t_{y}|s,r)f_{s}(s|r)f_{r}(r)\\ 36 | \quad \large =f_{xy}(t_{x},t_{y})f_{s}(s)f_{r}(r)\\ 37 | \large Appearance\quad consistency\quad heatmap \quad M(x, y)=E[P(x, y)] \propto f_{x y}\left(t_{x}, t_{y}\right) 38 | $$ 39 | 40 | 41 | **上式定义了appearance consistency heatmap,接下来详细讲解一下appearance consistency heatmap,它主要由三部分组成:** 42 | 43 | - **Appearance descriptor** 44 | 45 | **为了测量目标在原来位置与pasted位置的相似度,首先需要定义一个目标邻近区域背景编码后的描述子,它基于如下直觉:随着距离的增加,实例在appearance consistency中对周围环境的影响越小。定义一个appearance描述算子:** 46 | $$ 47 | \large \mathcal D(c_{x},c_{y}) = \left\{(C_{i}(c_{x},c_{y}),w_{i})|i\in\left\{1,2,3\right\}\right\}\\ 48 | \large C_{i}表示轮廓区域i带权重w_{i},给定一个实例中心(c_{x},x_{y}),i=1表示最里面的轮廓区域\\ 49 | \large w_{1}>w_{2}>w_{3} 50 | $$ 51 | 52 | 53 | - **Appearance distance** 54 | 55 | **Appearance distance是用来测量一对appearance描述算子之间的距离:** 56 | $$ 57 | \large d\left(\mathcal{D}_{1}, \mathcal{D}_{2}\right)=\sum_{i=1}^{3} \sum_{\left(x_{1}, y_{1}\right) \in \mathcal{C}_{1 i} \atop\left(x_{2}, y_{2}\right) \in \mathcal{C}_{2 i}} w_{i} \Delta\left(I_{1}\left(x_{1}, y_{1}\right), I_{2}\left(x_{2}, y_{2}\right)\right)\\ 58 | \large I_{k}(x,y)表示在图像k位置(x,y)处的RGB值,\Delta表示距离,一般用欧式距离。 59 | $$ 60 | 61 | 62 | 63 | - **Heatmap generation** 64 | $$ 65 | \large 目标原位置的appearance描述子\mathcal D_{0},图像中所有其它位置的\mathcal {D},Appearance distances通过如下方式进行归一化:\\ 66 | \large h(x) = -log(\frac{x-m}{M-m})\\ 67 | \large M = max(d(\mathcal D,\mathcal D_{0})),m = min(d(\mathcal D,\mathcal D_{0}))\\ 68 | \large HeatmapH通过在背景区域的所有位置像素和原实例点(x_{0},y_{0})处的归一化距离h(.)求得,x是(x_{0},y_{0})处RGB的值,\\它上面公式感觉少了一个\large RGB的求和项,如果按照公式来那么这个值肯定是单通道的。 69 | $$ 70 | 71 | ## 补充 72 | 73 | - 图像matting 74 | 75 | 在将图片前景和背景按照标注进行分离的过程中,如果完全按照标注去切割前景,前景的边界处会呈不自然的多边形锯齿状,这与 COCO 数据标注方式有关。为了解决这一问题,研究者使用《A global sampling method for alpha matting》一文中提出的方法对前景轮廓做 matting 处理,以得到与物体轮廓契合的边界。 76 | 77 | - 图像inpainting 78 | 79 | 在前景背景分离后,背景上会存在若干个空白区域,这些区域可以使用 inpainting 算法进行填补。论文中使用了《Navier-stokes, fluid dynamics, and image and videoinpainting》文章中提出的 inpainting 算法。 80 | 81 |
82 | . 83 |
84 | 85 | ## 感想 86 | 87 | **InstaBoost这种增广思路在之前就有,目标检测用的比较多。作者通过建模找出合适的pasted位置,总体精度能提升2个点左右,还是蛮有效的。但是从它公式来看要遍历所以背景区域像素点,还有做log运算计算量可想而知,当然作者最后通过resize图像到一个小的分辨率做运算再resize回来,确实能减少不少时间,但是感觉计算量还是不老少。** -------------------------------------------------------------------------------- /分割篇/实例分割/InstaBoost.md: -------------------------------------------------------------------------------- 1 | # ****InstaBoost**** 2 | 3 | ## 1.概述 4 | 5 | **InstaBoost是一种数据增广方式,用在示例分割和目标检测上。通过把实例crop出来再随机放置在图像背景区域来达到数据增广提升检测精度的目的。** 6 | 7 | ## 2.具体实现 8 | 9 | ### 2.1 随机InstaBoost 10 | 11 | **随机InstaBoost主要是通过随机仿射变化把crop出的实例随机安放在目标周围,仿射变换的公式如下:** 12 |
13 | . 14 |
15 | 16 | **随机InstaBoost这样做比较直观好理解,但是也有一个明显的短板就是实例只能在原周围区域进行变换。为了补充这个短板作者又提出了** **Appearance consistency heatmap guided InstaBoost来接触只能在目标周围区域变换的限制。** 17 | 18 | 19 | 20 | ### 2.2 Appearance consistency heatmap guided InstaBoost 21 | 22 | **appearance consistency heatmap是用来评估在任意位置(x0,y0)转换到(x,y)的RGB空间相似性。** 23 | 24 |
25 | . 26 |
27 | 28 | 29 | **上式定义了appearance consistency heatmap,接下来详细讲解一下appearance consistency heatmap,它主要由三部分组成:** 30 | 31 | - **Appearance descriptor** 32 | 33 | **为了测量目标在原来位置与pasted位置的相似度,首先需要定义一个目标邻近区域背景编码后的描述子,它基于如下直觉:随着距离的增加,实例在appearance consistency中对周围环境的影响越小。定义一个appearance描述算子:** 34 | 35 |
36 | . 37 |
38 | 39 | 40 | 41 | - **Appearance distance** 42 | 43 | **Appearance distance是用来测量一对appearance描述算子之间的距离:** 44 | 45 |
46 | . 47 |
48 | 49 | - **Heatmap generation** 50 | 51 |
52 | . 53 |
54 | 55 | ## 补充 56 | 57 | - 图像matting 58 | 59 | 在将图片前景和背景按照标注进行分离的过程中,如果完全按照标注去切割前景,前景的边界处会呈不自然的多边形锯齿状,这与 COCO 数据标注方式有关。为了解决这一问题,研究者使用《A global sampling method for alpha matting》一文中提出的方法对前景轮廓做 matting 处理,以得到与物体轮廓契合的边界。 60 | 61 | - 图像inpainting 62 | 63 | 在前景背景分离后,背景上会存在若干个空白区域,这些区域可以使用 inpainting 算法进行填补。论文中使用了《Navier-stokes, fluid dynamics, and image and videoinpainting》文章中提出的 inpainting 算法。 64 | 65 |
66 | . 67 |
68 | 69 | ## 感想 70 | 71 | **InstaBoost这种增广思路在之前就有,目标检测用的比较多。作者通过建模找出合适的pasted位置,总体精度能提升2个点左右,还是蛮有效的。但是从它公式来看要遍历所以背景区域像素点,还有做log运算计算量可想而知,当然作者最后通过resize图像到一个小的分辨率做运算再resize回来,确实能减少不少时间,但是感觉计算量还是不老少。** -------------------------------------------------------------------------------- /分割篇/实例分割/Mask-Scoring-R-CNN.md: -------------------------------------------------------------------------------- 1 | # **Mask Scoring R-CNN** 2 | 3 | ## 1.概述 4 | 5 | **Mask Scoring R-CNN是在Mask R-CNN基础上添加MaskIOU分支增加分类准确性。** 6 | 7 | **paper link:https://arxiv.org/abs/1903.00241** 8 | 9 | **code link:https://github.com/zjhuang22/maskscoring_rcnn** 10 | 11 | ## 2.具体实现 12 | 13 | ### 2.1 网络结构 14 | 15 |
16 | . 17 |
18 | 19 | **可以看出mask scoring rcnn是在mask rcnn的基础上添加了一个MaskIOU分支** 20 | 21 | ### 2.2 训练阶段 22 | 23 | - **RPN阶段产生proposal** 24 | - **RCNN分支训练过程** 25 | - **mask rcnn训练过程** 26 | - **获取目标的预测mask,然后二值化** 27 | - **计算二值化mask与gt mask的l2 loss** 28 | 29 | ### 2.3 前向阶段 30 | 31 | - **maskiou head的输出直接与rcnn分支的类别输出相乘作为最终的分类得分** 32 | 33 | 34 | 35 | ## 3.总结 36 | 37 | **Mask Scoring R-CNN这篇文章总体来说中规中矩,没有什么特别的地方,添加一个额外的分支辅助训练,最终效果有一定的提升,但是我认为maskiou部分用二值化mask去做回归可能会导致网络训练过程不易收敛。** -------------------------------------------------------------------------------- /分割篇/实例分割/mask-rcnn.md: -------------------------------------------------------------------------------- 1 | # **Mask R-CNN** 2 | 3 | ## 1.概述 4 | 5 | **Mask R-CNN是在faster RCNN基础上添加mask分支,同时提出ROI-Align来消除ROI-Pooling的量化误差,并添加FPN结构大大提升效果。** 6 | 7 | **paper link:https://arxiv.org/pdf/1703.06870.pdf** 8 | 9 | **code link:https://github.com/facebookresearch/Detectron** 10 | 11 | ## 2.具体实现 12 | 13 | ### 2.1 网络结构 14 | 15 | - **backbone采用resnet系列** 16 | - **neck部分采用FPN+RPN** 17 | - **head为faster-rcnn的分类和回归head+rpn后面接mask head** 18 | 19 |
20 | . 21 |
22 | 23 | ### 2.2 mask branch细节 24 | 25 | **mask分支通过对RPN阶段生成的ROI通过ROI-Align操作生成m*m大小的proposal,再把这些prorosal通过卷积成K(类别数)个维度** 26 | 27 | 28 | 29 | ### 2.3 ROI Align 30 | 31 | **roi-align是争对roi-pooling提出,roi-pooling会产生两次量化误差:** 32 | 33 | - **第一次是bbox在特征图位置的量化误差,例如图片大小为(225,225),特征图16倍下采样,那么坐标(x,y)在特征图为位置为(x * 16 / 255, y * 16 / 255),坐标会向下取整。** 34 | 35 | - **第二次是roi-pooling的时候会把bbox划分为n*n个bin,如下图所示,一个宽高为(7,5)大小的bbox,分成2 * 2大小的bin,由于不能整除,会按下图向上取整和向下取整的方式去划分:** 36 | 37 |
38 | . 39 |
40 | 41 | **由于两次量化误差的存在随着下采样倍数的提升,误差偏差会变得非常大,如果是分类这类问题对位置信息不是很敏感可能体现的不是很明显,但是检测和分割这类问题对位置信息很敏感就会严重影响效果。因此提出了roi-align** 42 | 43 | **roi align就是也是利用roi pooling的思想,但是不进行量化取整,如下图所示:** 44 | 45 |
46 | . 47 |
48 | 49 | - **在每个bin里面选取n个点(对应上图右边每个bin 4个蓝色的点)** 50 | - **然后再通过双线性插值求得这4个点的值** 51 | - **通过对n个bin里面的数值进行max pooling or avg pooling** 52 | 53 | 54 | 55 | ### 2.4 mask traget选取 56 | 57 | **在训练过程中mask target为roi与groud truth的交集,即只选取roi里面的mask的ground truth作为训练target。** 58 | 59 | 60 | 61 | ### 2.5 Inference 62 | 63 | **inference的时候不同于训练时仅用rpn部分产生的proposal经过mask分支,而是通过faster-rcnn最终输出的检测框作为mask分支的输入。最后仅选取类别分支输出的指定类别那一维度的mask。** 64 | 65 | 66 | 67 | 68 | 69 | ## 3.感想 70 | 71 | **看mask rcnn这篇论文的时间比较晚,虽然现在有各种花式网络各种新的技巧出现也丝毫不能影响mask rcnn在实例分割中的地位,添加mask分支、采用fpn、提出roi align,该文章的工作非常扎实实用,这种端对端的多任务学习也会在一定程度上对检测效果带来提升。** -------------------------------------------------------------------------------- /分割篇/实例分割/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /分割篇/语义分割/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /分类篇/长尾效应/Bilateral-Branch Network with Cumulative Learning.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Bilateral-Branch Network with Cumulative Learning-1 4 | 5 | ## 1.概述 6 | 7 | **这篇文章针对分类问题中的长尾效应设计了一个双分支网络,两份分支共享权重,但是输入的数据的分布相反。** 8 | 9 |
10 | . 11 |
12 | 13 | 14 | ## 2.具体实现 15 | 16 | **如上图所示两个分支的结构是一样的权重共享,输入不一样,上面一个分支的输入是原始数据分布,下面一个分支的输入是原始分布的reverse版。其中通过一个变量a来控制两个分支的权重。** 17 | 18 |
19 | . 20 |
21 | 22 | **a是根据训练阶段来动态改变的,具体公式如下:** 23 | 24 |
25 | . 26 |
27 | 28 | -------------------------------------------------------------------------------- /分类篇/长尾效应/DECOUPLING REPRESENTATION AND CLASSIFIER SRC - 副本.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # DECOUPLING REPRESENTATION AND CLASSIFIER 4 | 5 | ## 1.概述 6 | 7 | **目标分类过程中的长尾效应是一个很常见的问题,这篇文章通过试验发现类别较多的类特征权重值要大一些,类别较少的特征权重值要小一些。基于以上发现作责提出了一种特征归一化的方式来解决长尾效应问题。** 8 | 9 |
10 | . 11 |
12 | 13 | ## 2.具体实现 14 | 15 | **常见的长尾效应解决方案有:** 16 | 17 | - **class-balancing strategies** 18 | - **loss re-weighting** 19 | - **data re-sampling** 20 | - **transfer learning** 21 | 22 | **Decoupling在上面基础上分为两步来解决长尾效应:** 23 | 24 | 1. **在长尾数据上训练一个分类模型,然后再fix住backbone,再利用Class-balanced sampling finetune 分类head,也可以利用渐近训练的方式,类别j的采样概率如下式所示:** 25 | $$ 26 | \large p_{j}^{\mathrm{PB}}(t)=\left(1-\frac{t}{T}\right) \large p_{j}^{\mathrm{IB}}+\frac{t}{T} p_{j}^{\mathrm{CB}}, \\ 27 | \large t为当前epoch,T为总epoch,p_{j}^{IB}为instance-balance采样概率,p_{j}^{CB}\\ 28 | \large 为class-balance采样策略 29 | $$ 30 | 31 | 32 | **采样公式为:** 33 | $$ 34 | \large p_{j}=\frac{n_{j}^{q}}{\sum_{i=1}^{C} n_{i}^{q}}\\ 35 | \large n_{j}^{q}为类别j的个数,C为类别数,q为参数, 36 | instance-sample时,q取1,class-sample时,q取0 37 | $$ 38 | 39 | 2. 权重归一化 40 | 41 | 根据上图左半部分可以看到,样本数越多的类别权重会大一些,这样会使样本多的内别响应更大一些,样本数越小的类别权重会小一些。通过如下式进行权重归一化: 42 | $$ 43 | \large \widetilde{w_{i}}=\frac{w_{i}}{\left\|w_{i}\right\|^{\tau}} 44 | $$ 45 | 46 | 47 | -------------------------------------------------------------------------------- /分类篇/长尾效应/DECOUPLING REPRESENTATION AND CLASSIFIER.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # DECOUPLING REPRESENTATION AND CLASSIFIER 4 | 5 | ## 1.概述 6 | 7 | **目标分类过程中的长尾效应是一个很常见的问题,这篇文章通过试验发现类别较多的类特征权重值要大一些,类别较少的特征权重值要小一些。基于以上发现作责提出了一种特征归一化的方式来解决长尾效应问题。** 8 | 9 |
10 | . 11 |
12 | 13 | ## 2.具体实现 14 | 15 | **常见的长尾效应解决方案有:** 16 | 17 | - **class-balancing strategies** 18 | - **loss re-weighting** 19 | - **data re-sampling** 20 | - **transfer learning** 21 | 22 |
23 | . 24 |
-------------------------------------------------------------------------------- /分类篇/长尾效应/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /多任务篇/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /多任务篇/yolop.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # You Only Look Once for Panoptic Driving Perception 4 | 5 | ## 1.概述 6 | 7 | **yolop是一个多任务学习框架,包含目标检测和车道线道路分割。** 8 | 9 |
10 | . 11 |
12 | 13 | 14 | 15 | **图1** 16 | 17 | ## 2.具体实现 18 | 19 | ### 2.1. Bckbone: 20 | 21 | **Yolop的backbone为CSPDarknet** 22 | 23 | 24 | 25 | ### 2.2. Neck: 26 | 27 | **yolop的neck部分为FPN+SPP** 28 | 29 | 30 | 31 | ### 2.3. Head: 32 | 33 | #### 2.3.1 Detection Head 34 | 35 | **Detection Head与yolo4一样,添加了PANet module** 36 | 37 | #### 2.3.2 Segment Head 38 | 39 | **Segment Head是在FPN8倍下采样层基础上上采样至输入分辨率,输出两通道** 40 | 41 | 42 | 43 | ### 2.4 Loss 44 | 45 | #### 2.4.1 Det Loss 46 | 47 | **detection loss分为如下几部分** 48 | 49 | - **class loss 采用focal loss** 50 | - **obj loss采用focal loss** 51 | - **box loss采用CIOU loss** 52 | 53 | #### 2.4.2 Segment loss 54 | 55 | **segment loss采用ce loss + iou loss** 56 | 57 | 58 | 59 | ## 3.总结 60 | 61 | **yolop属于一个组合式的论文整体没有什么创新,一个典型的多任务学习范式,应该很多人都尝试过这种方法,可能别人是在retinanet、efficientdet等基础上进行多任务学习。工程属性还是很强的,看试验结果在Jetson TX2上运行时间可以达到24ms/fps(没找到输入是多大)** 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/EfficientDet-SRC.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # EfficientDet 4 | 5 | ## 1.概述 6 | 7 | **EfficientDet主要从FPN的结构出发,分析了不同种类的FPN网络结构,提出BIFPN的网络结构在提高检测精度的同时也能提升检测速度。作者观察到 PANet 的效果比 FPN ,NAS-FPN 要好,就是计算量更大;作者从 PANet 出发:** 8 | 9 | - **移除掉了只有一个输入的节点。这样做是假设只有一个输入的节点相对不太重要。这样把 PANet 简化。** 10 | - **在相同 level 的输入和输出节点之间连了一条边,假设是能融合更多特征,有点 skip-connection 的意味**。 11 | - **PANet 只有从底向上连,自顶向下两条路径,作者认为这种连法可以作为一个基础层,重复多次。** 12 | 13 |
14 | . 15 |
16 | 17 | 18 | **图1** 19 | 20 | ## 2.具体实现 21 | 22 | ### 2.1. Bckbone: 23 | 24 | **EfficientDet的主干网络为EfficientNet,EfficientNet的网络性能如下图所示:** 25 | 26 | 27 | 28 |
29 | . 30 |
31 | 32 | 33 | **图2** 34 | 35 | ### 2.2. Neck: 36 | 37 | **EfficientDet的Neck部分为BIFPN,BIFPN的机构如图1(d)所示,多层BIFPN的网路结构如下图所示:** 38 | 39 |
40 | . 41 |
42 | 43 | 图3 44 | $$ 45 | \large BIFPN名称双向特征金字塔,主要思想是学习一个可学的标量 w_{i} 来加权每一个FPN层,作者认为不同输入对应的FPN层重要程度不一样。\\ 46 | \large 如果对每一个FPN分支仅学习一个权重,那么这个权重是不可控的(比如极大或则极小),\\ 47 | \large 导致学习过程不可控。一个自然的想法是用softmax归一化,但是softmax函数很耗时,\\ 48 | \large 所以用了如下结构替换:\\ 49 | \large O=\sum_{i} \frac{w_{i}}{\epsilon+\sum_{j} w_{j}} \cdot I_{i} 50 | \large I_{i}为特征图 51 | $$ 52 | **以P6特征为例。BIFPN的表达式如下**: 53 | $$ 54 | \begin{aligned} 55 | \large P_{6}^{t d} &=\operatorname{Con} v\left(\frac{w_{1} \cdot P_{6}^{i n}+w_{2} \cdot \operatorname{Resize}\left(P_{7}^{i n}\right)}{w_{1}+w_{2}+\epsilon}\right) \\ 56 | \large P_{6}^{\text {out }} &=\operatorname{Conv}\left(\frac{w_{1}^{\prime} \cdot P_{6}^{i n}+w_{2}^{\prime} \cdot P_{6}^{t d}+w_{3}^{\prime} \cdot \text { Resize }\left(P_{5}^{\text {out }}\right)}{w_{1}^{\prime}+w_{2}^{\prime}+w_{3}^{\prime}+\epsilon}\right) 57 | \end{aligned}\\ 58 | \large P_{6}^{t d}是P_{6}的中间特征。 59 | $$ 60 | 61 | $$ 62 | \large BIFPN宽度: W_{bifpn}=64*(1.35^φ),φ表示Efficient的深度(D0,D1,D2...D7).\\ 63 | \large BIFPN深度: D_{bifpn}=3+φ \\ 64 | \large Box/class prediction network宽度:W_{pred} = W_{bifpn}.\\ 65 | \large Box/class prediction network深度:D_{\text {box }}=D_{\text {class }}=3+\lfloor\phi / 3\rfloor 66 | $$ 67 | 68 | ``` 69 | # Weight 70 | self.p6_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 71 | self.p6_w1_relu = nn.ReLU() 72 | self.p5_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 73 | self.p5_w1_relu = nn.ReLU() 74 | self.p4_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 75 | self.p4_w1_relu = nn.ReLU() 76 | self.p3_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 77 | self.p3_w1_relu = nn.ReLU() 78 | 79 | self.p4_w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True) 80 | self.p4_w2_relu = nn.ReLU() 81 | self.p5_w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True) 82 | self.p5_w2_relu = nn.ReLU() 83 | self.p6_w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True) 84 | self.p6_w2_relu = nn.ReLU() 85 | self.p7_w2 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 86 | self.p7_w2_relu = nn.ReLU() 87 | 88 | self.attention = attention 89 | 90 | 91 | P7_0 -------------------------> P7_2 --------> 92 | |-------------| ↑ 93 | ↓ | 94 | P6_0 ---------> P6_1 ---------> P6_2 --------> 95 | |-------------|--------------↑ ↑ 96 | ↓ | 97 | P5_0 ---------> P5_1 ---------> P5_2 --------> 98 | |-------------|--------------↑ ↑ 99 | ↓ | 100 | P4_0 ---------> P4_1 ---------> P4_2 --------> 101 | |-------------|--------------↑ ↑ 102 | |--------------↓ | 103 | P3_0 -------------------------> P3_2 --------> 104 | """ 105 | ``` 106 | 107 | 108 | 109 | ### 2.3. Head: 110 | 111 | **EfficientDet的Head部分跟RetinaNet一样分为cls和reg两部分,如图3所示** 112 | 113 | 114 | 115 | ### 2.4. Sample Assignment: 116 | 117 | **EfficientDet的Sample Assignment跟RetinaNet方式一样,t把iou < 0.4作为负样本, > 0.5作为正样本,其余为难例忽略。** 118 | 119 | 120 | 121 | ### 2.5. Anchor生成 122 | 123 | **EfficientDet的anchor生成跟RetinaNet一样:** 124 | 125 | - **ratios:[0.5,1,2]** 126 | - **scales:[[2^0, 2^(1.0 / 3.0), 2^(2.0 / 3.0)]]** 127 | 128 | 129 | 130 | ### 2.6. Decode部分: 131 | 132 | **EfficientDet decode部分跟[ssd decode部分一样](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/SSD.md)** 133 | 134 | 135 | 136 | ### 2.7. LOSS部分: 137 | 138 | **retinanet把iou < 0.4作为负样本, > 0.5作为正样本,其余为难例忽略,分类loss用focal loss,回归loss用smooth-L1 loss。分类loss计算代码。** 139 | 140 | **focal loss部分会在分类loss部分单独总结。** 141 | 142 | 143 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/EfficientDet.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # EfficientDet 4 | 5 | ## 1.概述 6 | 7 | **EfficientDet主要从FPN的结构出发,分析了不同种类的FPN网络结构,提出BIFPN的网络结构在提高检测精度的同时也能提升检测速度。作者观察到 PANet 的效果比 FPN ,NAS-FPN 要好,就是计算量更大;作者从 PANet 出发:** 8 | 9 | - **移除掉了只有一个输入的节点。这样做是假设只有一个输入的节点相对不太重要。这样把 PANet 简化。** 10 | - **在相同 level 的输入和输出节点之间连了一条边,假设是能融合更多特征,有点 skip-connection 的意味**。 11 | - **PANet 只有从底向上连,自顶向下两条路径,作者认为这种连法可以作为一个基础层,重复多次。** 12 | 13 |
14 | . 15 |
16 | 17 | 18 | **图1** 19 | 20 | ## 2.具体实现 21 | 22 | ### 2.1. Bckbone: 23 | 24 | **EfficientDet的主干网络为EfficientNet,EfficientNet的网络性能如下图所示:** 25 | 26 | 27 | 28 |
29 | . 30 |
31 | 32 | 33 | **图2** 34 | 35 | ### 2.2. Neck: 36 | 37 | **EfficientDet的Neck部分为BIFPN,BIFPN的机构如图1(d)所示,多层BIFPN的网路结构如下图所示:** 38 | 39 |
40 | . 41 |
42 | 43 | 图3 44 | 45 | 46 | 47 | **以P6特征为例。BIFPN的表达式如下**: 48 | 49 |
50 | . 51 |
52 | 53 |
54 | . 55 |
56 | 57 | ``` 58 | # Weight 59 | self.p6_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 60 | self.p6_w1_relu = nn.ReLU() 61 | self.p5_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 62 | self.p5_w1_relu = nn.ReLU() 63 | self.p4_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 64 | self.p4_w1_relu = nn.ReLU() 65 | self.p3_w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 66 | self.p3_w1_relu = nn.ReLU() 67 | 68 | self.p4_w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True) 69 | self.p4_w2_relu = nn.ReLU() 70 | self.p5_w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True) 71 | self.p5_w2_relu = nn.ReLU() 72 | self.p6_w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True) 73 | self.p6_w2_relu = nn.ReLU() 74 | self.p7_w2 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) 75 | self.p7_w2_relu = nn.ReLU() 76 | 77 | self.attention = attention 78 | 79 | 80 | P7_0 -------------------------> P7_2 --------> 81 | |-------------| ↑ 82 | ↓ | 83 | P6_0 ---------> P6_1 ---------> P6_2 --------> 84 | |-------------|--------------↑ ↑ 85 | ↓ | 86 | P5_0 ---------> P5_1 ---------> P5_2 --------> 87 | |-------------|--------------↑ ↑ 88 | ↓ | 89 | P4_0 ---------> P4_1 ---------> P4_2 --------> 90 | |-------------|--------------↑ ↑ 91 | |--------------↓ | 92 | P3_0 -------------------------> P3_2 --------> 93 | """ 94 | ``` 95 | 96 | 97 | 98 | ### 2.3. Head: 99 | 100 | **EfficientDet的Head部分跟RetinaNet一样分为cls和reg两部分,如图3所示** 101 | 102 | 103 | 104 | ### 2.4. Sample Assignment: 105 | 106 | **EfficientDet的Sample Assignment跟RetinaNet方式一样,把iou < 0.4作为负样本, > 0.5作为正样本,其余为难例忽略。** 107 | 108 | 109 | 110 | ### 2.5. Anchor生成 111 | 112 | **EfficientDet的anchor生成跟RetinaNet一样:** 113 | 114 | - **ratios:[0.5,1,2]** 115 | - **scales:[[2^0, 2^(1.0 / 3.0), 2^(2.0 / 3.0)]]** 116 | 117 | 118 | 119 | ### 2.6. Decode部分: 120 | 121 | **EfficientDet decode部分跟[ssd decode部分一样](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/SSD.md)** 122 | 123 | 124 | 125 | ### 2.7. LOSS部分: 126 | 127 | **retinanet把iou < 0.4作为负样本, > 0.5作为正样本,其余为难例忽略,分类loss用focal loss,回归loss用smooth-L1 loss。分类loss计算代码。** 128 | 129 | **focal loss部分会在分类loss部分单独总结。** 130 | 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/GHM-SRC.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # **Gradient Harmonized Single-stage Detector** 4 | 5 | ## 1.概述 6 | 7 | **Gradient Harmonized Single-stage Detector分析了一阶段目标检测器样本不均问题,认为大量简单的背景占领了整了训练过程,同时对比了OHEM和Focal Loss,认为OHEM直接放弃那些简单样本,这样效率是很低的;同时Focal Loss需要tune两个参数,并且Focal Loss是一个静态loss,不能适应数据的动态分布。作者提出l gradient harmonizing mechanism(GHM)--梯度协调机制,动态改变个样本梯度,降低简单样本和极难例的样本梯度,增加medium样本的梯度。** 8 | 9 |
10 | . 11 |
12 | 13 | 14 | ​ **图1** 15 | 16 | ## 2.具体实现 17 | 18 | ### 2.1 问题描述 19 | 20 | **ce loss为:** 21 | $$ 22 | \large L_{CE}(p,p^{*})= \begin{cases} - \log (p)ifp^{*}=1 \\\\ - \log (1-p)ifp^{*}=0 \end{cases}\\ 23 | \large p \in \left[ 0,1 \right] 为预测概率,这里p = sigmoid(x),p ^ { * } \in \{ 0,1 \} 为ground-truth, 24 | $$ 25 | 26 | 27 | **求导为:** 28 | $$ 29 | \large L_{C E}\left(p, p^{*}\right)= \begin{cases}-\log (p) & \text { if } p^{*}=1 \\ -\log (1-p) & \text { if } p^{*}=0\end{cases} 30 | $$ 31 | 32 | 33 | $$ 34 | \large g=\left|p-p^{*}\right|= \begin{cases}1-p & \text { if } p^{*}=1 \\ p & \text { if } p^{*}=0\end{cases} 35 | $$ 36 | ***g* 为梯度的L1 范数,代表该样本该样本的贡献大小。** 37 | 38 |
39 | . 40 |
41 | 42 | **如上图所示,为了更加清楚显示坐标轴经过log函数,可以看出大量easy-sample贡献了绝大部分梯度,还有一部分very-hard-sample贡献比较多的梯度,这些very-hard-sample可能是一些异常值,如果收敛模型被迫学习那些异常值可能对其它例子的分类不那么准确。为此提出了Gradient Density的概念** 43 | 44 | 45 | 46 | ### 2.2 Gradient Density 47 | 48 | $$ 49 | \large G D ( g ) = \frac { 1 } { l _ { \epsilon } ( g ) } \sum _ { k = 1 } ^ { N } \delta _ { \epsilon } ( g _ { k } , g )\\ 50 | \large g_k表示第k个样本的梯度,N表示样本的个数 51 | $$ 52 | 53 | $$ 54 | \begin{aligned} 55 | &\delta_{\epsilon}(x, y)= \begin{cases}1 & \text { if } y-\frac{\epsilon}{2}<=x 77 | . 78 |
79 | 80 | **从上图可以看出GHM-C能够把easy-sample和very-hard-sample的梯度个将下来,其实focal-loss也可以,但是focal-loss对very-hard-sample好像没辙。** 81 | 82 | 83 | 84 | ### 2.4 Unit Region Approximation 85 | 86 | $$ 87 | \large 2.3中的计算量太大,为log(N^2),所以采用近似计算的方式。\\ 88 | \large 把区间\epsilon分成M份,每一份的长度为\epsilon,此时的\epsilon不是原先的\epsilon。 89 | \large \\M=\frac {1}{\epsilon} \\ 90 | \large r_{j}是索引为j的uint \quad reign \quad r_{j}=[(j-1) \epsilon, j \epsilon)\\ 91 | \large R_{j}表示在r_{j}区间内的样本数,\operatorname{ind}(g)=t \text { s.t. }(t-1) \epsilon<=g 155 | . 156 |
157 | 158 |
159 | . 160 |
161 | 162 | ## 3.总结 163 | 164 | **GHM的工作十分扎实,认真分析了单阶段目标检测中的样本不均衡问题,通过梯度分布来动态为不同样本分配不同的梯度。这样原本分类中占据大量梯度的负例和easy-sample就会减少它们的梯度,占据少量的very-hard sample虽然样本比较少,但是却单个梯度很大,这样也会减小它们的梯度,medium-sample就会相对增加梯度。针对回归提出了改进版的smootl-l1 loss使得在d大于阈值的时候个样本梯度范数不再统一是1,能够反映不同样本的重要程度,同时针对性提出GHM-R Loss来较小very-hard sample的影响。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/GHM.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # **Gradient Harmonized Single-stage Detector** 4 | 5 | ## 1.概述 6 | 7 | **Gradient Harmonized Single-stage Detector分析了一阶段目标检测器样本不均问题,认为大量简单的背景占领了整了训练过程,同时对比了OHEM和Focal Loss,认为OHEM直接放弃那些简单样本,这样效率是很低的;同时Focal Loss需要tune两个参数,并且Focal Loss是一个静态loss,不能适应数据的动态分布。作者提出l gradient harmonizing mechanism(GHM)--梯度协调机制,动态改变个样本梯度,降低简单样本和极难例的样本梯度,增加medium样本的梯度。** 8 | 9 |
10 | . 11 |
12 | 13 | 14 | ​ **图1** 15 | 16 | ## 2.具体实现 17 | 18 | ### 2.1 问题描述 19 | 20 |
21 | . 22 |
23 | 24 | ***g* 为梯度的L1 范数,代表该样本该样本的贡献大小。** 25 | 26 |
27 | . 28 |
29 | 30 | **如上图所示,为了更加清楚显示坐标轴经过log函数,可以看出大量easy-sample贡献了绝大部分梯度,还有一部分very-hard-sample贡献比较多的梯度,这些very-hard-sample可能是一些异常值,如果收敛模型被迫学习那些异常值可能对其它例子的分类不那么准确。为此提出了Gradient Density的概念** 31 | 32 | 33 | 34 | ### 2.2 Gradient Density 35 | 36 |
37 | . 38 |
39 | 40 | 41 | 42 | ### 2.3 **GHM-C Loss** 43 | 44 |
45 | . 46 |
47 | 48 |
49 | . 50 |
51 | 52 | **从上图可以看出GHM-C能够把easy-sample和very-hard-sample的梯度个将下来,其实focal-loss也可以,但是focal-loss对very-hard-sample好像没辙。** 53 | 54 | ### 2.4 Unit Region Approximation 55 | 56 |
57 | . 58 |
59 | 60 | ### 2.5 Unit Region Approximation GHM-C Loss 61 | 62 |
63 | . 64 |
65 | 66 | ### 2.6 **GHM-R Loss** 67 | 68 | **Faster-RCNN 回归Loss一般使用Smooth-L1 Loss,如下式子所示:** 69 | 70 |
71 | . 72 |
73 | 74 | 75 | 76 | - **改进Smooth-L1 Loss** 77 | 78 |
79 | . 80 |
81 | 82 | 83 | 84 | 如下图所示,这种回归的梯度范数与目标个数的关系,因为坐标回归只回归正例,所以分布图不想分类一样,打样样本集中在负例上。可以看出梯度占据比较大的是一些难例。所以使用GHM-R Loss优化梯度,如下式所示: 85 | 86 |
87 | . 88 |
89 | 90 |
91 | . 92 |
93 | 94 |
95 | . 96 |
97 | 98 | ## 3.总结 99 | 100 | **GHM的工作十分扎实,认真分析了单阶段目标检测中的样本不均衡问题,通过梯度分布来动态为不同样本分配不同的梯度。这样原本分类中占据大量梯度的负例和easy-sample就会减少它们的梯度,占据少量的very-hard sample虽然样本比较少,但是却单个梯度很大,这样也会减小它们的梯度,medium-sample就会相对增加梯度。针对回归提出了改进版的smootl-l1 loss使得在d大于阈值的时候个样本梯度范数不再统一是1,能够反映不同样本的重要程度,同时针对性提出GHM-R Loss来较小very-hard sample的影响。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/RetinaNet.md: -------------------------------------------------------------------------------- 1 | # RetinaNet 2 | 3 | ## 1.概述 4 | 5 | **RetinaNet和大多数的one stage算法相同,直接对图片进行边框的回归,这导致了在一开始回归的时候,算法产生了大量的anticipate anchor(two stage 算法产生anchor的方式是通过region proposal的方式产生1k~2k的边框),这些anchor大部分都不包含object,即作者提到的easy negativate。 因此anchor导致了正负样本的不均衡。 正负样本不均衡主要有以下两个问题:** 6 | 7 | - **在网络进行训练时,一些easy negativate 样本对loss不起作用,网络收敛速度很慢。** 8 | - **由于存在大量的easy negativate 样本,因此在loss回归的过程,easy negativate样本将会覆盖掉真正有益的收敛方向,导致模型精度下降。** 9 | **基于上面的分析,作者提出了一种对新型的loss,这种loss能够对不同的easy,hard样本进行权重的赋值。使得loss更加倾向于学习一些hard样本。** 10 | 11 |
12 | 13 |
14 | 15 | **图1** 16 | 17 | ## 2.具体实现 18 | 19 | ### 2.1. Bckbone: 20 | 21 | **RetinaNet以ResNet为Backbone** 22 | 23 |
24 | 25 |
26 | 27 | **图2** 28 | 29 | ### 2.2. Neck: 30 | 31 | **RetinaNet在以ResNet为backbone的基础上最终输出了五层feature map,在这五层feature map进行anchor的选取。首先由Resnet 最后的三层C3,C4,C5产生P3,P4,P5,然后在C5的后面接着生成了P6,P7。如图2所示** 32 | 33 | 34 | 35 | ### 2.3. Head: 36 | 37 | **RetinaNet的Head分为两部分一个分类分支和一个回归分支。如图1所示** 38 | 39 | 40 | 41 | ### 2.4. Sample Assignment: 42 | 43 | **RetinaNet的Sample Assignment把iou < 0.4作为负样本, > 0.5作为正样本,其余为难例忽略。** 44 | 45 | 46 | 47 | ### 2.5. Anchor生成 48 | 49 | **RetinaNet的anchor生成比SSD稍微简单点:** 50 | 51 | - **ratios:[0.5,1,2]** 52 | - **scales:[[2^0, 2^(1.0 / 3.0), 2^(2.0 / 3.0)]]** 53 | 54 | **每层featuremap的每个点产生num-ratios * scales个anchor。** 55 | 56 | ``` 57 | def generate_anchors(base_size=16, ratios=None, scales=None): 58 | """ 59 | Generate anchor (reference) windows by enumerating aspect ratios X 60 | scales w.r.t. a reference window. 61 | """ 62 | 63 | if ratios is None: 64 | ratios = np.array([0.5, 1, 2]) 65 | 66 | if scales is None: 67 | scales = np.array([2 ** 0, 2 ** (1.0 / 3.0), 2 ** (2.0 / 3.0)]) 68 | 69 | num_anchors = len(ratios) * len(scales) 70 | 71 | # initialize output anchors 72 | anchors = np.zeros((num_anchors, 4)) 73 | 74 | # scale base_size 75 | anchors[:, 2:] = base_size * np.tile(scales, (2, len(ratios))).T 76 | 77 | # compute areas of anchors 78 | areas = anchors[:, 2] * anchors[:, 3] 79 | 80 | # correct for ratios 81 | anchors[:, 2] = np.sqrt(areas / np.repeat(ratios, len(scales))) 82 | anchors[:, 3] = anchors[:, 2] * np.repeat(ratios, len(scales)) 83 | 84 | # transform from (x_ctr, y_ctr, w, h) -> (x1, y1, x2, y2) 85 | anchors[:, 0::2] -= np.tile(anchors[:, 2] * 0.5, (2, 1)).T 86 | anchors[:, 1::2] -= np.tile(anchors[:, 3] * 0.5, (2, 1)).T 87 | return anchors 88 | ``` 89 | 90 | 91 | 92 | ### 2.6. Decode部分: 93 | 94 | **RetinaNet decode部分跟[ssd decode部分一样](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/SSD.md)** 95 | 96 | 97 | 98 | ### 2.7. LOSS部分: 99 | 100 | **retinanet把iou < 0.4作为负样本, > 0.5作为正样本,其余为难例忽略,分类loss用focal loss,回归loss跟ssd一样。分类loss计算代码。** 101 | 102 | **focal loss部分会在分类loss部分单独总结。** 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/SSD.md: -------------------------------------------------------------------------------- 1 | # SSD:Single Shot MultiBox Detector 2 | 3 | ## 概述: 4 | 5 | [Paper-Link](https://arxiv.org/abs/1512.02325) 6 | 7 | [Code-Link](https://github.com/balancap/SSD-Tensorflow) 8 | 9 | **SSD从YOLO中继承了将detection转化为regression的思路,一次完成目标定位与分类;基于Faster RCNN中的Anchor,提出了相似的Prior box;加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,即在不同感受野的feature map上预测目标。** 10 | 11 |
12 | 13 |
14 | 15 | **图1** 16 | 17 | ## 具体实现 18 | 19 | ### 1. Backbone 20 | 21 | **作责使用VGG16作为主干网络,在VGG16上做了一些修改将VGG16的两个全连接层转换成了普通的卷积层conv6和conv7,之后又接了多个卷积conv8_1,conv8_2,conv9_1,conv9_2,conv10_1,conv10_2, 最后用一个Global Average Pool来变成1x1的输出conv11_2,如下图所示:** 22 | 23 |
24 | 25 |
26 | 27 | **图2** 28 | 29 | 30 | 31 | ### 2.Neck 32 | 33 | **如图2所示,SSD的neck部分为特征金字塔部分,抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造不同尺度大小的prior box,然后分别进行检测和分类。个特征层的大小分别是输入的8、16、32、64、128、256倍下采样。** 34 | 35 | 36 | 37 | ### 3.Head 38 | 39 | Head在Neck提取6层感受野不一样的特征基础上分别回归两个分支:分类和回归。如下所示: 40 | 41 | ``` 42 | SSDBoxHead( 43 | (predictor): SSDBoxPredictor( 44 | (cls_headers): ModuleList( 45 | (0): Conv2d(512, 84, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 46 | (1): Conv2d(1024, 126, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 47 | (2): Conv2d(512, 126, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 48 | (3): Conv2d(256, 126, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 49 | (4): Conv2d(256, 84, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 50 | (5): Conv2d(256, 84, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 51 | ) 52 | (reg_headers): ModuleList( 53 | (0): Conv2d(512, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 54 | (1): Conv2d(1024, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 55 | (2): Conv2d(512, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 56 | (3): Conv2d(256, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 57 | (4): Conv2d(256, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 58 | (5): Conv2d(256, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 59 | ) 60 | ) 61 | ``` 62 | 63 | **假设每层每个特征点分配N个prior bboxes(Conv4_3:4个;Conv7:6个;Conv8_2:6个;Conv9_2:6个;Conv10_2:4个;Conv11_2:4个),则cls分支的维度:N x NumCls;reg分支的维度为N x 4。** 64 | 65 | 66 | 67 | ### 4.Sample Assignment 68 | 69 | **在输入为300x300大小的情况下,ssd一共会产生8732个priors:其中Conv4_3:38x38x4=5776;Conv7:19x19x6 = 2166;Conv8_2:10x10x6; Conv9_2: 5x5x6 = 150;Conv10_2:3x3x6 = 54;Conv11_2:1x1x4 = 4。** 70 | 71 | 1. **计算priors与所有gt的ious,并判断该prior与哪个gt的iou最大就把该prior分配该gt;** 72 | 2. **判断iou的值,如果小于0.5则认为该prior为负样本,否则为正样本;** 73 | 74 | #### hard_negative_mining: 75 | 76 | **前面为priors分配了正负标签,因为实际图片中gt数量较小,所以8732个priors中会产生严重的正负样本不均衡的情况,为此ssd提出在线难例挖掘的方式,通过对loss排序,前top k的loss的priors作为训练样本,认为loss大的样本为难训练的样本需要特殊关照,loss小的样本为简单样本,不用花太多精力去学习。具体过程如下:** 77 | 78 | 首先计算loss,交叉熵公式为: 79 | 80 |
81 | 82 |
83 | 84 | 因为我们要计算每个prior的loss,为不是计算总loss,因为label是one-hot形似,实际上每部分的loss就是: 85 | 86 | 87 | 88 |
89 | 90 |
91 | 92 | 可以用pytorch的函数实现: 93 | 94 | ​ 95 | 96 | ``` 97 | loss = -F.log_softmax(confidence, dim=2)[:, :, 0] 98 | ``` 99 | 100 | 其中confidence是网络的类别输出,大小为[B,8732,num_class];算完loss只需取前N个loss最大部分即可: 101 | 102 | ``` 103 | def hard_negative_mining(loss, labels, neg_pos_ratio): 104 | pos_mask = labels > 0 105 | num_pos = pos_mask.long().sum(dim=1, keepdim=True) 106 | num_neg = num_pos * neg_pos_ratio 107 | 108 | loss[pos_mask] = -math.inf 109 | _, indexes = loss.sort(dim=1, descending=True) 110 | _, orders = indexes.sort(dim=1) 111 | neg_mask = orders < num_neg 112 | return pos_mask | neg_mask 113 | ``` 114 | 115 | neg_pos_ratio默认为3,即正负样本比例为1:3。首先获取num_neg的个数:num_neg = num_pos * neg_pos_ratio,然后对loss通过一个降序和升序可获得前 116 | 117 | num_neg最大的loss的缩索引,如下例所示: 118 | 119 | 比如loss为[0.4,0.8.0.2,0.5,0.7,0.3],降序排列的索引为[1,4,3,0,5,2]。再对[1,4,3,0,5,2]按升序排列,并获取对应索引:[3,0,5,2,1,4]。 假设我们选取前2个loss最大值,那么只需判断[3,0,5,2,1,4]是否小于2,这里mask为[false,true,false,false,true,false]。通过mask可以看出我们去了第0和4个loss,分别是0.8,0.7正好是前2个最大值。 120 | 121 | **通过hard_negative_mining就可以选取任意比例的正负样本了,而且负样本还是特别需要关注的难例,这样就在一定程度上较小的正负样本不均衡的问题并且可以加速网络收敛速度。** 122 | 123 | 124 | 125 | ### 5.Decode 126 | 127 |
128 | 129 |
130 | 131 | **ssd decode方式跟faster-rcnn一样,只不过在实际代码中,center会除以center_variance(默认0.1),w,h会除以size_variance(默认0.2),猜测这样做的目的是为了放大编码后的值,使得在计算loss的时候不至于太小,加速收敛。** 132 | 133 | ``` 134 | def convert_boxes_to_locations(center_form_boxes, center_form_priors, center_variance, size_variance): 135 | # priors can have one dimension less 136 | if center_form_priors.dim() + 1 == center_form_boxes.dim(): 137 | center_form_priors = center_form_priors.unsqueeze(0) 138 | return torch.cat([ 139 | (center_form_boxes[..., :2] - center_form_priors[..., :2]) / center_form_priors[..., 2:] / center_variance, 140 | torch.log(center_form_boxes[..., 2:] / center_form_priors[..., 2:]) / size_variance 141 | ], dim=center_form_boxes.dim() - 1) 142 | ``` 143 | 144 | 145 | 146 | ### 6.Loss 147 | 148 | **SSDloss的计算方式与faster-rcnn一样,把不同特征层收集到的priors concate一起,分类用 交叉熵loss,回归用smooth-l1 loss。** 149 | 150 |
151 | 152 |
153 | 154 | N为匹配到priors的数量,a默认为1。 155 | 156 | 157 | 158 | ### 7.补充 159 | 160 | 1. anchor 生成:ssd 采用5种分辨率特征预测目标,分别是[8, 16, 32, 64, 100, 300]倍下采样,对应的feature map大小分别是[38, 19, 10, 5, 3, 1]。影响anchor生成的分别是: 161 | 162 | - min_sizes:[30, 60, 111, 162, 213, 264] 163 | - max_sizes:[60, 111, 162, 213, 264, 315] 164 | - aspect_ratios:[[2], [2, 3], [2, 3], [2, 3], [2], [2]] 165 | 166 | 看代码最直观能感受到是如何生成anchor的: 167 | 168 | ``` 169 | priors = [] 170 | for k, f in enumerate(self.feature_maps): 171 | scale = self.image_size / self.strides[k] 172 | for i, j in product(range(f), repeat=2): 173 | # unit center x,y 174 | cx = (j + 0.5) / scale 175 | cy = (i + 0.5) / scale 176 | 177 | # small sized square box 178 | size = self.min_sizes[k] 179 | h = w = size / self.image_size 180 | priors.append([cx, cy, w, h]) 181 | 182 | # big sized square box 183 | size = sqrt(self.min_sizes[k] * self.max_sizes[k]) 184 | h = w = size / self.image_size 185 | priors.append([cx, cy, w, h]) 186 | 187 | # change h/w ratio of the small sized box 188 | size = self.min_sizes[k] 189 | h = w = size / self.image_size 190 | for ratio in self.aspect_ratios[k]: 191 | ratio = sqrt(ratio) 192 | priors.append([cx, cy, w * ratio, h / ratio]) 193 | priors.append([cx, cy, w / ratio, h * ratio]) 194 | ``` 195 | 196 | ### 8. 总结 197 | 198 | **SSD是非常经典的one-stage的目标检测方法,通过特征金字塔能够检测不同大小的目标,没有RPN步骤,采用全卷积的方式能够极大提升检测速度。使用hard_negative_mining可以有效解决正负样本不均很的问题,同时加速收敛速度。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/Yolo4.md: -------------------------------------------------------------------------------- 1 | ## YoloV4 2 | 3 | ## 1.概述: 4 | 5 | **yolo4主要做了如下工作:** 6 | 1. **提出了一种实时、高精度的目标检测模型。 它可以使用1080Ti 或 2080Ti 等通用 GPU 来训练快速和准确的目标检测器;** 7 | 8 | 2. **在检测器训练阶段,验证了一些最先进的 Bag-of-Freebies 和 Bag-of-Specials 方法的效果;** 9 | 10 | 3. **对 SOTA 方法进行改进,使其效率更高,更适合单 GPU 训练,包括 CBN,PAN 和 SAM 等。** 11 | 12 |
13 | 14 |
15 | 16 | ## 2. 具体实现: 17 | 18 | **Yolo4的网络结构如下图所示:** 19 | 20 |
21 | 22 |
23 | 24 | ### 2.1 Backbone: 25 | 26 | **yolo4的主干网络网络为CSPDarknet53,CSPDarknet53是在Darknet53网络基础上添加CSP(Cross Stage Partial Network)模块,CSP模块主要是借鉴densenet的思想,提出跨阶段局部连接连接模块减小计算量,如下图所示:** 27 | 28 |
29 | 30 |
31 | 32 | **可以看出csp把input split两部分,每一部分维度为原来的一半,第一部分作dense block的计算,第二部分与第一部分dense block的计算结果concate。作者尝试了3中csp结构,如下图所示:** 33 | 34 |
35 | 36 |
37 | 38 | **b,c,d 3种结构的计算量跟精度如下图所示**: 39 | 40 |
41 | 42 |
43 | 44 | **Fusion first结构减少了26%的计算量,但却损失1.5%的精度;Fusion last结构减小21%计算量,减少0.1%的计算量,b中结构减小13%计算量,增加0.2%计算量。yolo4中选取b结构。** 45 | 46 | ### 2.2 Neck: 47 | 48 | **Neck主要包含:** 49 | 50 | * **SPPNet** 51 | 52 | **在 YOLOv4 中,对 SPP 进行了修改以保证输出的空间维度。 最大池化的核大小为 k = {1×1、5×5、9×9、13×13}。将来自不同核大小池化后的特征图串联在一起作为输出。 采用 SPP 层的方式,比单纯的使用单个尺寸核大小的最大池化的方式,更有效的增加主干网络的感受野,显著的分离最重要的上下文特征。 YOLOv3的作者在使用 608 * 608 大小的图像进行测试时发现,在 COCO 目标检测任务中,以 0.5% 的额外计算代价将 AP50 增加了 2.7%。** 53 | 54 |
55 | 56 |
57 | 58 | * **PANet** 59 | 60 | **PANet是为了融合更加细粒度特征,FPN采用top-down形式融合特征,PANet自低向上的路径得到增强,使得底层信息更容易传播到顶部,在FPN中,局部信息会向上传播,如红色箭头所示。尽管图中可能没有展示清楚,但这条红色路径穿过了大约100多层。PANet引入一个捷径(绿色路径),其仅需10层左右就能抵达顶部的Ns层,这个短回路概念使得顶层也能获取到细粒度的局部信息。** 61 | 62 |
63 | 64 |
65 | 66 | **yolo4把原来PANet中add操作改成了concate操作。** 67 | 68 |
69 | 70 |
71 | 72 | ### 2.3 Head: 73 | 74 | **参考Yolo3的Head** 75 | 76 | ### 2.4 补充: 77 | 78 | **yolo4论文中还提出了SAM空间注意力模块,但是实际code中并未使用,猜测可能是计算量限制,SAM模块会为输入进行最大值和均值池化,从而得到两个特征图集合,最终进行卷积操作,之后再由一个sigmoid函数创建出空间注意力。这个空间注意力掩码再被应用于输入特征,从而输出经过注意力的特征图。原SAM模块如下图所示:** 79 | 80 |
81 | 82 |
83 | 84 | **Yolo4改进了空间注意力模块,没有使用maxpool和avgpool** 85 | 86 |
87 | 88 |
89 | 90 | ### 2.5 前处理: 91 | 92 | - **Mosaic data aug mentation** 93 | - **Self-Adversarial Training** 94 | 95 | ### 2.6 训练过程: 96 | 97 | - **CmBN** 98 | - **DropBlock** 99 | - **Mish activation** 100 | 101 | ### 2.7 损失函数: 102 | 103 | - **分类损失函数:** 104 | 105 | **交叉熵损失函数** 106 | 107 | - **回归损失函数:** 108 | 109 | **CIOU-Loss** 110 | 111 | ### 2.8 后处理: 112 | 113 | - **DIOU-NMS** 114 | 115 | 116 | ## 3. 总结: 117 | 118 | **Yolo4的试验做的十分充分,各种训练技巧对于调参来说有可以借鉴很多,CSP模块能够有效减小模型计算量。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/one-stage/Yolo5.md: -------------------------------------------------------------------------------- 1 | # YoloV5 2 | ### 1. 网络结构 3 | 与yolo4不同,yolo5首先采用了focus层,设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。yolo3、yolo4、yolo5的网络结构如下图所示: 4 | ![image](https://img-blog.csdnimg.cn/2020091205304470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 5 | ![image](https://img-blog.csdnimg.cn/20200912053056600.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 6 | ![image](https://img-blog.csdnimg.cn/20200912052742459.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 7 | #### 1.1 网络深度 8 | ![image](https://img-blog.csdnimg.cn/20200914141100919.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 9 | #### 1.2 网络宽度 10 | ![image](https://img-blog.csdnimg.cn/20200914141033152.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 11 | #### 1.3 Focus结构 12 | ![image](https://img-blog.csdnimg.cn/20200914095419472.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 13 | #### 1.4 CSP结构 14 | Yolov4借鉴了CSPNet的设计思路,在主干网络中设计了CSP结构,但只有主干网络使用了CSP结构。 15 | ![image](https://img-blog.csdnimg.cn/20200914102451360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 16 | 17 | Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。 18 | https://img-blog.csdnimg.cn/20200914102443272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center 19 | CSPNet(Cross Stage PartialNetwork):跨阶段局部网络,以缓解以前需要大量推理计算的问题。 20 | - 增强了CNN的学习能力,能够在轻量化的同时保持准确性。 21 | - 降低计算瓶颈。 22 | - 降低内存成本。 23 | - CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。 24 | CSPNet和PRN都是一个思想,将featuremap拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate。 25 | #### 1.5 neck 26 | Yolov4的Neck结构中,采用的都是普通的卷积操作。而Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。 27 | ![image](https://img-blog.csdnimg.cn/20200914113727493.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODg0MjgyMQ==,size_16,color_FFFFFF,t_70#pic_center) 28 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/CARAFE-SRC.md: -------------------------------------------------------------------------------- 1 | # **CARAFE: Content-Aware ReAssembly of FEatures** 2 | 3 | ## 概述: 4 | 5 | **CARAFE提出的目的是为了提高特征上采样的精度与速度,分析了传统插值和deconvolution的缺点,认为传统插值精度不好,deconvolution比较费时,为此提出了一种新的上采样策略。** 6 | 7 | ## 方案 8 | 9 |
10 | 11 |
12 | 13 | **文章扯了一大堆有的没的,其实全文的思路在这个图中就可以看出来,整个过程分为两个部分:** 14 | 15 |
16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | # 总结 24 | 25 | **CARAFE同篇文章说实话我是没多大兴趣的,感觉就是为了讲故事而写的一篇文文章,所以很多文章细节没有写出来,只是写了一个大概思想。文章虽然在baseline上有一定的提升,但是这个提升确定不是引入了更多参数????文章说比deconv更加light,说实话我觉得并没有,一同操作下来复杂度还是挺高的。比deconv和最近邻提升0.5个点。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Cascade-RCNN - SRC.md: -------------------------------------------------------------------------------- 1 | # Cascade R-CNN: Delving into High Quality Object Detection 2 | 3 | ## 概述: 4 | 5 | **Cascade R-CNN通过级联的方式一级一级筛选出高质量的proposal,提升train和inference的精度** 6 | 7 |
8 | 9 |
10 | 11 | 12 | ​ **图1** 13 | 14 | ## 提出背景 15 | 16 | **目标检测过程中会通过IOU阈值来区分正负样本,如果IOU阈值太小则目标的噪声会很多,如果IOU阈值太大则会导致两个问题:** 17 | 18 | - **正样本数量太少,导致网络过拟合** 19 | 20 | - **训练阶段与前向阶段样本不匹配(训练阶段可以认为控制iou阈值来提升样本质量,但是inference阶段则要靠网络自己输出proposal,这是的质量不能得到保证,这就导致训练与inference阶段mismatch,导致结果不好。)** 21 | 22 |
23 | 24 |
25 | 26 | ​ **图2** 27 | 28 | **如上图(a)所示(实线部分),在训练阶段的阈值为0.7时效果急剧下降,为了分析下降的原因人为把输入的质量提升再进行试验,如图(b)所实,此时阈值为0.7训练的模型的roc最高。这就是train和inference mismatch问题** 29 | 30 | 31 | 32 | ## 解决方案 33 | 34 |
35 | 36 |
37 | 38 | ​ **图3** 39 | 40 | **如图3(a)所示,曲线代表在不同阈值训练的模型,输入iou与输出iou的对应关系。可以得到如下结论:** 41 | 42 | - **不同阈值训练出来的模型在输入iou在其附近时能够取得最好效果(与baseline的差)** 43 | - **回归出的iou总是大于输入iou** 44 | 45 | **基于以上发现,作者就想到图1(d)的级联结构,以固定阈值训练可以得到一个更好的训练分布样本,下一级输入为上一级的输出就能够得到较好的效果。** 46 | 47 | 48 | 49 | **这种级联方式有三种选择方案:** 50 | 51 | - **iterative bounding box regression(图1(b)),它的三个head是公用的,这会存在两个问题:** 52 | - **图3(c)所示,以u=0.5为例,它对于更高iou的输入是一个次优化(在input iou > 0.8是 output iou急剧变差)** 53 | - **随着级数的增加,bounding box的分布显著改变,如果每一级还公用参数那么显然是不合理的。** 54 | 55 | - **Integral loss(图1(c)),它的三个分支分别使用不同阈值{0.5,0.6,0.7},第二、三分支负责精确分类,但是这存在两个问题:** 56 | - **后面两个分支由于阈值的提升,正样本数量势必急剧减小会导致过拟合发生** 57 | - **由于后两级高质量分分类器需要处理inference结算大量低质量的proposal,这些是它们在训练阶段没有优化过的(训练阶段有gt可以控制样本),所以导致它的效果不好** 58 | 59 | - **cascade rcnn(图1(d)),采用多级不同head,head结构相同但是各自参数不同,每一级的输入是前一级的输出,各级独自优化** 60 | 61 | 62 | 63 | # 总结 64 | 65 | **cascade通过大量试验分析,从试验角度出发设计网络,提升训练样本质量同时过拟合与mismatch的问题。试验结合理论再提出解决方案,这种方式很值得我们学习,** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Cascade-RCNN.md: -------------------------------------------------------------------------------- 1 | # Cascade R-CNN: Delving into High Quality Object Detection 2 | 3 | ## 概述: 4 | 5 | **Cascade R-CNN通过级联的方式一级一级筛选出高质量的proposal,提升train和inference的精度** 6 | 7 |
8 | 9 |
10 | 11 | 12 | ​ **图1** 13 | 14 | ## 提出背景 15 | 16 | **目标检测过程中会通过IOU阈值来区分正负样本,如果IOU阈值太小则目标的噪声会很多,如果IOU阈值太大则会导致两个问题:** 17 | 18 | - **正样本数量太少,导致网络过拟合** 19 | 20 | - **训练阶段与前向阶段样本不匹配(训练阶段可以认为控制iou阈值来提升样本质量,但是inference阶段则要靠网络自己输出proposal,这是的质量不能得到保证,这就导致训练与inference阶段mismatch,导致结果不好。)** 21 | 22 |
23 | 24 |
25 | 26 | ​ **图2** 27 | 28 | **如上图(a)所示(实线部分),在训练阶段的阈值为0.7时效果急剧下降,为了分析下降的原因人为把输入的质量提升再进行试验,如图(b)所实,此时阈值为0.7训练的模型的roc最高。这就是train和inference mismatch问题** 29 | 30 | 31 | 32 | ## 解决方案 33 | 34 |
35 | 36 |
37 | 38 | ​ **图3** 39 | 40 | **如图3(a)所示,曲线代表在不同阈值训练的模型,输入iou与输出iou的对应关系。可以得到如下结论:** 41 | 42 | - **不同阈值训练出来的模型在输入iou在其附近时能够取得最好效果(与baseline的差)** 43 | - **回归出的iou总是大于输入iou** 44 | 45 | **基于以上发现,作者就想到图1(d)的级联结构,以固定阈值训练可以得到一个更好的训练分布样本,下一级输入为上一级的输出就能够得到较好的效果。** 46 | 47 | 48 | 49 | **这种级联方式有三种选择方案:** 50 | 51 | - **iterative bounding box regression(图1(b)),它的三个head是公用的,这会存在两个问题:** 52 | - **图3(c)所示,以u=0.5为例,它对于更高iou的输入是一个次优化(在input iou > 0.8是 output iou急剧变差)** 53 | - **随着级数的增加,bounding box的分布显著改变,如果每一级还公用参数那么显然是不合理的。** 54 | 55 | - **Integral loss(图1(c)),它的三个分支分别使用不同阈值{0.5,0.6,0.7},第二、三分支负责精确分类,但是这存在两个问题:** 56 | - **后面两个分支由于阈值的提升,正样本数量势必急剧减小会导致过拟合发生** 57 | - **由于后两级高质量分分类器需要处理inference结算大量低质量的proposal,这些是它们在训练阶段没有优化过的(训练阶段有gt可以控制样本),所以导致它的效果不好** 58 | 59 | - **cascade rcnn(图1(d)),采用多级不同head,head结构相同但是各自参数不同,每一级的输入是前一级的输出,各级独自优化** 60 | 61 | 62 | 63 | # 总结 64 | 65 | **cascade通过大量试验分析,从试验角度出发设计网络,提升训练样本质量同时过拟合与mismatch的问题。试验结合理论再提出解决方案,这种方式很值得我们学习,** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Double-Head-RCNN.md: -------------------------------------------------------------------------------- 1 | # **Double-Head RCNN:Rethinking Classifification and Localization for Object Detection** 2 | 3 | ## 概述: 4 | 5 | **Double-Head RCNN 分析了分类head和回归head,认为主流的方式是都用全连接或则用卷积层最后接pooling再去做分类和回归,这样会降低检测精度。因此作者提出了Double-Head的思想,用全连接层去做分类且用卷积层做回归。作者认为fc层没有共享变换具有空间敏感性,而conv层则应为局部共享,在location敏感性更强。** 6 | 7 | **** 8 | 9 |
10 | 11 |
12 | 13 | 14 | 15 | ​ **图1** 16 | 17 | ## 具体实现 18 | 19 | ### 1. Backbone: 20 | 21 | **作者论文实验中使用的ResNet-101和ResNet-50** 22 | 23 | 24 | 25 | ### 2. Neck: 26 | 27 | **Neck部分这里即为RPN部分,可参考Faster-RCNN的RPN部分。** 28 | 29 | 30 | 31 | ### 3. Head: 32 | 33 | - **CLS HEAD** 34 | 35 | **cls Head如图1(c)所示,两个全连接层。** 36 | 37 | 38 | 39 | - **Reg Head** 40 | 41 | **Reg Head堆叠K个residual blocks, 第一个block作用是升维(256->1024),如图2(a)所示,其余是bottleneck block,如图2(b)所示,本文在每一个bottleneck block前面添加一个non-local block,如图2(c)所示。最后 average pooling层把1024x7x7的特征pooling成1024维度再回归。** 42 | 43 |
44 | 45 |
46 | 47 | ​ **图2** 48 | 49 | - **混合任务** 50 | 51 | **混合任务,如图1(d)所示,在cls head再接一个reg分支,在reg分支再接一个cls分支。作者认为回归头能够给分类任务提供额外的监督信号,reg-head和cls-head的bbox能够互补。** 52 | 53 | 54 | 55 | ### 5. Sample Assignment: 56 | 57 | ​ **可参考[Faster-RCNN的Sample Assignment部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/two-stage/Faster-RCNN.md)。** 58 | 59 | ### 6. Decode: 60 | 61 | ​ **可参考[Faster-RCNN的Decode部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/two-stage/Faster-RCNN.md)。** 62 | 63 | ### 7. Loss: 64 | 65 | ​ **可参考[Faster-RCNN Loss部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/two-stage/Faster-RCNN.md)。** 66 | 67 | ### 8. 总结 68 | 69 | **fc层对全局空间信息掌握的更好,卷积能够对局部位置信息掌握更好,作为利用这个发现分别用fc和conv来进行分类和回归。然后提出混合任务,fc层再回归框,conv层再进行分类进行辅助互补。** 70 | 71 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Dynamic-RCNN.md: -------------------------------------------------------------------------------- 1 | # Dynamic R-CNN: Towards High Quality Object Detection via Dynamic Training 2 | 3 | ## 1.概述: 4 | 5 | **Dynamic R-CNN 还是在样本选取的角度出发,认为网络在不同训练阶段porposal的分布会不一样,如果还是以一样的状态去选取样本会损害网络精度。结合cascade-rcnn,认为cascade-rcnn太耗时,提出了动态分配样本的方法,通过统计object与proposal的统计学特征来动态分配样本。** 6 | 7 | 8 | 9 | ## 2.提出背景 10 | 11 | **这篇文章的背景跟cascade-rcnn的提出背景一样,可以参考我得cascade-rcnn,都是为了提升训练过程中的样本质量。** 12 | 13 | 14 | 15 | ## 3.解决方案 16 | 17 | **不同于cascade-rcnn采用多级预测的方式太耗时,作者通过统计proposal的统计学特征来动态选择样本。** 18 | 19 | ### 3.1分类 20 | 21 |
22 | 23 |
24 | 25 | ​ 图1 26 | 27 | **分类问题最好满足两个条件** 28 | 29 | - **充分数量的正负样本** 30 | - **精确的正样本** 31 | 32 | **为了满足这两个条件,cascade-rcnn通过多级预测的方式,前面几级的iou阈值比较小,保证了正负样本的数量,后面的iou阈值比较大,保证了iou的精度。作者发现随着网络迭代的次数增加,正样本的数量会越来越多,这个很好理解,网络到后半段精度较高了。所以作者就利用不同训练阶段采用不同阈值的训练策略,训练前期采用低阈值,训练后期采用高阈值。低阈值来保证样本的充分性,高阈值来保证样本的精确性。动态阈值的调整策略如下:** 33 | 34 | 1. **计算mini-batch的样本与proposal的ious,选取前top-ki个值** 35 | 2. **没C论迭代统计一下这top-ki个值得均值作为iou阈值。** 36 | 37 | **这样在前期阈值较小,后期阈值较大,可以达到预期效果。** 38 | 39 | ### 3.2回归 40 | 41 | **Faster-RCNN得回归loss采用smooth-l1 loss,smooth-l1 loss对整个训练过程得样本都是一视同仁得,网络训练后期proposal得分布会变,如果还是一视同仁会损害模型精度,打个比方,训练后期proposal得精度越来越高,我们希望给你这些高质量的proposal更多的关怀,是他们能够更好回归,而低质量的proposal则给少一些关怀。** 42 | 43 |
44 | 45 |
46 | 47 | ​ 图2 48 | 49 | **作者通过统计proposal与gt的误差来动态更新一个参数,控制loss对proposal的关怀程度,如下式所示:** 50 | 51 |
52 | 53 |
54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | # 总结 62 | 63 | **很难想象2020年还有RCNN相关的论文发表,而且说实话Dynamic R-CNN整体创新点并不多。通过动态阈值来选取proposal的论文还挺多的,有通过梯度的,有同归iou-balance的等等,另外就是回归loss这一块添加一个统计因子,我觉得focal loss的效果会更好一些,这些统计特征会因为目标的差异性不同应该差距还是有一些的。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Faster-RCNN-SRC.md: -------------------------------------------------------------------------------- 1 | # Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 2 | 3 | ## 概述: 4 | 5 | **Faster-RCNN是在Fast-RCNN基础上设计RPN层替换选来的selective search方式生成ROI,达到真正的end-to-end的训练方式,在速度和精度上都有很大提升。网络结构如下图所示:** 6 | 7 |
8 | 9 |
10 | 11 | ​ **图1** 12 | 13 | ## 具体实现 14 | 15 | ### 1. Backbone: 16 | 17 | **作者论文实验中使用的时ZFNet和VGG,仅取16被下采样后的特征层作为最终RPN和RCNN的特征提取层。如图1中backobone所示。** 18 | 19 | 20 | 21 | ### 2. Neck: 22 | 23 | **Neck部分这里即为RPN部分,RPN网络如图1中Neck部分所示,具体如图2所示:rpn_cls_scrore、rpn_bbox_pred的大小分别为[B,N * 2,H/16,W/16],[B,N * 4,H / 16,W / 16],N为单点anchor个数,默认为9个,H,W分别为输入的高和宽,B为batch-size大小。RPN阶段提取ROI只有正例和负例两个类别,所以分类分支的维度为2*N,同时每一个ROI需要回归中心点坐标(x,y)和宽高(w,h),所以bbox分支维度为N *4。最终输出的proposal有scores和rois组成。** 24 | 25 |
26 | 27 |
28 | 29 | ​ **图2** 30 | 31 | 32 | 33 | ### 3. Head: 34 | 35 | **RPN阶段刷选出rois在conv5_3层中经过ROI-Pooling操作把每一个roi提取的特征固定到形同大小(默认为7x7),然后再把该特征分别经过分类和回归分支的全连接层输出类别和坐标。如图1中Head所示。** 36 | 37 | 38 | 39 | ### 4. Sample Assignment: 40 | 41 | - **rpn sample assignment** 42 | 1. 对rpn proposal的scores进行排序,选取前RPN_PRE_NMS_TOP_N个,一般默认RPN_PRE_NMS_TOP_N为12000; 43 | 2. 对前RPN_PRE_NMS_TOP_N个proposal进行nms,nms阈值为RPN_NMS_THRESH(默认为0.7); 44 | 3. 选取nms后的前RPN_POST_NMS_TOP_N(默认为2000)个proposal; 45 | - **rcnn sample assignment** 46 | 1. 计算2000个proposals+gts(后面还是用proposals表示)与所有gts的ious 47 | 2. 找出每个proposal与哪个gt的iou最大,并记录其iou值,如果iou值大于FG_THRESH(默认为0.5),则设置该proposal为正样本。 48 | 3. 如果该iou值BG_THRESH(默认为0.) 的proposal则设置为负样本 49 | 4. 控制正负样本的个数及比例,默认设置正负样本比例为1:3且正负样本总数为256,实际正样本如果大于64则随机选取64个,如果为0则随机选取256个负样本。 50 | 51 | 52 | 53 | ### 5. Decode: 54 | 55 | $$ 56 | \begin{aligned} 57 | t_{\mathrm{x}} &=\left(x-x_{\mathrm{a}}\right) / w_{\mathrm{a}}, \quad t_{\mathrm{y}}=\left(y-y_{\mathrm{a}}\right) / h_{\mathrm{a}} \\ 58 | t_{\mathrm{w}} &=\log \left(w / w_{\mathrm{a}}\right), \quad t_{\mathrm{h}}=\log \left(h / h_{\mathrm{a}}\right) \\ 59 | t_{\mathrm{x}}^{*} &=\left(x^{*}-x_{\mathrm{a}}\right) / w_{\mathrm{a}}, \quad t_{\mathrm{y}}^{*}=\left(y^{*}-y_{\mathrm{a}}\right) / h_{\mathrm{a}} \\ 60 | t_{\mathrm{w}}^{*} &=\log \left(w^{*} / w_{\mathrm{a}}\right), \quad t_{\mathrm{h}}^{*}=\log \left(h^{*} / h_{\mathrm{a}}\right) 61 | \end{aligned} 62 | $$ 63 | 64 | $$ 65 | (x,y)、(x_{a},y_{a})、(x^*,y^*)分别表示预测点的中心坐标,anchor的中心点坐标,gt的中心点坐标\\ 66 | (w,h)、(w_{a},h_{a})、(w^*,h^*)分别表示预测点的宽高,anchor的宽高,gt的宽高 67 | $$ 68 | 69 | 从该编码方式来看,编码后的值被压缩有助于网络快速收敛。 70 | 71 | ### 6. Loss: 72 | 73 | Faster-RCNN分为RPN和RCNN两个部分,两个部分单独优化,RCNN部分上面讨论了选取256个mini-batch的proposals,RPN部分选取前RPN_PRE_NMS_TOP_N个proposals后通过下面也选取mini-bach个proposals,mini-bach的数量由RPN_BATCHSIZE控制: 74 | 75 | 1. 计算前RPN_POST_NMS_TOP_N个proposal与gts的ious; 76 | 2. iou小于RPN_NEGATIVE_OVERLAP(默认0.3)的proposal为负样本,iou大于 RPN_POSITIVE_OVERLAP(默认0.7)的proposal为正样本。需要注意的是gt与anchor最大的IOU,不 管是否大于RPN_POSITIVE_OVERLAP始终设置为正样本。其余设置为忽略样本(-1); 77 | 3. 选择正负样本个数,由RPN_FG_FRACTION和RPN_BATCHSIZE两个变量控制,RPN_FG_FRACTION是负样本比例默认0.5,RPN_BATCHSIZE为该批次正负样本个数,默认为256。正负样本最大个数为128,当正样本大于128时,随机选取128个正样本,负样本个数始终为RPN_BATCHSIZE-实际正样本个数。 78 | 79 | 两部分的Loss公式为: 80 | $$ 81 | L ( \{ p _ { i } \} \{ t _ { i } \} ) = \frac { 1 } { N _ { c l s } } \sum _ { i } L _ { c l s } ( p _ { i } p _ { i } ^ { * } ) + \lambda \frac { 1 } { N _ { r e g } } \sum _ { i } p _ { i } ^ { * } L _ { r e g } ( t _ { i } t _ { i } ^ { * } ) 82 | $$ 83 | 84 | $$ 85 | p_{i},t_{i}分别是预测的类别和位置\\ 86 | p^{*}_{i},t^{*}_{i}分别是预测的类别和位置,p^{*}_{i}为one-hot标签\\ 87 | N_{cls}为mini-batch大小,默认为256,N_{reg}为总anchosr个数,默认为2400,假设输入224,ancor为9,则特征图大小为14,总anchors=14*14*8约为2400\\ 88 | \lambda为10 89 | $$ 90 | 91 | **分类loss用的交叉熵loss,回归loss用的smooth-L1 loss。** 92 | 93 | ### 7. 总结 94 | 95 | Faster-RCNN的作者从RCNN,Fast-RCNN一步一个脚印,做的工作非常扎实,RPN的提出使得网络能够完全以end-to-end的方式进行训练,anchor的提出为后来anchor-base系列的目标检测奠定了基础。现在各种主干网络,loss,FPN等提出使得Faster-RCNN在原来基础上又能够有一个很大的进步。 -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Faster-RCNN.md: -------------------------------------------------------------------------------- 1 | # Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 2 | 3 | ## 概述: 4 | 5 | **Faster-RCNN是在Fast-RCNN基础上设计RPN层替换选来的selective search方式生成ROI,达到真正的end-to-end的训练方式,在速度和精度上都有很大提升。网络结构如下图所示:** 6 | 7 |
8 | 9 |
10 | 11 | ​ **图1** 12 | 13 | ## 具体实现 14 | 15 | ### 1. Backbone: 16 | 17 | **作者论文实验中使用的时ZFNet和VGG,仅取16被下采样后的特征层作为最终RPN和RCNN的特征提取层。如图1中backobone所示。** 18 | 19 | 20 | 21 | ### 2. Neck: 22 | 23 | **Neck部分这里即为RPN部分,RPN网络如图1中Neck部分所示,具体如图2所示:rpn_cls_scrore、rpn_bbox_pred的大小分别为[B,Nx2,H/16,W/16],[B,Nx4,H/16,W/16],N为单点anchor个数,默认为9个,H,W分别为输入的高和宽,B为batch-size大小。RPN阶段提取ROI只有正例和负例两个类别,所以分类分支的维度为2xN,同时每一个ROI需要回归中心点坐标(x,y)和宽高(w,h),所以bbox分支维度为Nx4。最终输出的proposal有scores和rois组成。** 24 | 25 |
26 | 27 |
28 | 29 | ​ **图2** 30 | 31 | 32 | 33 | ### 3. Head: 34 | 35 | **RPN阶段刷选出rois在conv5_3层中经过ROI-Pooling操作把每一个roi提取的特征固定到相同大小(默认为7x7),然后再把该特征分别经过分类和回归分支的全连接层输出类别和坐标。如图1中Head所示。** 36 | 37 | 38 | 39 | ### 4. Sample Assignment: 40 | 41 | - **rpn sample assignment** 42 | 1. 对rpn proposal的scores进行排序,选取前RPN_PRE_NMS_TOP_N个,一般默认RPN_PRE_NMS_TOP_N为12000; 43 | 2. 对前RPN_PRE_NMS_TOP_N个proposal进行nms,nms阈值为RPN_NMS_THRESH(默认为0.7); 44 | 3. 选取nms后的前RPN_POST_NMS_TOP_N(默认为2000)个proposal; 45 | - **rcnn sample assignment** 46 | 1. 计算2000个proposals+gts(后面还是用proposals表示)与所有gts的ious 47 | 2. 找出每个proposal与哪个gt的iou最大,并记录其iou值,如果iou值大于FG_THRESH(默认为0.5),则设置该proposal为正样本。 48 | 3. 如果该iou值BG_THRESH(默认为0.) 的proposal则设置为负样本 49 | 4. 控制正负样本的个数及比例,默认设置正负样本比例为1:3且正负样本总数为256,实际正样本如果大于64则随机选取64个,如果为0则随机选取256个负样本。 50 | 51 | 52 | 53 | ### 5. Decode: 54 | 55 |
56 | 57 |
58 | 59 | 从该编码方式来看,编码后的值被压缩有助于网络快速收敛。 60 | 61 | ### 6. Loss: 62 | 63 | Faster-RCNN分为RPN和RCNN两个部分,两个部分单独优化,RCNN部分上面讨论了选取256个mini-batch的proposals,RPN部分选取前RPN_PRE_NMS_TOP_N个proposals后通过如下步骤也选取mini-bach个proposals,mini-bach的数量由RPN_BATCHSIZE控制: 64 | 65 | 1. 计算前RPN_POST_NMS_TOP_N个proposal与gts的ious; 66 | 2. iou小于RPN_NEGATIVE_OVERLAP(默认0.3)的proposal为负样本,iou大于 RPN_POSITIVE_OVERLAP(默认0.7)的proposal为正样本。需要注意的是gt与anchor最大的IOU,不 管是否大于RPN_POSITIVE_OVERLAP始终设置为正样本。其余设置为忽略样本(-1); 67 | 3. 选择正负样本个数,由RPN_FG_FRACTION和RPN_BATCHSIZE两个变量控制,RPN_FG_FRACTION是负样本比例默认0.5,RPN_BATCHSIZE为该批次正负样本个数,默认为256。正负样本最大个数为128,当正样本大于128时,随机选取128个正样本,负样本个数始终为RPN_BATCHSIZE-实际正样本个数。 68 | 69 | 两部分的Loss公式为: 70 | 71 |
72 | 73 |
74 | 75 | **分类loss用的交叉熵loss,回归loss用的smooth-L1 loss。** 76 | 77 | ### 7. 总结 78 | 79 | Faster-RCNN的作者从RCNN,Fast-RCNN一步一个脚印,做的工作非常扎实,RPN的提出使得网络能够完全以end-to-end的方式进行训练,anchor的提出为后来anchor-base系列的目标检测奠定了基础。现在各种主干网络,loss,FPN等提出使得Faster-RCNN在原来基础上又能够有一个很大的进步。但是Faster RCNN还是存在一些问题,比如: 80 | - ROI后部分的网络参数不共享,每一个ROI都要进行一次运算,会增加运行时间,同时因为ROI的前部分都是共享参数的所以具有位置不敏感性,而后部分只有全连接层所以具有位置不敏感性,其检测精度会较低。 81 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Libra R-CNN-SRC.md: -------------------------------------------------------------------------------- 1 | # **Libra R-CNN: Towards Balanced Learning for Object Detection** 2 | 3 | ## 概述: 4 | 5 | **paper link:https://arxiv.org/pdf/1904.02701.pdf** 6 | 7 | **code link: https://github.com/OceanPang/Libra_R-CNN** 8 | 9 | **Libra R-CNN现有two-satge检测框架得问题分别从样本层面、特征层面和目标层面出发,提出IOU-balanced sampling,balanced feature pytamid,balanced L1 loss。主要解决选取高质量样本、更加有效融合mult-stage特征和更加关注难例的学习。** 10 | 11 | 12 | ​ 13 | 14 | ## 具体实现 15 | 16 | ### 1. Sample level imbalance: 17 | 18 | **在网络训练过程中,难例是能够十分有效提升训练结果的,但是一般random sampling往往会取到更到的easy sample,为了解决这个问题,有两个常用的方案:** 19 | 20 | - **OHEM,OHEM通过对loss进行排序,认为loss较大的是难例,按照一定比例选取top-k的难例就可以了。但是OHEM存在一个问题就是noise label非常敏感,而且有一个较大的内存和计算成本。** 21 | - **Focal Loss,Focal loss在two-stage阶段框架中表现效果并不是很突出,由于在RPN阶段大量简单样本在这一阶段被滤掉了。** 22 | 23 | 24 | 25 | **争对上面两种情况,作者提出了 IoU-balanced Sampling** 26 | 27 |
28 | 29 |
30 | 31 | 32 | 33 | **如上图所示,作者发现,60%的难例出现在iou>0.05的情况下,而random sampling则仅提供30%的难例子。假设一共要选N个负例,其中总共有M个负例,那么在random sampling情况下每个样本选择的概率为P=N/M。为了提升难例的概率,按照iou均分成K个bin,要选的N个负例在K个bin里面是等概率的,如下式所示:** 34 | $$ 35 | \large p_{k}=\frac{N}{K} * \frac{1}{M_{k}}, \quad k \in[0, K)\\ 36 | \large 由于N,K是固定的,通过上图可以看出iou较大部分M_{k}肯定较大,那么\frac{1}{M_{k}}肯定就较小,在这个阶段选取概率p_{k}就相应减小。 37 | $$ 38 | 39 |
40 | 41 |
42 | 43 | **从上图可以看出,通过iou balance选出的负例跟靠近目标一些,大都集中在目标周围。需要注意的是iou balance选取的是负例,正例还是按正常去选取。** 44 | 45 | 46 | 47 | ### 2.**Feature level imbalance**: 48 | 49 | **常见的特征融合方案一般为FPN top-down的方式融合,PANet在词基础上添加了botton-up的融合路径,但是这两样融合方式都存在一个问题,那就是融合特征跟关注相邻的特征层,不相邻的特征层会随着层数的增加不断稀释。为此提出了Feature level imbalance,包含如下四步:** 50 | 51 | - **rescaling,把不同层的特征resale到同以分辨率(一般resale到8倍下采样分辨率),最后进行相加,此时不同层的贡献是一样的** 52 | - **integrating,resale的特征在逆向回原来的分辨率再与原特征进行相加** 53 | - **refining,融合的特征需要进行一些卷积消化一下,作者对比了卷积和 non-local module,最终选择 non-local module,采用Gaussian non-local attention** 54 | - **strengthening,这个不知道,论文好像没有具体提出。** 55 | 56 |
57 | 58 |
59 | 60 | ### 3.Balanced L1 Loss 61 | 62 | **Balanced L1 Loss主要是解决多任务学习过程中loss权重分配的一个问题,检测任务一般分为分类跟回归两个任务,loss = loss-cls + a * loss-reg,这个a就是一个平衡系数,我们可以通过改变a的值平衡分类跟回归loss。但是随着a的增加,作者发现模型对outliers更加敏感,outliers可以认为是难例,为了分类问题的准确性如果把过多注意力放在难例上(负例),难免导致分类结果不佳,那么如果去平衡outliers和inliers,作者因此提出了一个Balanced L1 Loss:** 63 | $$ 64 | \large L_{b}(x)= \begin{cases}\frac{\alpha}{b}(b|x|+1) \ln (b|x|+1)-\alpha|x| & \text { if }|x|<1 \\ \gamma|x|+C & \text { otherwise }\end{cases}\\ 65 | \large 其中\alpha,\gamma,b为常数,且满足: 66 | \large \alpha * ln(b+1) = \gamma\\ 67 | \large 改梯度为: 68 | \large \frac{\partial L_{b}}{\partial x}= \begin{cases}\alpha \ln (b|x|+1) & \text { if }|x|<1 \\ \gamma & \text { otherwise }\end{cases} 69 | $$ 70 | 71 |
72 | 73 |
74 | 75 | **如图所示,在regression误差较小的时候,梯度能够分配一个较大值。** 76 | 77 | **Balanced L1 Loss给我的感觉就是,如果像普通的loss = loss-cls + a * loss-reg这种方式,通过改变a的值来均衡loss,这样会导致强迫网络去学习难的负例子(但是随着a的增加,作者发现模型对outliers更加敏感),但是这些难负例可能对分类没什么难度,分类跟希望学习到一些难正例,所以希望把注意力往inliers多放点,所以就有了这种改进,regression误差小的肯定就是在正例附近的,加大这一部分梯度使得网络多学习一点。这给人一中违背直觉的感觉,按理说我们需要把更多注意力刚在hard-sample上,这里却把更多注意力放在的easy-sample上,但是它的试验效果确实验证这这样做有用,而且能提升0.4个点。作者说的也不是很清楚,如果要强行解释的话可能跟第一步iou balance sample有关,第一不已经刷选出了hard sample,如果再往hard sample放更多的精力分类部分吃不消,分类更希望多一些正例(我瞎说的。。。。)** 78 | 79 | 80 | 81 | ## 总结: 82 | 83 | **Libra R-CNN分别从样本、特征和目标三个层面上出发去分析,通过iou balance sample的策略选取更有价值的学习样本,同时通过更合理的特征融合方式去融合多级特征,最后设计一个Balanced L1 Loss来均衡loss。除了最后一个Balanced L1 Loss让我有点反直觉之外,其余两部分的工作还是很扎实的,分析了其余方式的利弊再提出自己的解决方案,确实能够提升不少网络性能。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/Libra R-CNN.md: -------------------------------------------------------------------------------- 1 | # **Libra R-CNN: Towards Balanced Learning for Object Detection** 2 | 3 | ## 概述: 4 | 5 | **paper link:https://arxiv.org/pdf/1904.02701.pdf** 6 | 7 | **code link: https://github.com/OceanPang/Libra_R-CNN** 8 | 9 | **Libra R-CNN现有two-satge检测框架得问题分别从样本层面、特征层面和目标层面出发,提出IOU-balanced sampling,balanced feature pytamid,balanced L1 loss。主要解决选取高质量样本、更加有效融合mult-stage特征和更加关注难例的学习。** 10 | 11 | 12 | ​ 13 | 14 | ## 具体实现 15 | 16 | ### 1. Sample level imbalance: 17 | 18 | **在网络训练过程中,难例是能够十分有效提升训练结果的,但是一般random sampling往往会取到更到的easy sample,为了解决这个问题,有两个常用的方案:** 19 | 20 | - **OHEM,OHEM通过对loss进行排序,认为loss较大的是难例,按照一定比例选取top-k的难例就可以了。但是OHEM存在一个问题就是noise label非常敏感,而且有一个较大的内存和计算成本。** 21 | - **Focal Loss,Focal loss在two-stage阶段框架中表现效果并不是很突出,由于在RPN阶段大量简单样本在这一阶段被滤掉了。** 22 | 23 | 24 | 25 | **争对上面两种情况,作者提出了 IoU-balanced Sampling** 26 | 27 |
28 | 29 |
30 | 31 | 32 | **如上图所示,作者发现,60%的难例出现在iou>0.05的情况下,而random sampling则仅提供30%的难例子。假设一共要选N个负例,其中总共有M个负例,那么在random sampling情况下每个样本选择的概率为P=N/M。为了提升难例的概率,按照iou均分成K个bin,要选的N个负例在K个bin里面是等概率的,如下式所示(MK表示在这个IOU区间内候选框的个数):** 33 | 34 |
35 | 36 |
37 | 38 | 39 | 40 |
41 | 42 |
43 | 44 | **从上图可以看出,通过iou balance选出的负例跟靠近目标一些,大都集中在目标周围。需要注意的是iou balance选取的是负例,正例还是按正常去选取。** 45 | 46 | 47 | 48 | ### 2.**Feature level imbalance**: 49 | 50 | **常见的特征融合方案一般为FPN top-down的方式融合,PANet在词基础上添加了botton-up的融合路径,但是这两样融合方式都存在一个问题,那就是融合特征跟关注相邻的特征层,不相邻的特征层会随着层数的增加不断稀释。为此提出了Feature level imbalance,包含如下四步:** 51 | 52 | - **rescaling,把不同层的特征resale到同以分辨率(一般resale到8倍下采样分辨率),最后进行相加,此时不同层的贡献是一样的** 53 | - **integrating,resale的特征在逆向回原来的分辨率再与原特征进行相加** 54 | - **refining,融合的特征需要进行一些卷积消化一下,作者对比了卷积和 non-local module,最终选择 non-local module,采用Gaussian non-local attention** 55 | - **strengthening,这个不知道,论文好像没有具体提出。** 56 | 57 |
58 | 59 |
60 | 61 | ### 3.Balanced L1 Loss 62 | 63 | **Balanced L1 Loss主要是解决多任务学习过程中loss权重分配的一个问题,检测任务一般分为分类跟回归两个任务,loss = loss-cls + a * loss-reg,这个a就是一个平衡系数,我们可以通过改变a的值平衡分类跟回归loss。但是随着a的增加,作者发现模型对outliers更加敏感,outliers可以认为是难例,为了分类问题的准确性如果把过多注意力放在难例上(负例),难免导致分类结果不佳,那么如果去平衡outliers和inliers,作者因此提出了一个Balanced L1 Loss:** 64 | 65 |
66 | 67 |
68 | 69 |
70 | 71 |
72 | 73 | **如图所示,在regression误差较小的时候,梯度能够分配一个较大值。** 74 | 75 | **Balanced L1 Loss给我的感觉就是,如果像普通的loss = loss-cls + a * loss-reg这种方式,通过改变a的值来均衡loss,这样会导致强迫网络去学习难的负例子(但是随着a的增加,作者发现模型对outliers更加敏感),但是这些难负例可能对分类没什么难度,分类跟希望学习到一些难正例,所以希望把注意力往inliers多放点,所以就有了这种改进,regression误差小的肯定就是在正例附近的,加大这一部分梯度使得网络多学习一点。这给人一中违背直觉的感觉,按理说我们需要把更多注意力刚在hard-sample上,这里却把更多注意力放在的easy-sample上,但是它的试验效果确实验证这这样做有用,而且能提升0.4个点。作者说的也不是很清楚,如果要强行解释的话可能跟第一步iou balance sample有关,第一不已经刷选出了hard sample,如果再往hard sample放更多的精力分类部分吃不消,分类更希望多一些正例(我瞎说的。。。。)** 76 | 77 | 78 | 79 | ## 总结: 80 | 81 | **Libra R-CNN分别从样本、特征和目标三个层面上出发去分析,通过iou balance sample的策略选取更有价值的学习样本,同时通过更合理的特征融合方式去融合多级特征,最后设计一个Balanced L1 Loss来均衡loss。除了最后一个Balanced L1 Loss让我有点反直觉之外,其余两部分的工作还是很扎实的,分析了其余方式的利弊再提出自己的解决方案,确实能够提升不少网络性能。** 82 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Base/two-stage/R-FCN.md: -------------------------------------------------------------------------------- 1 | # R-FCN:Object Detection via Region-based Fully Convolutional Networks 2 | 3 | ## 概述: 4 | 5 | **R-FCN提出PS-ROI-Pooling层不需要每一个roi单独提取特征再进行全连接操作进行分类和回归,R-FCN是全卷积网络能够提升训练和测试阶段的检测速度。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | ​ **图1** 13 | 14 | ## 具体实现 15 | 16 | ### 1. Backbone: 17 | 18 | **作者论文实验中使用的ResNet-101,同时修改了部分网络,把conv5的stride=2改为了stride=1,同时中间卷积层的dilation设置为2,增加感受野。这样最后最总特征图谱为16倍下采样** 19 | 20 | 21 | 22 | ### 2. Neck: 23 | 24 | **Neck部分这里即为RPN部分,可参考Faster-RCNN的RPN部分。** 25 | 26 | 27 | 28 | ### 3. Head: 29 | 30 | **RPN阶段刷选出rois通过position-sensitive RoI pooling layer,通过PS-ROI-Pooling操作提取特征来分类和回归。如下图所示:** 31 | 32 |
33 | 34 |
35 | 36 | 37 | 38 | ### 4. position-sensitive RoI pooling: 39 | 40 | **RPN得到的features会被复用到后面的分类中,这个特征提取器文中是使用的resnet101,假设这个特征图的大小是[1, H, W, 1024],本来ROI Pooling直接就在这上面截取ROI来分类了,而现在我们再后面再接上ResNet的C5(1024->2048, dilation=2),继续在上面接一个1x1的卷积(2048->1024),这个操作是为了降维和通道整合,同时不改变特征图大小。再经过一个1x1的卷积,把通道缩减为k x k x (C+1),这里的k指的是bin的数量,也就是上面说的3,类别假设是20,在实际的实现中,大部分的情况k=7。现在特征图大小是[1, H, W, 3x3x21]了,如下图,相同颜色的特征图对应着结果中对应颜色的位置,比如黄色的特征图对应结果中的左上角。特征图被分为9x21通道,每21个特征图代表这个位置(比如左上角)的21个分类的分数,比如[0~20]的特征图中每个点(x, y)表示原图上这个点是对应物体“左上部分“的概率,[21~41]的特征图中每个点(x, y)表示原图上这个点是对应物体“上部分“的概率,以此类推。为了更直观的说明PS-ROIPooling的过程,如下的示意图所示:** 41 | 42 |
43 | 44 |
45 | 46 | **在上图中,每个ROI也被分为了3x3的bins,就和我们在普通的ROIPooling中做的一样,在确定完输入和输出的映射以后,PS-ROIPooling把对应的block中的值求Average Pooling(红色箭头),最后得出了一个[1x1x21]的向量。在经过PS-ROIPooling之后,把对应的特征图的部分做Average Pooling后的9个[1x1x21]的特征图后把这些特征图拼成[9x9x21],这个新的特征图的每个位置表示了该ROI候选框的9个子块区域是21个物体某一部分的概率。** 47 | 48 | ### 5. Sample Assignment: 49 | 50 | ​ **可参考[Faster-RCNN的Sample Assignment部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/two-stage/Faster-RCNN.md)。** 51 | 52 | ### 6. Decode: 53 | 54 | ​ **可参考[Faster-RCNN的Decode部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/two-stage/Faster-RCNN.md)。** 55 | 56 | ### 7. Loss: 57 | 58 | ​ **可参考[Faster-RCNN Loss部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/two-stage/Faster-RCNN.md)。** 59 | 60 | ### 8. 总结 61 | 62 | **我认为R-FCN最大的贡献是去除了Faster-RCNN的全链接层,用全卷积层来进行end-to-end训练,在训练和inference阶段能够较小计算量。至于论文里面所得位置敏感得分图的解释我觉得是有点自圆其说的感觉。** 63 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/CenterNet - SRC.md: -------------------------------------------------------------------------------- 1 | ## CenterNet 2 | 3 | ## 1.概述: 4 | 5 | **centernet预测中心点、宽高和偏置,无IOU、无nms,整个框架十分简介** 6 | 7 |
8 | 9 |
10 | #### 11 | 12 | ## 2. 具体实现: 13 | 14 | ### 2.1 Backbone: 15 | 16 | **主干网络可以用Hourglass、DLA、ResNet等** 17 | 18 | 19 | 20 | ### 2.2 Head: 21 | 22 | **输入经Backbone后输出3个分支:** 23 | 24 | - **类别分支** 25 | $$ 26 | \large \hat{Y}\in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C},R为下采样倍数,一般为4倍;W,H为原图大小,C为类别数(coco 80) \\ 27 | $$ 28 | 29 | 30 | - **偏置分支** 31 | $$ 32 | \large \hat{O} \in \mathcal{R}^{\frac{W}{R} \times \frac{H^{2}}{R} \times 2} 33 | $$ 34 | 35 | - **宽高分支** 36 | $$ 37 | \large \hat{S} \in \mathcal{R}^{\frac{W}{R} \times \frac{H^{2}}{R} \times 2} 38 | $$ 39 | 40 | 41 | 42 | ### 2.3 Sample Assignment: 43 | 44 | **正负样本分配与[CornerNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Free/Key-Point/CornerNet.md)一样,确定一个高斯半径,以目标中心为高斯中心去初始化样本标签。** 45 | 46 | 47 | 48 | ### 2.4 Loss 49 | 50 | - **分类Loss** 51 | 52 | **分类Loss采用focal loss** 53 | $$ 54 | \large L_{k}=\frac{-1}{N} \sum_{x y c}\left\{\begin{array}{cl} 55 | \large \left(1-\hat{Y}_{x y c}\right)^{\alpha} \log \left(\hat{Y}_{x y c}\right) & \text { if } Y_{x y c}=1 \\ 56 | \large \left(1-Y_{x y c}\right)^{\beta}\left(\hat{Y}_{x y c}\right)^{\alpha} & \\ 57 | \large \log \left(1-\hat{Y}_{x y c}\right) & \text { otherwise } 58 | \large \end{array}\right. 59 | $$ 60 | 61 | - **offset Loss** 62 | 63 | **offset loss采用L1loss,猜测L2 loss在初始化初期训练不稳定** 64 | $$ 65 | \large L_{o f f}=\frac{1}{N} \sum_{p}\left|\hat{O}_{\tilde{p}}-\left(\frac{p}{R}-\tilde{p}\right)\right| 66 | $$ 67 | 68 | - **宽高loss** 69 | 70 | **宽高loss任然采用L1 Loss** 71 | $$ 72 | \large L_{\text {size }}=\frac{1}{N} \sum_{k=1}^{N}\left|\hat{S}_{p_{k}}-s_{k}\right|\\ 73 | \large s_{k}=\left(x_{2}^{(k)}-x_{1}^{(k)}, y_{2}^{(k)}-y_{1}^{(k)}\right)\\ 74 | \large \hat{S} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2} 75 | $$ 76 | 77 | - **mult-Loss** 78 | $$ 79 | \large L_{det} = L_{k}+\lambda_{size}L_{size}+\lambda_{off}L_{off} 80 | $$ 81 | 82 | - 83 | 84 | 85 | 86 | ### 2.5 inference 87 | 88 |
89 | 90 |
91 | 92 | ## 3. 总结: 93 | 94 | **CenterNet网络设计十分简单,较CornerNet实现起来容易很多,也可用于关键点检测等任务,无需nms后处理。缺点是如果相同种类的目标中心很近那么它只能回归一个目标。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/CenterNet.md: -------------------------------------------------------------------------------- 1 | ## CenterNet 2 | 3 | ## 1.概述: 4 | 5 | **centernet预测中心点、宽高和偏置,无IOU、无nms,整个框架十分简介** 6 | 7 |
8 | 9 |
10 | #### 11 | 12 | ## 2. 具体实现: 13 | 14 | ### 2.1 Backbone: 15 | 16 | **主干网络可以用Hourglass、DLA、ResNet等** 17 | 18 | 19 | 20 | ### 2.2 Head: 21 | 22 | **输入经Backbone后输出3个分支:** 23 | 24 | - **类别分支** 25 | 26 |
27 | 28 |
29 | 30 | 31 | 32 | - **偏置分支** 33 | 34 |
35 | 36 |
37 | 38 | - **宽高分支** 39 | 40 |
41 | 42 |
43 | 44 | 45 | 46 | ### 2.3 Sample Assignment: 47 | 48 | **正负样本分配与[CornerNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Free/Key-Point/CornerNet.md)一样,确定一个高斯半径,以目标中心为高斯中心去初始化样本标签。** 49 | 50 | 51 | 52 | ### 2.4 Loss 53 | 54 | - **分类Loss** 55 | 56 | **分类Loss采用focal loss** 57 | 58 |
59 | 60 |
61 | 62 | - **offset Loss** 63 | 64 | **offset loss采用L1loss,猜测L2 loss在初始化初期训练不稳定** 65 | 66 |
67 | 68 |
69 | 70 | - **宽高loss** 71 | 72 | **宽高loss任然采用L1 Loss** 73 | 74 |
75 | 76 |
77 | 78 | 79 | 80 | - **mult-Loss** 81 | 82 |
83 | 84 |
85 | 86 | - 87 | 88 | 89 | 90 | ### 2.5 inference 91 | 92 |
93 | 94 |
95 | 96 | ## 3. 总结: 97 | 98 | **CenterNet网络设计十分简单,较CornerNet实现起来容易很多,也可用于关键点检测等任务,无需nms后处理。缺点是如果相同种类的目标中心很近那么它只能回归一个目标。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/FASF-src.md: -------------------------------------------------------------------------------- 1 | ## FASF-Feature Selective Anchor-Free Module for Single-Shot Object DetectionFeature Selective Anchor-Free Module for Single-Shot Object Detection 2 | 3 | ## 1.概述: 4 | 5 | **目前基于anchor的目标检测方法,大多采用不同的level预测不同尺度的instance,而分配规则往往是人为设计的,这导致anchor的匹配策略可能不是最优的。本文提出了feature selective anchor-free module来解决这个限制,让每个示例动态选择最适合自己的特征层级,并且FASF可以与anchor-based 分支协同并行工作,提高模型效果。在one-stage模型基础上添加一个anchor-freen部分,论文以retinanet作为例子如下图所示。** 6 | 7 |
8 | 9 |
10 | 11 | ## 2. 具体实现: 12 | 13 | ### 2.1 Backbone: 14 | 15 | **主干网络参考[RetinaNet主干网络](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)** 16 | 17 | ### 2.2 Neck: 18 | 19 | **Neck部分参考[RetinaNet Neck](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)** 20 | 21 | ### 2.3 Head: 22 | 23 | **输入经Backbone后输出3个分支:** 24 | 25 | - **Anchor Base分支** 26 | 27 | **Anchor Base分支参考[RetinaNet Head](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)** 28 | 29 | - **Anchor Free分支** 30 | 31 | **FASF在RetinaNet基础上添加了一个Anchor-Free分支,anchor-free分支由两部分组成:类别分支、回归分支。类别分支C个通道(C为类别总数,回归分支由4通道组成:(cx,cy,w,h))。** 32 | 33 | ### 2.4 Sample Assignment: 34 | 35 | **Anchor-Base分支的正负样本分配与[RetinaNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)一样,还是依靠IOU来分配正负样本,这里不做详细介绍。Anchor-Free部分的正负样本分配如下图所示:** 36 | 37 |
38 | 39 |
40 | 41 | $$ 42 | \large 实例I原始坐标信息为b=[x,y,w,h],x,y为实例的中心点,w,h为实例的宽和高。\\ 43 | \large I在第l层特征P_{l}的坐标为b^l_{p}=[x^l_{p},y^l_{p},w^l_{p},h^l_{p}],b^l_{p} = b/2^l\\ 44 | \large 以b^l_{p}为base,建立effective box和ignoring box分别表示为\\ 45 | \large b^l_{e}=[x^l_{e},y^l_{e},w^l_{e},h^l_{e}],b^l_{i}=[x^l_{i},y^l_{i},w^l_{i},h^l_{i}] 46 | $$ 47 | 48 | $$ 49 | \large effective box和ignoring box的建立规则是,是以base的中心点为中心,\\ 50 | \large base的宽高*\epsilon_{e}的区域为有效box区域,base的宽高*\epsilon_{i}的区域为忽略box区域。 51 | \large \epsilon_{e}默认值为0.2,\epsilon_{i}默认值为0.5。 52 | $$ 53 | 54 | **如上图所示,这是目标在第L层特征图的实例,红色区域为正样本区域对应类别的特征图该区域标签为1,灰色区域为忽略区域,对应类别的特征图该区域标签为-1,其余为负例子,对应标签为0。两个同一类别的不同实例如果在同一特征层重叠,则优先考虑目标小的实例。** 55 | 56 | ### 2.5 Encode-Decode: 57 | 58 | **Anchor-Base分支的encode-decode与[RetinaNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)一样,这里主要讨论Anchor-Free分支的编解码部分** 59 | 60 | - **Encode** 61 | $$ 62 | \large 仅回归有效区域的框,对于每一个在b^l_{e}的点(i,j),用一个4维度向量d^l_{i,j}表示,\\ 63 | \large d^l_{i,j}=[d^l_{t_{i,j}},d^l_{l_{i,j}},d^l_{b_{i,j}},d^l_{r_{i,j}}]\\ 64 | \large d^l_{t},d^l_{l},d^l_{b},d^l_{r}分别表示原始框与当前位置(i,j)的顶部,左部,底部,右部的距离。\\ 65 | $$ 66 | 67 | $$ 68 | \large 蓝色为实例I的box区域,红色为有效区域,两个小黑点代表有效区域里面的点(i,j),\\ 69 | \large 灰色箭头就是(i,j)顶部,左部,底部,右部距离[d^l_{t_{i,j}},d^l_{l_{i,j}},d^l_{b_{i,j}},d^l_{r_{i,j}}]。\\ 70 | \large 最终还需要把这4维向量除以S即d^l_{i,j} / S,\\ 71 | \large S是一个归一化参数,为了防止训练的时候不收敛。论文里面把S设置为4 72 | $$ 73 | 74 | 75 | 76 |
77 | 78 |
79 | 80 | - **Decode** 81 | 82 | $$ 83 | \large 假设第l层位置(i,j)的网络输出的4-dim向量表示为\\ 84 | \large \left[\hat{o}_{t_{i, j}}, \hat{o}_{l_{i, j}}, \hat{O}_{b_{i, j}}, \hat{O}_{r_{i, j}}\right],然后乘以归一化系数S(默认为4),为\left[S \large \hat{o}_{t_{i, j}}, S \hat{o}_{l_{i, j}}, S \hat{o}_{b_{i, j}}, S \hat{o}_{r_{i, j}}\right],\\ 85 | \large top-left和right-bottom的值表\large 示为:\left.\left(i-S \hat{o}_{t_{i, j}}, j-S \hat{o}_{l_{i, j}}\right) \text { and }\left(i+S \hat{o}_{b_{i, j}}, j+S \large \hat{o}_{r_{i, j}}\right]\right),\\ 86 | \large 最后再把该值乘以2^l即为实际坐标 87 | $$ 88 | 89 | 90 | 91 | ### 2.4 Loss 92 | 93 | **Anchor-Base分支的Loss与[RetinaNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)一样,下面主要讨论Anchor-Free部分的Loss** 94 | 95 | - **分类 Loss** 96 | 97 | **分类Loss采用focal-loss** 98 | 99 | - **回归loss** 100 | 101 | **回归Loss采用IOU Loss** 102 | 103 | 104 | ### 2.6 online feature selecetion: 105 | 106 | $$ 107 | \large 实例I在第l层特征的分类和回归loss分别用L^I_{FL}(l)和L^I_{IOU}{l}表示,然后它的有效box的平均loss\\ 108 | \large \begin{aligned}L_{F L}^{I}(l) &=\frac{1}{N\left(b_{e}^{l}\right)} \sum_{i, j \in b_{e}^{l}} F L(l, i, j) \\ 109 | \large L_{I o U}^{I}(l) &=\frac{1}{N\left(b_{e}^{l}\right)} \sum_{i, j \in b_{e}^{l}} \operatorname{IoU}(l, i, j)\end{aligned}\\ 110 | \large N\left(b_{e}^{l}\right)代表有效区域的像素点个数,最后看该实例I在哪层特征的loss最低\\ 111 | \large 就认为该层适合该实例\\ 112 | \large l^{*}=\arg \min _{l} L_{F L}^{I}(l)+L_{I o U}^{I}(l)\\ 113 | \large 在训练得时候只更新该实例对应最优层部分的loss,在inference的时候不用feature\\ 114 | \large selection模块,因为训练的时候已经保证了该实例在其最优层能够取得最大得分 115 | $$ 116 | 117 | 118 | 119 | 120 | 121 | ### 2.7 inference 122 | 123 | **在anchor-free在每个特征层选取前1k的得分对应的类别和位置,然后同0.05的得分阈值滤除部分预测值,最后和anchor-base的预测组合再一起使用nms得出最终的预测。** 124 | 125 | 126 | ## 3. 总结: 127 | 128 | **FASF网络能够兼容anchor-base网络,与anchor-base联合训练互补提高网络性能,利用在线特征选取模块能够有效为每个实例分配最优特征层.** 129 | 130 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/FASF.md: -------------------------------------------------------------------------------- 1 | ## FASF-Feature Selective Anchor-Free Module for Single-Shot Object DetectionFeature Selective Anchor-Free Module for Single-Shot Object Detection 2 | 3 | ## 1.概述: 4 | 5 | **目前基于anchor的目标检测方法,大多采用不同的level预测不同尺度的instance,而分配规则往往是人为设计的,这导致anchor的匹配策略可能不是最优的。本文提出了feature selective anchor-free module来解决这个限制,让每个示例动态选择最适合自己的特征层级,并且FASF可以与anchor-based 分支协同并行工作,提高模型效果。在one-stage模型基础上添加一个anchor-freen部分,论文以retinanet作为例子如下图所示。** 6 | 7 |
8 | 9 |
10 | 11 | ## 2. 具体实现: 12 | 13 | ### 2.1 Backbone: 14 | 15 | **主干网络参考[RetinaNet主干网络](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)** 16 | 17 | ### 2.2 Neck: 18 | 19 | **Neck部分参考[RetinaNet Neck](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)** 20 | 21 | ### 2.3 Head: 22 | 23 | **输入经Backbone后输出3个分支:** 24 | 25 | - **Anchor Base分支** 26 | 27 | **Anchor Base分支参考[RetinaNet Head](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)** 28 | 29 | - **Anchor Free分支** 30 | 31 | **FASF在RetinaNet基础上添加了一个Anchor-Free分支,anchor-free分支由两部分组成:类别分支、回归分支。类别分支C个通道(C为类别总数,回归分支由4通道组成:(cx,cy,w,h))。** 32 | 33 | ### 2.4 Sample Assignment: 34 | 35 | **Anchor-Base分支的正负样本分配与[RetinaNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)一样,还是依靠IOU来分配正负样本,这里不做详细介绍。Anchor-Free部分的正负样本分配如下图所示:** 36 | 37 |
38 | 39 |
40 |
41 | 42 |
43 | 44 | **如上图所示,这是目标在第L层特征图的实例,红色区域为正样本区域对应类别的特征图该区域标签为1,灰色区域为忽略区域,对应类别的特征图该区域标签为-1,其余为负例子,对应标签为0。两个同一类别的不同实例如果在同一特征层重叠,则优先考虑目标小的实例。** 45 | 46 | ### 2.5 Encode-Decode: 47 | 48 | **Anchor-Base分支的encode-decode与[RetinaNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)一样,这里主要讨论Anchor-Free分支的编解码部分** 49 | 50 | - **Encode** 51 | 52 |
53 | 54 |
55 | 56 | 57 | 58 |
59 | 60 |
61 | 62 | - **Decode** 63 | 64 | 65 | 66 |
67 | 68 |
69 | 70 | ### 2.4 Loss 71 | 72 | **Anchor-Base分支的Loss与[RetinaNet](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/RetinaNet.md)一样,下面主要讨论Anchor-Free部分的Loss** 73 | 74 | - **分类 Loss** 75 | 76 | **分类Loss采用focal-loss** 77 | 78 | - **回归loss** 79 | 80 | **回归Loss采用IOU Loss** 81 | 82 | 83 | ### 2.6 online feature selecetion: 84 | 85 |
86 | 87 |
88 | 89 | ### 2.7 inference 90 | 91 | **在anchor-free在每个特征层选取前1k的得分对应的类别和位置,然后同0.05的得分阈值滤除部分预测值,最后和anchor-base的预测组合再一起使用nms得出最终的预测。** 92 | 93 | 94 | ## 3. 总结: 95 | 96 | **FASF网络能够兼容anchor-base网络,与anchor-base联合训练互补提高网络性能,利用在线特征选取模块能够有效为每个实例分配最优特征层.** 97 | 98 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/FCOS-SRC.md: -------------------------------------------------------------------------------- 1 | ## FCOS 2 | 3 | ## 1.概述: 4 | 5 | **算法是一种基于FCN的逐像素目标检测算法,实现了无锚点(anchor-free)、无提议(proposal free)的解决方案,并且提出了中心度(Center—ness)的思想,同时在召回率等方面表现接近甚至超过目前很多先进主流的基于锚框目标检测算法。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | ## 2. 具体实现: 13 | 14 | ### 2.1 Backbone: 15 | 16 | **------** 17 | 18 | ### 2.2 Neck: 19 | 20 | **FPN部分作为网络Neck部分** 21 | 22 | ### 2.3 Head: 23 | 24 | **FCOS Head部分分为三个分支:类别分支、回归分支和中心度度量分支** 25 | 26 | ### 2.4 Encode-Decode: 27 | 28 | $$ 29 | \large \begin{aligned} 30 | \large 输入的gt集合为\left\{B_{i}\right\},B_{i}=\left(x_{0}^{(i)}, y_{0}^{(i)}, x_{1}^{(i)},y_{1}^{(i)}, c^{(i)}\right) \\ 31 | \large \left(x_{0}^{(i)}, y_{0}^{(i)}\right),\left(x_{1}^{(i)}, y_{1}^{(i)}\right)分别表示左上和右下点的坐标,c_{i}为第i个类被。\\ 32 | \large (x,y)为改box里面的点坐标。 33 | \large \end{aligned} 34 | $$ 35 | 36 | 37 | $$ 38 | \large \begin{aligned}每一个正样本回归一个四维向量,t ^ { * } = ( l ^ { * } , t ^ { * } , r ^ { * } , b ^ { * } ),\\ 39 | \large l ^ { * } , t ^ { * } , r ^ { * } , b ^ { * }分别是left,top,right,booton到点(x,y)的距离 \\ 40 | \large l^{*}=x-x_{0}^{(i)}, & t^{*}=y-y_{0}^{(i)}, \\ 41 | \large r^{*}=x_{1}^{(i)}-x, \quad b^{*}=y_{1}^{(i)}-y . 42 | \end{aligned} 43 | $$ 44 | 45 |
46 | 47 |
48 | 49 | ### 2.4 Sample Assignment: 50 | 51 | **与FASF不一样,FCOS把所有在目标区域的点都认为是正样本,其余为负样本。为了使不同层级的特征回归对应目标,不同于anchor-base依据iou来把目标分配到对应的FPN层,FCOS分配规则如下:** 52 | $$ 53 | \large ( l ^ { * } , t ^ { * } , r ^ { * } , b ^ { * } ) >= m _ { i }且( l ^ { * } , t ^ { * } , r ^ { * } , b ^ { * } ) < m _ { i+1}则改特征属于第i层FPN,其余层的改box不做回归。\\ 54 | \large m _ { i }是第i层的最大距离。各层的最大距离为m _ { 3 },m _ { 4 },m _ { 5 },m _ { 6 },m _ { 7 }分别为0,64,128,256,512,+无穷\\ 55 | $$ 56 | **值得注意的是,即便是使用了多层预测,仍然会存在一个位置(x,y)可能存在多个相同类别的实例都为正例,这时简单的选取(x,y)属于面积较小的那个实例。如下图所示:黑色和蓝色区域是同一层两个相同类别的实例,红点即在黑色区域也在蓝色区域里面,这时我们把红点分配给面积较小的那个区域。** 57 | 58 |
59 | 60 |
61 | 62 | ### 2.5 中心度度量Center-Ness: 63 | 64 | **依据上诉的做法会产生很多原理目标中心的低质量框,这也很好理解,因为把目标宽区域所有的点都作为正样本,然后边界据这些点的偏置,这样负责回归正样本的数量会比较多,难免有错误的,为此提出了中心度度量center-ness。** 65 | $$ 66 | \large \text { centerness }^{*}=\sqrt{\frac{\min \left(l^{*}, r^{*}\right)}{\max \left(l^{*}, r^{*}\right)} \times \frac{\min \large \left(t^{*}, b^{*}\right)}{\max \left(t^{*}, b^{*}\right)}} 67 | $$ 68 | **上式是训练centerness的编码,可见点越靠近目标中心centerness的值越高,inference的时候把centerness部分的网络输出值跟scores对应的值相乘,作为最终的scores。认为越靠近目标中心的回归越靠谱。centerness即理解为靠近目标中心度的一种度量。** 69 | 70 | ### 2.6 Loss 71 | 72 | - **分类Loss** 73 | 74 | **分类Loss采用Focal Loss** 75 | 76 | - **回归Loss** 77 | 78 | **回归Loss采用IOU Loss** 79 | 80 | - **中心度度量Loss** 81 | 82 | **Center-Ness Loss采用BCE Loss** 83 | 84 | ### 2.7 inference 85 | 86 | **inference的时候把centerness部分的网络输出值跟scores对应的值相乘,作为最终的scores。** 87 | 88 | **** 89 | 90 | 91 | ## 3. 总结: 92 | 93 | **FCOS网络结构十分简单,同时利用了FPN多层特征能够有效检测多尺度目标,提出的中心度度量分支可以有效滤除低质量的输出,同时在相同目标拥挤场景下FCOS的性能并好,因为他输出的特征图只能在相同类别上回归一个目标,类似于wider-face这样的场景检测性能并不会理想。** 94 | 95 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/FCOS.md: -------------------------------------------------------------------------------- 1 | ## FCOS 2 | 3 | ## 1.概述: 4 | 5 | **算法是一种基于FCN的逐像素目标检测算法,实现了无锚点(anchor-free)、无提议(proposal free)的解决方案,并且提出了中心度(Center—ness)的思想,同时在召回率等方面表现接近甚至超过目前很多先进主流的基于锚框目标检测算法。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | ## 2. 具体实现: 13 | 14 | ### 2.1 Backbone: 15 | 16 | **------** 17 | 18 | ### 2.2 Neck: 19 | 20 | **FPN部分作为网络Neck部分** 21 | 22 | ### 2.3 Head: 23 | 24 | **FCOS Head部分分为三个分支:类别分支、回归分支和中心度度量分支** 25 | 26 | ### 2.4 Encode-Decode: 27 | 28 |
29 | 30 |
31 |
32 | 33 |
34 | 35 | ### 2.4 Sample Assignment: 36 | 37 | **与FASF不一样,FCOS把所有在目标区域的点都认为是正样本,其余为负样本。为了使不同层级的特征回归对应目标,不同于anchor-base依据iou来把目标分配到对应的FPN层,FCOS分配规则如下:** 38 | 39 |
40 | 41 |
42 | 43 | **值得注意的是,即便是使用了多层预测,仍然会存在一个位置(x,y)可能存在多个相同类别的实例都为正例,这时简单的选取(x,y)属于面积较小的那个实例。如下图所示:黑色和蓝色区域是同一层两个相同类别的实例,红点即在黑色区域也在蓝色区域里面,这时我们把红点分配给面积较小的那个区域。** 44 | 45 |
46 | 47 |
48 | 49 | ### 2.5 中心度度量Center-Ness: 50 | 51 | **依据上诉的做法会产生很多原理目标中心的低质量框,这也很好理解,因为把目标宽区域所有的点都作为正样本,然后边界据这些点的偏置,这样负责回归正样本的数量会比较多,难免有错误的,为此提出了中心度度量center-ness。** 52 |
53 | 54 |
55 | 56 | **上式是训练centerness的编码,可见点越靠近目标中心centerness的值越高,inference的时候把centerness部分的网络输出值跟scores对应的值相乘,作为最终的scores。认为越靠近目标中心的回归越靠谱。centerness即理解为靠近目标中心度的一种度量。** 57 | 58 | ### 2.6 Loss 59 | 60 | - **分类Loss** 61 | 62 | **分类Loss采用Focal Loss** 63 | 64 | - **回归Loss** 65 | 66 | **回归Loss采用IOU Loss** 67 | 68 | - **中心度度量Loss** 69 | 70 | **Center-Ness Loss采用BCE Loss** 71 | 72 | ### 2.7 inference 73 | 74 | **inference的时候把centerness部分的网络输出值跟scores对应的值相乘,作为最终的scores。** 75 | 76 | **** 77 | 78 | 79 | ## 3. 总结: 80 | 81 | **FCOS网络结构十分简单,同时利用了FPN多层特征能够有效检测多尺度目标,提出的中心度度量分支可以有效滤除低质量的输出,同时在目标拥挤场景下FCOS的性能并不是太好,因为他输出的特征图只能在相同类别上回归一个目标,类似于wider-face这样的场景检测性能并不会理想。** 82 | 83 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/Soft Anchor-Point Object Detection - SRC.md: -------------------------------------------------------------------------------- 1 | ## Soft Anchor-Point Object Detection 2 | 3 | ## 1.概述: 4 | 5 | **Soft Anchor-Point Object Detection主要是解决Anchor-free框架中的abchor-point检测精度不高的问题。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | ## 2. 具体实现: 13 | 14 | ### 2.1 Backbone: 15 | 16 | **------** 17 | 18 | ### 2.2 Neck: 19 | 20 | **FPN部分作为网络Neck部分** 21 | 22 | ### 2.3 Head: 23 | 24 | **FCOS Head部分分为两个分支:类别分支、回归分支** 25 | 26 | ### 2.4 Encode-Decode: 27 | 28 | **Encode-Decode部分可参考[FCOS](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Free/Anchor-Point/FCOS.md)** 29 | 30 | 31 | ### 2.4 Sample Assignment: 32 | 33 | **Soft Anchor-Point Object Detection的核心在于样本分配上,认为anchor-point精度有待提高的原因:** 34 | 35 | - **所有围绕每一个实例的正例都给一样权重去回归,这样会照成很多得分高但是位置不精确,位置精确但是得分低的情况** 36 | - **没有充分利用FPN层,anchor-base中每一个实例按照其IOU可能会分配到不同的FPN层中,FCOS则仅分配到对应大小的特征层,FASF则按照loss大小分配到最合适的特征层,他们都只分配的一个层。** 37 | 38 | **针对上述现象提出了如下解决方案:** 39 | 40 | **如下图所示,作者认为实例被某一特征层激活,那么相邻的特征层改区域也被激活了,特征层之间离的越远相应激活的越小。所以同一实例可以被不同层级特征表示,但是赋予的权重不一样。因此设计了特征选择网络。** 41 | 42 |
43 | 44 |
45 | 46 | - **对围绕每一个实例的正例,在计算loss的时候加一个权重系数,离实例中心越近的正例权重越大,越远的权重越小。** 47 | $$ 48 | \large w_{l i j}=\left\{\begin{array}{ll}f\left(p_{l i j}, B\right), & \exists B, p_{l i j} \in B_{v} \\ 49 | \large 0, & \text { otherwise } 50 | \large \end{array}\right.\\ 51 | \large w_{l i j}是attention权重,p_{l i j}是实例B在第l层特征的一个位于(i,j)的正例。f\left(p_{l i j}, B\right)是一个\\ 52 | \large 反应p_{l i j}到B边界的一个距离函数,文中用: 53 | \large f\left(p_{l i j}, B\right)=\left[\frac{\min \left(d_{l i j}^{l}, d_{l i j}^{r}\right) \min \left(d_{l i j}^{t}, d_{l i \large j}^{b}\right)}{\max \left(d_{l i j}^{i}, d_{l i j}^{r}\right) \max \left(d_{l i j}^{t}, d_{l i j}^{b}\right)}\right]^{\eta}\\ 54 | \large \eta设置为1。\left(d_{l i j}^{l}, d_{l i j}^{r},d_{l i j}^{t}, d_{l i j}^{b}\right)分别代表第l层特征距离目标中心点(i,j)的左、右、上、下的距离。\\ 55 | \large 可知但在中心点是f(p_{lij},B)为越远离中心点越小。论文中otherwise为1我觉得错了。\\ 56 | \large 假设实例B用(c,x,y,w,h)表示,B_{v}为有效bbox,B_{v}=(c, x, y, \epsilon w, \epsilon h),\\ 57 | \large \epsilon是一个缩放系数,即在B一定区域内的sample作为正样本,其余为负样本。 58 | $$ 59 | 60 | - 61 | 62 | 63 | 64 | ### 2.5 Loss 65 | 66 | - **分类Loss** 67 | 68 | **分类Loss采用Focal Loss** 69 | 70 | - **回归Loss** 71 | 72 | **回归Loss采用IOU Loss** 73 | 74 | - **实例权重Loss** 75 | 76 | **2.4节中提到的实例分配不同权重,在训练的时候需要为其分配标签,标签的分配形式如下:** 77 | 78 | **如下图所示,每一个实例通过roi-align在每个特征层之间提取特征,最后concate一起,通过soft-max函数输出看那一层的概率。这个监督信号参照FASF,看该实例在那一层loss最低则认为改实例属于那一层,就可以生成one-hot标签。例如一共3层特征,实例I在第1层特征loss最大,则one-hot标签为[0,1,0]。** 79 | 80 |
81 | 82 |
83 | 84 | 85 | 86 | ### 2.7 inference 87 | 88 | **inference的时候把centerness部分的网络输出值跟scores对应的值相乘,作为最终的scores。** 89 | 90 | **** 91 | 92 | 93 | ## 3. 总结: 94 | 95 | **FCOS网络结构十分简单,同时利用了FPN多层特征能够有效检测多尺度目标,提出的中心度度量分支可以有效滤除低质量的输出,同时在相同目标拥挤场景下FCOS的性能并好,因为他输出的特征图只能在相同类别上回归一个目标,类似于wider-face这样的场景检测性能并不会理想。** 96 | 97 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Anchor-Point/Soft Anchor-Point Object Detection.md: -------------------------------------------------------------------------------- 1 | ## Soft Anchor-Point Object Detection 2 | 3 | ## 1.概述: 4 | 5 | **Soft Anchor-Point Object Detection主要是解决Anchor-free框架中的abchor-point检测精度不高的问题。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | 13 | ## 2. 具体实现: 14 | 15 | ### 2.1 Backbone: 16 | 17 | **------** 18 | 19 | ### 2.2 Neck: 20 | 21 | **FPN部分作为网络Neck部分** 22 | 23 | ### 2.3 Head: 24 | 25 | **Soft Anchor-Point Head部分分为两个分支:类别分支、回归分支** 26 | 27 | ### 2.4 Encode-Decode: 28 | 29 | **Encode-Decode部分可参考[FCOS](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Free/Anchor-Point/FCOS.md)** 30 | 31 | 32 | ### 2.4 Sample Assignment: 33 | 34 | **Soft Anchor-Point Object Detection的核心在于样本分配上,认为anchor-point精度有待提高的原因:** 35 | 36 | - **所有围绕每一个实例的正例都给一样权重去回归,这样会照成很多得分高但是位置不精确,位置精确但是得分低的情况** 37 | - **没有充分利用FPN层,anchor-base中每一个实例按照其IOU可能会分配到不同的FPN层中,FCOS则仅分配到对应大小的特征层,FASF则按照loss大小分配到最合适的特征层,他们都只分配的一个层。** 38 | 39 | **针对上述现象提出了如下解决方案:** 40 | 41 | **如下图所示,作者认为实例被某一特征层激活,那么相邻的特征层改区域也被激活了,特征层之间离的越远相应激活的越小。所以同一实例可以被不同层级特征表示,但是赋予的权重不一样。因此设计了特征选择网络。** 42 | 43 |
44 | 45 |
46 | 47 | - **对围绕每一个实例的正例,在计算loss的时候加一个权重系数,离实例中心越近的正例权重越大,越远的权重越小。** 48 | 49 |
50 | 51 |
52 | 53 | ### 2.5 Loss 54 | 55 | - **分类Loss** 56 | 57 | **分类Loss采用Focal Loss** 58 | 59 | - **回归Loss** 60 | 61 | **回归Loss采用IOU Loss** 62 | 63 | - **实例权重Loss** 64 | 65 | **2.4节中提到的实例分配不同权重,在训练的时候需要为其分配标签,标签的分配形式如下:** 66 | 67 | **如下图所示,每一个实例通过roi-align在每个特征层之间提取特征,最后concate一起,通过soft-max函数输出看那一层的概率。这个监督信号参照FASF,看该实例在那一层loss最低则认为改实例属于那一层,就可以生成one-hot标签。例如一共3层特征,实例I在第1层特征loss最大,则one-hot标签为[0,1,0]。** 68 | 69 |
70 | 71 |
72 | **最终loss采用交叉熵loss,总的loss形式为:** 73 | 74 |
75 | 76 |
77 | 78 | ### 2.7 inference 79 | 80 | **inference的时候把centerness部分的网络输出值跟scores对应的值相乘,作为最终的scores。** 81 | 82 | **** 83 | 84 | 85 | ## 3. 总结: 86 | 87 | **Soft Anchor-Point Object Detection与FASF不同点在于FASF利用loss来判断该实例最符合哪一层特征,就把该实例分配到对应特征层,其余特征层军不回归该实例,Soft Anchor-Point 则认为不同实例在不同特征层都会有相应只是响应的大小不一样,所以用了一个软标签为实例在不同特征层之间都有一定的梯度回传。我认为这样的方式很好,相当于一个soft-label,避免网络过度执迷于某层特征的回归起到一定程度的过拟合作用。** 88 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/ATSS-SRC.md: -------------------------------------------------------------------------------- 1 | # ATSS:**Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection** 2 | 3 | ## 1.概述 4 | 5 | **ATSS通过对比试验发现造成anchor-base和anchor-free精度最大的区别是在正负样本选择上,进而通过分析目标统计学特征提出自动选择正负样本的方法,可以大幅提升检测精度。** 6 | 7 | ## 2.正文 8 | 9 | ### 2.1试验分析 10 | 11 | **Anchor-base和anchor-free主要有三个不同点,以RetinaNet和FCOS为例,主要不同点如下:** 12 | 13 | 1. **每个点Anchor的数量,RetinaNet在每个特征点预先定义一组anchor,FCOS则是每个特征点为一个anchor point** 14 | 2. **定义正负样本的形式,RetinaNet通过IOU来定义正负样本,FCOS则通过目标中心一定区域来定义正负样本** 15 | 3. **回归的方式,RetinaNet回归目标的anchor的bounding box,FCOS则是回归重点坐标和宽高。** 16 | 17 | 18 | 19 | **为了验证上面哪个差异是造成anchor-base和anchor-free差别的主要原因,作者首先通过把retinanet的正负样本选择策略与FCOS一样,再把FCOS的正负样本选择策略与RetinaNet一样做了对比试验,试验结果如下图所示:** 20 | 21 |
22 | 23 |
24 | 25 | ​ 图1 26 | 27 | **如上图所示,如果RetinaNet改成与FCOS一样的正负样本选取,map由37.0->37.8,如果FCOS改成与RetinaNet一样的正负样本选取,map由37.8->36.9.通过如上试验表明正负样本选取是照成anchor-base和anchor-free差异的一个很大因素,同时也证实了回归方式的影响不大。** 28 | 29 | ### 2.2 **Adaptive Training Sample Selection** 30 | 31 | 32 | 33 | **通过试验分析了由于正负样本的选择对anchor-base和anchor-free照成较大的差异,作者在此基础上提出了一个新的样本分配策略:** 34 | 35 | 1. **在每一个层特征金字塔,选取离目标中心点L2距离最近的top-k个anchor box,假设一共有L层,则每个object一共有L*k个anchor box。** 36 | 2. **计算这些anchor-box与object的iou用Dg表示,并计算他们的均值与方差mg和vg** 37 | 3. **计算iou阈值tg = mg+vg** 38 | 4. **选取iou大于tg的anchor box** 39 | 5. **如果该anchor-box被多个object选中,则把该anchor box分配给iou最高的object** 40 | 41 | **通过上面的步骤来选取正负样本,可以选取大约0.2*k*l的正样本,与目标的 scale,aspect ratio等因素无关。这与retinanet和fcos不同,他们传统的策略越大的目标可能分配更多的正样本。而且这中方式只有一个超参K,试验表明超参K对结果并不敏感。** 42 | 43 | **RetinaNet采用这种策略可以提升2.3个点,FCOS则有两个版本:** 44 | 45 | - **在原FCOS基础上仅用中线点采用的方式,选取top-k个正例,保留了原来FPN层的样本的分配策略。** 46 | - **完全采用ATSS的样本分配策略,用anchor-point改成anchor-box的回归,anchor-box的大小为8*S,aspec ratio为1:1,S为下采样步数。** 47 | 48 | **试验结果如下图所示:** 49 | 50 |
51 | 52 |
53 | 54 | ​ 图2 55 | 56 | **其中base-anchor的大小和aspect-ratio试验结果如下图所示:** 57 | 58 |
59 | 60 |
61 | 62 | ## 3.总结 63 | 64 | **ATSS通过以RetinaNet和FCOS的对比试验发现照成了anchor-base和anchor-free结果差异的因素,RetinaNet和FCOS我觉得是比较有代表性的算法,能够验证作者的试验。其实我一直也有类似的想法,anchor-base通过iou来选择样本确实有一定的局限性,FreeAnchors也分析这些局限性,通过center-point再选择anchor我觉得更加合理一些,哪怕前期iou比较小,后面学习的过程应该能纠正。把FCOS进行一番魔改确实精度提升了不老少,但是没有anchor-free的感觉了,整体框架复杂性提升了一下。整体来时ATSS提点还是十分明显的,复杂性也不是很高,超参很少,能够灵活嵌套在anchor-base和anchor-free中。** 65 | 66 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/CornerNet - SRC.md: -------------------------------------------------------------------------------- 1 | # CornerNet 2 | 3 | ## 1.概述 4 | 5 | **将目标检测问题看作关键点回归问题,通过检测目标框的左上角和右下角两个关键点得到预测框。整个检测网络的训练是从头开始的,并不基于预训练的分类模型,这使得用户能够自由设计特征提取网络,不用受预训练模型的限制。** 6 | 7 |
8 | 9 |
10 | 11 | **图1** 12 | 13 | ## 2.具体实现 14 | 15 | ### 2.1主干网络: 16 | 17 | **使用两个级联的Hourglass Network作为backbone network** 18 | 19 |
20 | 21 |
22 | 23 | **图2** 24 | 25 | ### 2.2Head: 26 | 27 | **输入经过Backbone产生两张heatmaps,一张用于左上角点的预测,一张用于右下角点的预测,其中每张heatmaps分为3个分支:** 28 | 29 | - **Heatmaps:[B,C,H/4,W/4];** 30 | 31 | **判断该点是哪个类别(可能有多个类别,所以解码的时候用sigmoid);** 32 | 33 | - **Embedding:[B,1,H/4,W/4];** 34 | 35 | **Embedding是看tl_corner跟br_corner的匹配情况,两个差值越小,说明这两个点越匹配;** 36 | 37 | - **Offsets:[B,2,H/4,W/4]** 38 | 39 | **Offsets是预测偏置,弥补下采样误差。** 40 | 41 | **如图2所示,在产生3个分支之前会经过一个CornerPooling的操作,如下图所示:** 42 | 43 |
44 | 45 |
46 | 47 | **图3** 48 | 49 | ### 2.3CornerPooling 50 | 51 |
52 | 53 |
54 | 55 | **图4** 56 | 57 | **如上图所示,因为CornerNet是预测左上角和右下角两个角点,但是这两个角点在不同目标上没有相同规律可循,如果采用普通池化操作,那么在训练预测角点支路时会比较困难。考虑到左上角角点的右边有目标顶端的特征信息(图4第一张图的头顶),左上角角点的下边有目标左侧的特征信息(图4第一张图的手),因此如果左上角角点经过池化操作后能有这两个信息,那么就有利于该点的预测,这就有了corner pooling。** 58 | 59 | **该层有2个输入特征图,如图3所示。特征图的宽高分别用W和H表示,假设接下来要对图中红色点(坐标假设是(i,j))做corner pooling,那么就计算(i,j)到(i,H)的最大值(对应Figure3上面第二个图),类似于找到Figure2中第一张图的左侧手信息;同时计算(i,j)到(W,j)的最大值(对应Figure3下面第二个图),类似于找到Figure2中第一张图的头顶信息,然后将这两个最大值相加得到(i,j)点的值(对应Figure3最后一个图的蓝色点)。右下角点的corner pooling操作类似,只不过计算最大值变成从(0,j)到(i,j)和从(i,0)到(i,j)。** 60 | 61 |
62 | 63 |
64 | 65 | **图5** 66 | 67 | ### 2.4 Sample Assignment: 68 | 69 | **如下图所示,如果仅把gt的角点当成正样本,那么正负样本的比例会极不均衡。cornernet选择把iou>0.7范围内的角点都作为正样本,但是不给一样的权重,按照二维高斯分布来给权重,离gt越近的角点权重越大,反之越小。** 70 | 71 |
72 | 73 |
74 | 75 | **那么如何确定高斯半径呢?如下所示:** 76 | 77 | - **情况一,预测的框和GTbox两个角点以r为半径的圆外切** 78 | 79 |
80 | 81 |
82 | 83 | $$ 84 | \large \text { overlap }=\frac{h * w}{(h+2 r)(w+2 r)} \\ 85 | \large 4 * \text { overlap } * r^{2}+2 * \text { overlap } *(h+w) * r+(\text { overlap }-1) *(h * w)=0 \\ 86 | \large r=\frac{-b+\sqrt{b^{2}-4 a c}}{2 a} 87 | $$ 88 | 89 | - **情况二,预测的框和GTbox两个角点以r为半径的圆内切** 90 | 91 |
92 | 93 |
94 | 95 | $$ 96 | \large \text { overlap }=\frac{(h-2 r) *(w-2 r)}{h * w} \\ 97 | \large r=\frac{-b+\sqrt{b^{2}-4 a c}}{2 a} 98 | $$ 99 | 100 | - **预测的框和GTbox两个角点以r为半径的圆一个边内切,一个边外切。** 101 | 102 |
103 | 104 |
105 | 106 | $$ 107 | \large \text { overlap }=\frac{(h-r) *(w-r)}{2 * h * w-(h-r) *(w-r)} \\ 108 | \large r=\frac{-b+\sqrt{b^{2}-4 a c}}{2 a} 109 | $$ 110 | 111 | ``` 112 | def gaussian_radius(det_size, min_overlap): 113 | height, width = det_size 114 | 115 | a1 = 1 116 | b1 = (height + width) 117 | c1 = width * height * (1 - min_overlap) / (1 + min_overlap) 118 | sq1 = np.sqrt(b1 ** 2 - 4 * a1 * c1) 119 | r1 = (b1 - sq1) / (2 * a1) 120 | 121 | a2 = 4 122 | b2 = 2 * (height + width) 123 | c2 = (1 - min_overlap) * width * height 124 | sq2 = np.sqrt(b2 ** 2 - 4 * a2 * c2) 125 | r2 = (b2 - sq2) / (2 * a2) 126 | 127 | a3 = 4 * min_overlap 128 | b3 = -2 * min_overlap * (height + width) 129 | c3 = (min_overlap - 1) * width * height 130 | # print(b3 ** 2 - 4 * a3 * c3) 131 | sq3 = np.sqrt(b3 ** 2 - 4 * a3 * c3) 132 | r3 = (b3 + sq3) / (2 * a3) 133 | return min(r1, r2, r3) 134 | ``` 135 | 136 | 137 | 138 | ### 2.5 Sample matching: 139 | 140 | 1. **首先在类别分支中找出前topk的最大值,3*3的maxpooling操作相当于一个nms,然后再把top-left和botom-right的点索引topk个点组合成[topk,topk]的形式** 141 | 142 |
143 | 144 |
145 | 146 | 2. **在offset预测图中根据tl_inds找出前topk个x,y的偏置** 147 | 148 |
149 | 150 |
151 | 152 |
153 | 154 |
155 | 156 | 3. **在embdding预测图中根据tl_inds找出前topk个embdding vector** 157 | 158 |
159 | 160 |
161 | 162 | 4. **对socres和cls进行组合** 163 | 164 |
165 | 166 |
167 | 168 | 5. **根据tscores,clses和dists滤除不匹配的bboxes** 169 | 170 |
171 | 172 |
173 | 174 | 6. **对scores进行排序,选取前num_det(默认1000)的scores和其索引,按照其索引选择相应的bbox,最后再nms。** 175 | 176 | 177 | 178 | ### 2.6 Loss 179 | 180 | 1. **分类Loss:** 181 | 182 | **分类loss如下图所示,是一个改进版的focal loss** 183 | $$ 184 | \large L_{cls}=\frac{-1}{N} \sum_{c=1}^{C} \sum_{i=1}^{H} \sum_{j=1}^{W}\left\{\begin{array}{cl} 185 | \large \left(1-p_{c i j}\right)^{\alpha} \log \left(p_{c i j}\right) & \text { if } y_{c i j}=1 \\ 186 | \large \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 } 187 | \large \end{array}\right.\\ 188 | \large P_{cij}是类别C在位置(i,j)处的预测得分;y_{cij}是目标的真实标签(服从二维高斯分布) 189 | $$ 190 | 191 | 2. **offset Loss** 192 | 193 | **offset loss采用smooth-l1 loss** 194 | $$ 195 | \large L_{o f f}=\frac{1}{N} \sum_{k=1}^{N} \text { SmoothL1Loss }\left(\boldsymbol{o}_{k}, \hat{\boldsymbol{o}}_{k}\right)\\ 196 | \large \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) 197 | $$ 198 | 199 | 3. **Embdding Loss** 200 | 201 | **embdding loss采用pull和push两部分,pull使得相同目标的top-left和bottom-right corner越接近,push使得不同目标的top-left和bottom-right corner越远离。** 202 | $$ 203 | \large \begin{gathered} 204 | \large L_{p u l l}=\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], \\ 205 | \large L_{p u s h}=\frac{1}{N(N-1)} \sum_{k=1}^{N} \sum_{j=1 \atop j \neq k}^{N} \max \left(0, \Delta-\left|e_{k}-\large \large e_{j}\right|\right) 206 | \large \end{gathered}\\ 207 | \large e_{t_{k}},e_{b_{k}}分别对应top和bottom的corner feature-map值,e_{k}是e_{t_{k}},e_{b_{k}}的均值 208 | $$ 209 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/CornerNet.md: -------------------------------------------------------------------------------- 1 | # CornerNet 2 | 3 | ## 1.概述 4 | 5 | **将目标检测问题看作关键点回归问题,通过检测目标框的左上角和右下角两个关键点得到预测框。整个检测网络的训练是从头开始的,并不基于预训练的分类模型,这使得用户能够自由设计特征提取网络,不用受预训练模型的限制。** 6 | 7 |
8 | 9 |
10 | 11 | **图1** 12 | 13 | ## 2.具体实现 14 | 15 | ### 2.1主干网络: 16 | 17 | **使用两个级联的Hourglass Network作为backbone network** 18 | 19 |
20 | 21 |
22 | 23 | **图2** 24 | 25 | ### 2.2Head: 26 | 27 | **输入经过Backbone产生两张heatmaps,一张用于左上角点的预测,一张用于右下角点的预测,其中每张heatmaps分为3个分支:** 28 | 29 | - **Heatmaps:[B,C,H/4,W/4];** 30 | 31 | **判断该点是哪个类别(可能有多个类别,所以解码的时候用sigmoid);** 32 | 33 | - **Embedding:[B,1,H/4,W/4];** 34 | 35 | **Embedding是看tl_corner跟br_corner的匹配情况,两个差值越小,说明这两个点越匹配;** 36 | 37 | - **Offsets:[B,2,H/4,W/4]** 38 | 39 | **Offsets是预测偏置,弥补下采样误差。** 40 | 41 | **如图2所示,在产生3个分支之前会经过一个CornerPooling的操作,如下图所示:** 42 | 43 |
44 | 45 |
46 | 47 | **图3** 48 | 49 | ### 2.3CornerPooling 50 | 51 |
52 | 53 |
54 | 55 | **图4** 56 | 57 | **如上图所示,因为CornerNet是预测左上角和右下角两个角点,但是这两个角点在不同目标上没有相同规律可循,如果采用普通池化操作,那么在训练预测角点支路时会比较困难。考虑到左上角角点的右边有目标顶端的特征信息(图4第一张图的头顶),左上角角点的下边有目标左侧的特征信息(图4第一张图的手),因此如果左上角角点经过池化操作后能有这两个信息,那么就有利于该点的预测,这就有了corner pooling。** 58 | 59 | **该层有2个输入特征图,如图3所示。特征图的宽高分别用W和H表示,假设接下来要对图中红色点(坐标假设是(i,j))做corner pooling,那么就计算(i,j)到(i,H)的最大值(对应Figure3上面第二个图),类似于找到Figure2中第一张图的左侧手信息;同时计算(i,j)到(W,j)的最大值(对应Figure3下面第二个图),类似于找到Figure2中第一张图的头顶信息,然后将这两个最大值相加得到(i,j)点的值(对应Figure3最后一个图的蓝色点)。右下角点的corner pooling操作类似,只不过计算最大值变成从(0,j)到(i,j)和从(i,0)到(i,j)。** 60 | 61 |
62 | 63 |
64 | 65 | **图5** 66 | 67 | ### 2.4 Sample Assignment: 68 | 69 | **如下图所示,如果仅把gt的角点当成正样本,那么正负样本的比例会极不均衡。cornernet选择把iou>0.7范围内的角点都作为正样本,但是不给一样的权重,按照二维高斯分布来给权重,离gt越近的角点权重越大,反之越小。** 70 | 71 |
72 | 73 |
74 | 75 | **那么如何确定高斯半径呢?如下所示:** 76 | 77 | - **情况一,预测的框和GTbox两个角点以r为半径的圆外切** 78 | 79 |
80 | 81 |
82 | 83 |
84 | 85 |
86 | 87 | - **情况二,预测的框和GTbox两个角点以r为半径的圆内切** 88 | 89 |
90 | 91 |
92 | 93 | 94 |
95 | 96 |
97 | 98 | - **预测的框和GTbox两个角点以r为半径的圆一个边内切,一个边外切。** 99 | 100 |
101 | 102 |
103 |
104 | 105 |
106 | 107 | ``` 108 | def gaussian_radius(det_size, min_overlap): 109 | height, width = det_size 110 | 111 | a1 = 1 112 | b1 = (height + width) 113 | c1 = width * height * (1 - min_overlap) / (1 + min_overlap) 114 | sq1 = np.sqrt(b1 ** 2 - 4 * a1 * c1) 115 | r1 = (b1 - sq1) / (2 * a1) 116 | 117 | a2 = 4 118 | b2 = 2 * (height + width) 119 | c2 = (1 - min_overlap) * width * height 120 | sq2 = np.sqrt(b2 ** 2 - 4 * a2 * c2) 121 | r2 = (b2 - sq2) / (2 * a2) 122 | 123 | a3 = 4 * min_overlap 124 | b3 = -2 * min_overlap * (height + width) 125 | c3 = (min_overlap - 1) * width * height 126 | # print(b3 ** 2 - 4 * a3 * c3) 127 | sq3 = np.sqrt(b3 ** 2 - 4 * a3 * c3) 128 | r3 = (b3 + sq3) / (2 * a3) 129 | return min(r1, r2, r3) 130 | ``` 131 | 132 | 133 | 134 | ### 2.5 Sample matching: 135 | 136 | 1. **首先在类别分支中找出前topk的最大值,3*3的maxpooling操作相当于一个nms,然后再把top-left和botom-right的点索引topk个点组合成[topk,topk]的形式** 137 | 138 |
139 | 140 |
141 | 142 | 2. **在offset预测图中根据tl_inds找出前topk个x,y的偏置** 143 | 144 |
145 | 146 |
147 | 148 |
149 | 150 |
151 | 152 | 3. **在embdding预测图中根据tl_inds找出前topk个embdding vector** 153 | 154 |
155 | 156 |
157 | 158 | 4. **对socres和cls进行组合** 159 | 160 |
161 | 162 |
163 | 164 | 5. **根据tscores,clses和dists滤除不匹配的bboxes** 165 | 166 |
167 | 168 |
169 | 170 | 6. **对scores进行排序,选取前num_det(默认1000)的scores和其索引,按照其索引选择相应的bbox,最后再nms。** 171 | 172 | 173 | 174 | ### 2.6 Loss 175 | 176 | 1. **分类Loss:** 177 | 178 | **分类loss如下图所示,是一个改进版的focal loss** 179 | 180 |
181 | 182 |
183 | 184 | 2. **offset Loss** 185 | 186 | **offset loss采用smooth-l1 loss** 187 | 188 |
189 | 190 |
191 | 192 | 3. **Embdding Loss** 193 | 194 | **embdding loss采用pull和push两部分,pull使得相同目标的top-left和bottom-right corner越接近,push使得不同目标的top-left和bottom-right corner越远离。** 195 | 196 |
197 | 198 |
199 | 200 | ### 总结 201 | 202 | **将目标检测问题看作关键点回归问题,通过检测目标框的左上角和右下角两个关键点得到预测框。整个检测网络的训练是从头开始的,并不基于预训练的分类模型,这使得用户能够自由设计特征提取网络,不用受预训练模型的限制;CornerNet只关注边缘和角点,缺乏目标内部信息,容易产生FP;该网络还是需要不少的后处理,比如如何选取分数最高的点,同时用offset来微调目标定位,也还需要做NMS。同时代码实现起来比较复杂** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/Densebox-SRC.md: -------------------------------------------------------------------------------- 1 | # DenseBox 2 | 3 | ## 1.概述 4 | 5 | **DenseBox是一个不需要产生proposal且可以进行端到端地训练的FCN_Based的物体检测器,且更加关注那么尺寸小和严重遮挡的目标。所以在人脸数据集MALF进行验证模型性能。** 6 | 7 | 1. **无Landmark分支的网路结构:** 8 | 9 |
10 | 11 |
12 | 13 | 2. **带Landmark分支的网络结构:** 14 | 15 |
16 | 17 |
18 | 19 | 20 | 21 | 22 | **图1** 23 | 24 | ## 2.具体实现 25 | 26 | ### 2.1. Bckbone: 27 | 28 | **基于VGG19进行的改进,整个网络包含16层卷积,前12层由VGG19初始化,输出conv4_4后接4个1x1的卷积,前两个卷积产生1-channel map用于类别分数,后两个产生4-channel map用于预测相对位置。最后一个1x1的卷积担当这全连接层的作用** 29 | 30 | 31 | ### 2.2. Neck: 32 | 33 | **无Neck** 34 | 35 | 36 | 37 | ### 2.3. Head: 38 | 39 | **DenseBox Head部分包含三部分,第一部分为:分类分支,第二部分为:回归分支,第三部分为:Landmark 分支。最终特征图的大小为(W/4,H/4), W,H为输入大小。** 40 | 41 | 42 | 43 | ### 2.4. Sample Assignment: 44 | 45 | 1. **以目标中心为中点,把目标的高resize大约50个像素点,可以得出resize的倍数;** 46 | 2. **按照该resize倍数resize整张图,以目标中心为中点crop 240 * 240大小的图片patch;** 47 | 3. **以目标在输出特征图中面积的0.3倍长度作半径,在该半径里面都为正样本,其余为负样本;** 48 | 4. **如果该patch里面包含多个目标,如果其它目标落在相对于patch中心目标(即以该目标中心进行crop patch的目标)的一定尺度范围内(0.8~1.25)就认为是正目标;** 49 | 5. **正样本附近2个像素(输出特征图空间的两个像素点)点的目标设置为忽略目标,不进行任何方向传播。** 50 | 6. **采用了在线难例挖掘来均衡正负样本,可以参考[SSD在线难例挖掘部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/SSD.md)** 51 | 52 | 53 | 54 | 55 | ### 2.6. Decode部分: 56 | 57 | **直接目标的中心点宽高下采样4倍即可。** 58 | 59 | 60 | 61 | ### 2.7. LOSS部分: 62 | 63 | - **分类Loss:** 64 | $$ 65 | \large \mathcal{L}_{c l s}\left(\hat{y}, y^{*}\right)=\left\|\hat{y}-y^{*}\right\|^{2}\\ 66 | $$ 67 | 68 | 69 | - **回归Loss:** 70 | $$ 71 | \large \mathcal{L}_{l o c}\left(\hat{d}, d^{*}\right)=\sum_{i \in\{t x, t y, b x, b y\}}\left\|\hat{d}_{i}-d_{i}^{*}\right\|^{2} 72 | $$ 73 | 74 | 75 | - **det Loss** 76 | $$ 77 | \large M\left(\hat{t}_{i}\right)= \begin{cases}0 & f_{i g n}^{i}=1 \text { or } f_{\text {sel }}^{i}=0 \\ 1 & \text { otherwise }\end{cases} 78 | $$ 79 | 80 | $$ 81 | \large \mathcal{L}_{d e t}(\theta)=\sum_{i}\left(M\left(\hat{t}_{i}\right) \mathcal{L}_{c l s}\left(\hat{y}_{i}, y_{i}^{*}\right)+\lambda_{l o c}\left[y_{i}^{*}>0\right] M\left(\hat{t}_{i}\right) \mathcal{L}_{l o c}\left(\hat{d}_{i}, d_{i}^{*}\right)\right) 82 | $$ 83 | 84 | $$ 85 | \large \hat{y},y^*分别表示预测类被和实际类别;\hat{d},d*分别表示预测的bbox,和实际bbox,(x_{c},y_{c},w,h)形式,\lambda_{loc}默认为3\\ 86 | $$ 87 | 88 | 89 | 90 | - **with Landmark Loss** 91 | $$ 92 | \large \mathcal{L}_{\text {full }}(\theta)=\lambda_{\text {det }} \mathcal{L}_{\text {det }}(\theta)+\lambda_{\text {lm }} \mathcal{L}_{l m}(\theta)+\mathcal{L}_{r f}(\theta)\\ 93 | \large \mathcal{L}_{\text {lm }}为landmark loss,默认16个landmark点,\mathcal{L}_{\text {rf}}是landmark的分类loss16个点代表16类,跟类别loss一样。 94 | $$ 95 | 96 | 97 | ## 3.总结: 98 | 99 | **DenseBox的思想非常超前,采用了多层特征融合,FPN的雏形,在线难例挖掘,直接回归中心点和宽高并设置正样本区域半径和忽略半径,这未后来的anchor-free目标检测打下基础,同时可以回归landmark在人脸检测领域有很强的应用性。缺点是只能检测一类目标,当然后期也可以设计成检测多类。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/Densebox.md: -------------------------------------------------------------------------------- 1 | # DenseBox 2 | 3 | ## 1.概述 4 | 5 | **DenseBox是一个不需要产生proposal且可以进行端到端地训练的FCN_Based的物体检测器,且更加关注那么尺寸小和严重遮挡的目标。所以在人脸数据集MALF进行验证模型性能。** 6 | 7 | 1. **无Landmark分支的网路结构:** 8 | 9 |
10 | 11 |
12 | 13 | 2. **带Landmark分支的网络结构:** 14 | 15 |
16 | 17 |
18 | 19 | 20 | 21 | 22 | **图1** 23 | 24 | ## 2.具体实现 25 | 26 | ### 2.1. Bckbone: 27 | 28 | **基于VGG19进行的改进,整个网络包含16层卷积,前12层由VGG19初始化,输出conv4_4后接4个1x1的卷积,前两个卷积产生1-channel map用于类别分数,后两个产生4-channel map用于预测相对位置。最后一个1x1的卷积担当这全连接层的作用** 29 | 30 | 31 | ### 2.2. Neck: 32 | 33 | **无Neck** 34 | 35 | 36 | 37 | ### 2.3. Head: 38 | 39 | **DenseBox Head部分包含三部分,第一部分为:分类分支,第二部分为:回归分支,第三部分为:Landmark 分支。最终特征图的大小为(W/4,H/4), W,H为输入大小。** 40 | 41 | 42 | 43 | ### 2.4. Sample Assignment: 44 | 45 | 1. **以目标中心为中点,把目标的高resize大约50个像素点,可以得出resize的倍数;** 46 | 2. **按照该resize倍数resize整张图,以目标中心为中点crop 240 * 240大小的图片patch;** 47 | 3. **以目标在输出特征图中面积的0.3倍长度作半径,在该半径里面都为正样本,其余为负样本;** 48 | 4. **如果该patch里面包含多个目标,如果其它目标落在相对于patch中心目标(即以该目标中心进行crop patch的目标)的一定尺度范围内(0.8~1.25)就认为是正目标;** 49 | 5. **正样本附近2个像素(输出特征图空间的两个像素点)点的目标设置为忽略目标,不进行任何方向传播。** 50 | 6. **采用了在线难例挖掘来均衡正负样本,可以参考[SSD在线难例挖掘部分](https://github.com/Hanson0910/DL-Algorithm-Summary/blob/main/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AF%87/Anchor-Base/one-stage/SSD.md)** 51 | 52 | 53 | 54 | 55 | ### 2.6. Decode部分: 56 | 57 | **直接目标的中心点宽高下采样4倍即可。** 58 | 59 | 60 | 61 | ### 2.7. LOSS部分: 62 | 63 | - **分类Loss:** 64 | 65 |
66 | 67 |
68 | 69 | 70 | 71 | - **回归Loss:** 72 | 73 |
74 | 75 |
76 | 77 | - **det Loss** 78 | 79 |
80 | 81 |
82 | 83 | - **with Landmark Loss** 84 | 85 |
86 | 87 |
88 | 89 | 90 | 91 | ## 3.总结: 92 | 93 | **DenseBox的思想非常超前,采用了多层特征融合,FPN的雏形,在线难例挖掘,直接回归中心点和宽高并设置正样本区域半径和忽略半径,这未后来的anchor-free目标检测打下基础,同时可以回归landmark在人脸检测领域有很强的应用性。缺点是只能检测一类目标,当然后期也可以设计成检测多类。** -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/FoveaBox-SRC.md: -------------------------------------------------------------------------------- 1 | # **FoveaBox: Beyound Anchor-Based Object Detection** 2 | 3 | ## 1.概述 4 | 5 | **FoveaBox也是一个anchor-free的key-point检测框架,通过预测类别eatmap作为目标概率图,然后再回归中心点偏置。与FCOS等其它anchor-free检测框架的区别是它把目标邻接FPN level也作为正样本,同时它在定义positive area的时候并没有像其它框架一样定义ignore area。** 6 | 7 | 8 | 9 | ## 2.网络结构 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 | ​ **图1** 19 | 20 | 21 | 22 | **如上图所示,FoveaBox采用FPN结构,没级FPN分别预测分类跟回归两个分支。** 23 | 24 | ## 2.具体实现 25 | 26 | ### 2.1. ** *Object Occurrence Possibility***: 27 | 28 | **文中提到的Object Occurrence Possibility其实就是正样本概率图,通过如下方式定义正样本:** 29 | $$ 30 | \begin{aligned} 31 | & \large x_{1}^{\prime}=\frac{x_{1}}{s_{l}}, \quad y_{1}^{\prime}=\frac{y_{1}}{s_{l}}, \quad x_{2}^{\prime}=\frac{x_{2}}{s_{l}}, \quad y_{2}^{\prime}=\frac{y_{2}}{s_{l}} \\ 32 | & \large c_{x}^{\prime}=0.5\left(x_{2}^{\prime}+x_{1}^{\prime}\right), \quad \large c_{y}^{\prime}=0.5\left(y_{2}^{\prime}+y_{1}^{\prime}\right) \\ 33 | &\large w^{\prime}=x_{2}^{\prime}-x_{1}^{\prime}, \quad h^{\prime}=y_{2}^{\prime}-y_{1}^{\prime}\\ 34 | &\large (x_{1},y_{1},x_{2},y_{2})为gt坐标,s_{l}为下采样倍数 35 | \end{aligned} 36 | $$ 37 | 38 | $$ 39 | \begin{aligned} 40 | \large &x_{1}^{p o s}=c_{x}^{\prime}-0.5 \sigma w^{\prime}, & y_{1}^{p o s}=c_{y}^{\prime}-0.5 \sigma h^{\prime} \\ 41 | \large &x_{2}^{p o s}=c_{x}^{\prime}+0.5 \sigma w^{\prime}, & y_{2}^{p o s}=c_{y}^{\prime}+0.5 \sigma h^{\prime} 42 | \large \\ 43 | \large &\sigma为常系数 44 | \end{aligned} 45 | $$ 46 | 47 | **由上式可以看出,正样本区域为目标中心点一定范围类的区域,如下图所示:** 48 | 49 |
50 | 51 |
52 | 53 | ​ **图2** 54 | 55 | ### 2.2 Scale Assignment 56 | 57 | **由于有多级FPN,文章在分配目标到对应特征层的时候按一定大小区间分配,只要在这个大小区间内的目标都为正样本,不在这个大小区间内的目标该区域为ignore area** 58 | $$ 59 | \large \left[r_{l} / \eta, r_{l} \cdot \eta\right]\\ 60 | \large r_{l}为P_{3}到P_{7}的basic scale分别为32到512,\eta为常系数,文中设为2\\ 61 | $$ 62 | **通过上式的target分配到不同的FPN层上,有如下好处:** 63 | 64 | - **邻接的pyramid feature往往有大致相同的语义特征** 65 | - **这样分配会增加正样本的数量,使训练过程更加稳定。** 66 | 67 | 68 | 69 | ### 2.3 Box encode 70 | 71 | $$ 72 | \begin{aligned} 73 | &\large t_{x_{1}}=\log \frac{s_{l}(x+0.5)-x_{1}}{r_{l}}, \\ 74 | &\large t_{y_{1}}=\log \frac{s_{l}(y+0.5)-y_{1}}{r_{l}}, \\ 75 | &\large t_{x_{2}}=\log \frac{x_{2}-s_{l}(x+0.5)}{r_{l}}, \\ 76 | &\large t_{y_{2}}=\log \frac{y_{2}-s_{l}(y+0.5)}{r_{l}} .\\ 77 | & \large (x,y)是R^{pos}的点,(x_{1},y_{1},x_{2},y_{2})是gt的坐标,s_{l}是下采样倍数,r_{l}是basicscale 78 | \end{aligned} 79 | $$ 80 | 81 | **从上式可以看出box encode其实就是计算gt与pos点偏置(图2所示)再求log。** 82 | 83 | 84 | 85 | ## 3.Inference 86 | 87 | **Inferense阶段分为如下步骤:** 88 | 89 | - **以阈值为0.05滤除一部分低置信度的候选** 90 | - **在每一个prediction layer选取top-1000的候选** 91 | - **NMS with threshold 0.5** 92 | 93 | 94 | ## 3.总结: 95 | 96 | **FoveaBox的检测框架十分简洁,目前看下来就两个超参。与FCOS和CenterNet不同就是它是预测的4个点,然后利用了邻接FPN特征,同质化还是比较明显的。FPN这一块我觉得Soft Anchor-Point Object Detection的处理更好一些。** 97 | 98 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/FoveaBox.md: -------------------------------------------------------------------------------- 1 | # **FoveaBox: Beyound Anchor-Based Object Detection** 2 | 3 | ## 1.概述 4 | 5 | **FoveaBox也是一个anchor-free的key-point检测框架,通过预测类别eatmap作为目标概率图,然后再回归中心点偏置。与FCOS等其它anchor-free检测框架的区别是它把目标邻接FPN level也作为正样本,同时它在定义positive area的时候并没有像其它框架一样定义ignore area。** 6 | 7 | 8 | 9 | ## 2.网络结构 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 | ​ **图1** 19 | 20 | 21 | 22 | **如上图所示,FoveaBox采用FPN结构,没级FPN分别预测分类跟回归两个分支。** 23 | 24 | ## 2.具体实现 25 | 26 | ### 2.1. ** *Object Occurrence Possibility***: 27 | 28 | **文中提到的Object Occurrence Possibility其实就是正样本概率图,通过如下方式定义正样本:** 29 | 30 |
31 | 32 |
33 | 34 | **由上式可以看出,正样本区域为目标中心点一定范围类的区域,如下图所示:** 35 | 36 |
37 | 38 |
39 | 40 | ​ **图2** 41 | 42 | ### 2.2 Scale Assignment 43 | 44 | **由于有多级FPN,文章在分配目标到对应特征层的时候按一定大小区间分配,只要在这个大小区间内的目标都为正样本,不在这个大小区间内的目标该区域为ignore area** 45 | 46 |
47 | 48 |
49 | 50 | **通过上式的target分配到不同的FPN层上,有如下好处:** 51 | 52 | - **邻接的pyramid feature往往有大致相同的语义特征** 53 | - **这样分配会增加正样本的数量,使训练过程更加稳定。** 54 | 55 | 56 | 57 | ### 2.3 Box encode 58 | 59 |
60 | 61 |
62 | 63 | **从上式可以看出box encode其实就是计算gt与pos点偏置(图2所示)再求log。** 64 | 65 | 66 | 67 | ## 3.Inference 68 | 69 | **Inferense阶段分为如下步骤:** 70 | 71 | - **以阈值为0.05滤除一部分低置信度的候选** 72 | - **在每一个prediction layer选取top-1000的候选** 73 | - **NMS with threshold 0.5** 74 | 75 | 76 | ## 3.总结: 77 | 78 | **FoveaBox的检测框架十分简洁,目前看下来就两个超参。与FCOS和CenterNet不同就是它是预测的4个点,然后利用了邻接FPN特征,同质化还是比较明显的。FPN这一块我觉得Soft Anchor-Point Object Detection的处理更好一些。** 79 | 80 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/RepPoints-SRC.md: -------------------------------------------------------------------------------- 1 | # **RepPoints: Point Set Representation for Object Detection** 2 | 3 | ## 1.概述 4 | 5 | **RepPoints使用一个完全anchor-free的检测框架,通过deformable-conv预测9组点来代表目标的重点区域,再通过这9组点生成伪box进行回归。RepPoints达到了真正的anchor-free,整个检测框架十分简洁,超参少。** 6 | 7 | 8 | 9 | ## 2.网络结构 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 | ​ **图1** 18 | 19 |
20 | 21 |
22 | 23 | 24 | 25 | ​ **图2** 26 | 27 | **如上图所示,RepPoints网络结构分为连个分支--检测和回归分支。其中检测分支又有2个stage,stage-1生成粗糙的pseudo-box再经stage-2生成精细的pseudo-box。图1中的N为生成点对的个数(文中设置为9)。** 28 | 29 | ## 2.具体实现 30 | 31 | ### 2.1. **RepPoints**: 32 | 33 | **RepPoints的生成是通过deformable-conv,生成N个点对(文中9对)的偏置,改偏置是相对于目标中心点而言,即通过目标中心点坐标和deformable-conv生成的偏置decode成实际的点对**。 34 | 35 | 1. **点对生成** 36 | 37 | - **stage-1** 38 | 39 | **这一阶段的解码论文中没有明确的公式表明,只是说明了一下,以目标中心点为base,通过预测的9个offsets来生成9组点对:** 40 | 41 |
42 | 43 |
44 | 45 | - **stage-2** 46 | 47 |
48 | 49 |
50 | 51 | 2. **pseudo box** 52 | 53 | **通过1步骤生成的 RepPoints再通过如下步骤生成pseud box** 54 | 55 | - **Min-max function,通过选取这些点对的最大最小值来生成pseudo box** 56 | - **Partial min-max function,通过选取部分点对的最大最小值来生成pseudo box(具体选哪些不太清楚,可能是为了滤除一些极端值???)** 57 | - **Moment-based function,通过计算这些点对的均值方差来生成pseud box** 58 | 59 | ### 2.2 正负样本选择 60 | 61 | #### 2.2.1 回归正样本 62 | 63 | - **stage-1** 64 | 65 | **第一阶段的正负样本选择有两步:** 66 | 67 | - **判断改目标在哪一个特征层:** 68 | 69 |
70 | 71 |
72 | 73 | - **然后判断gt的中心点落在哪个特征点上,则改特征层的该特征点为正样本** 74 | 75 | - **stage-2** 76 | 77 | **如果第一阶段生成的pseudo box与gt的iou大于0.5就认为是正样本** 78 | 79 | #### **2.2.2 分类正样本** 80 | 81 | ​ **分类只针对第一阶段,第一阶段生成的pseudo box如果与gt iou > 0.5就为正样本,< 0.4就为负样本,其余的为忽略样本。** 82 | 83 | 84 | 85 | 86 | ## 3.总结: 87 | 88 | **RepPoints的核心在于它的网络结构是回归点对,然后再通过点对生成pseudo box,这样就可以省去大量的有关anchor的超参,通过玩网络自己学习这些目标的核心关键点。这个做法是非常新颖的,有一篇目标跟踪的文章也用了类似的思想,让网络自己去学习一些关键区域作为reid特征,整个框架也十分简洁。但是我觉存在的问题是由于编码方式是直接加上预测偏置,没有进行压缩,这样对于尺度变化特别大的目标检测效果可能不是太理想,网络的收敛速度可能比较慢。** 89 | 90 | -------------------------------------------------------------------------------- /目标检测篇/Anchor-Free/Key-Point/Yolo.md: -------------------------------------------------------------------------------- 1 | # Yolo 2 | 3 | ## 1.概述 4 | 5 | **不论是two-stage的Faster-RCNN还是one-satge的SSD,RetinaNet等,都需要精心设置anchor,这样人为的anchor设置需要大量的先验知识,anchor设置不当会极大影响检测器的性能,Yolo1采用anchor-free的方式无需设置anchor,将detection视为回归问题,仅使用一个网络同时预测bounding box的位置和类别。** 6 | 7 |
8 | 9 |
10 | 11 | 12 | **图1** 13 | 14 | ## 2.具体实现 15 | 16 | ### 2.1. Bckbone: 17 | 18 | **借鉴了GooLeNet设计,共包含24个卷积层,2个全链接层(前20层中用1×1 reduction layers 紧跟 3×3 convolutional layers 取代GooLeNet的 inception modules),最后一个线性层使用 leaky relu** 19 | 20 |
21 | 22 |
23 | 24 | ### 2.2. Neck: 25 | 26 | **无Neck** 27 | 28 | 29 | 30 | ### 2.3. Head: 31 | 32 | **Yolo1的Head输出一个7x7x(NumClass+ 2 + 2*4)大小的特征图,如下图所示:** 33 | 34 |
35 | 36 |
37 | 38 | **以PASCLA-VOC数据为例,一共20类(不算负样本),首先需要20维来表示目标属于哪一个维度,yolo默认每个grid最多预测两个目标(两个目标得是同一个类别的),紧接着需要2个维度去表示每个预测的置信度,同时每个预测需要回归4个坐标,所以Head一共有30维度。** 39 | 40 | 41 | 42 | ### 2.4. Sample Assignment: 43 | 44 | **Yolo1没有Anchor那么怎么去回归目标呢?yolo1采用grid的方式,把输入分割成SxS大小的grid(默认为7x7), 判断目标中心落在哪个grid里面即该grid负责预测该目标(目标中心下取整判断跟哪个grid相等),如下图所示:** 45 | 46 |
47 | 48 |
49 | 50 | 51 | 52 | ### 2.6. Decode部分: 53 | 54 | **直接回归原始坐标** 55 | 56 | 57 | 58 | ### 2.7. LOSS部分: 59 | 60 |
61 | 62 |
63 | 64 | 65 | 66 |
67 | 68 |
69 | 70 | ## 3.总结: 71 | 72 | 1. **YOLO检测物体非常快。因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。更快的Fast YOLO检测速度可以达到155 FPS。而且,YOLO的mAP是之前其他实时物体检测系统的两倍以上。** 73 | 2. **YOLO可以很好的避免背景错误,产生false positives。不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。** 74 | 3. **YOLO可以学到物体的泛化特征。当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。** 75 | 4. **YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。** 76 | 5. **YOLO容易产生物体的定位错误。** 77 | 6. **YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。** -------------------------------------------------------------------------------- /目标检测篇/插件式/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /目标检测篇/插件式/soft-nms-src.md: -------------------------------------------------------------------------------- 1 | # Soft nms:Improving Object Detection With One Line of Code 2 | 3 | ## 概述: 4 | 5 | **softnms仅通过在原nms基础上改变其中一个步骤,把原来nms滤除周边检测框改为降低其检测得分来提高检测精度。** 6 | 7 |
8 | 9 |
10 | 11 | **图1** 12 | 13 | ## 提出背景 14 | 15 | **目标检测会得到大批密集的检测款,为了得到最终的检测框主流的检测框架都是通过一个非极大值抑制(nms)的方式来滤除大量冗余检测框,具体步骤如下图所示:** 16 | 17 |
18 | 19 |
20 | 21 | 22 | 23 | **采用hard计算的方式(下式所示)会在现有评测指标(map,即iou阈值0.5~1.0之间的均值)中存在如下问题:** 24 | 25 |
26 | 27 |
28 | 29 | - **阈值过低会增加漏检,这个比较好理解,假设阈值设置为0.3,有一个检测框与目标的iou很大,但是得分比较低,但是有一个检测框分数很高,但是压根就没有conver住目标,但是这个得分高的检测框又与得分低的检测框有一部分重叠,这时iou阈值卡的低的话这种情况会很频繁发生,导致miss rate增加** 30 | - **阈值过高会增加误检查,检测精度=TP/TP+FP,当阈值过高时由于检测框的数量远远多于目标,所以FP增加的概率远远大于TP,所以会导致精度降低**。 31 | 32 | **所以作者采用了一种软化得分的方式,不直接滤除检测框,而是根据IOU的大小来相应惩罚检测得分,iou越大的惩罚越严厉,iou越小惩罚越小,有两种形式:** 33 | 34 | - **根据iou阈值来惩罚:** 35 | 36 |
37 | 38 |
39 | 40 | - **通过高斯分布来连续惩罚:** 41 | 42 |
43 | 44 |
45 | 46 | # 总结 47 | 48 | **soft nms与原nms相比几乎没有额外计算量,通过软化得分的方式最后再根据得分来滤除冗余检测在mAP这种评测方式中应该会有一点提升。这个最终的得分阈值还是要通过手工去调整,这一块应该还能再优化一下。** -------------------------------------------------------------------------------- /目标检测篇/数据集/ms-coco.md: -------------------------------------------------------------------------------- 1 | - ##### 简介 2 | MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以scene understanding为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的segmentation进行位置的标定。图像包括91类目标,328,000影像和2,500,000个label。目前为止有语义分割的最大数据集,提供的类别有80 类,有超过33 万张图片,其中20 万张有标注,整个数据集中个体的数目超过150 万个。 3 | 4 | - ##### 数据集任务 5 | - object detection: 目标检测; 6 | 7 | - keypoint detection: 关键点检测; 8 | 9 | - stuff segmentation: stuff没有固定形状的物体,例如天空、草地等,分割任务; 10 | 11 | - panoptic segmentation: 全景分割,图片中things,stuff等全被分割; 12 | 13 | - image captioning: “看图说话”,一个图片中的场景描述; 14 | 15 | - ##### 数据集类别 16 | 91个类别,包括things + stuff,实际目标检测只有80个类别,就是things。 17 | 18 | - ##### 数据集划分 19 | 20 | 数据集有2014年(2014 Train images, 2014 Val images, 2014 Test images), 2015年(2015 Test images) 和 2017年(2017 Train images, 2017 Val images, 2017 Test images). 其中,训练集和验证集有标签(2014 Train/Val annotations, 2017 Train/Val annotations),而测试集没有标签. 21 | 22 | 在2014年数据集中,训练集82783张,验证集40504张,测试集40775张. 另外,验证集分为两部分,miniVal有5000张,剩下的35504张图像和训练集称为Trainval35k (Trainval35k==train2014+val2014-minival2014.). 通常在论文中使用Trainval35k当作训练集. 23 | 24 | 在2015年测试集中有81434张图像. 25 | 26 | 在2017年数据集中,训练集118287张,验证5000张,测试集40670张. 其中,训练集就是Trainval35k(82783+40504-5000=118287), 验证集就是miniVal. 即train2017==trainval35k==train2014+val2014-minival2014==train2014+val2014-val2017. -------------------------------------------------------------------------------- /目标检测篇/数据集/pascal-voc.md: -------------------------------------------------------------------------------- 1 | - ### 常用数据集 2 | #### PASCAL VOC 3 | - ##### 简介 4 | PASCAL VOC挑战赛 (The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛, PASCAL全称:Pattern Analysis, Statical Modeling and Computational Learning,是一个由欧盟资助的网络组织。PASCAL VOC从2005年开始举办挑战赛,每年的内容都有所不同,从最开始的分类,到后面逐渐增加检测,分割,人体布局,动作识别(Object Classification 、Object Detection、Object Segmentation、Human Layout、Action Classification)等内容,数据集的容量以及种类也在不断的增加和改善。最后一届挑战赛是2012年,**现在论文用的比较多的数据集是VOC2007和VOC2012这两个年份的数据。** 5 | 6 | - ##### 类别 7 | PASCAL VOC 数据集一共包含20个类别,及其层级结构: 8 | ![image](https://arleyzhang.github.io/articles/1dc20586/1522997065951.png) 9 | 从2007年开始,PASCAL VOC每年的数据集都是这个层级结构,总共四个大类:vehicle,household,animal,person,总共20个小类,预测的时候是只输出图中黑色粗体的类别 10 | 11 | - ##### 使用形似 12 | - 只用VOC2007的trainval 训练,使用VOC2007的test测试 13 | - 只用VOC2012的trainval 训练,使用VOC2012的test测试,这种用法很少使用,因为大家都会结合VOC2007使用 14 | - 使用 VOC2007 的 train+val 和 VOC2012的 train+val 训练,然后使用 VOC2007的test测试,这个用法是论文中经常看到的 07+12 ,研究者可以自己测试在VOC2007上的结果,因为VOC2007的test是公开的。 15 | - 使用 VOC2007 的 train+val+test 和 VOC2012的 train+val训练,然后使用 VOC2012的test测试,这个用法是论文中经常看到的 07++12 ,这种方法需提交到VOC官方服务器上评估结果,因为VOC2012 test没有公布。 16 | - 先在 MS COCO 的 trainval 上预训练,再使用 VOC2007 的 train+val、 VOC2012的 train+val 微调训练,然后使用 VOC2007的test测试,这个用法是论文中经常看到的 07+12+COCO 。 17 | - 先在 MS COCO 的 trainval 上预训练,再使用 VOC2007 的 train+val+test 、 VOC2012的 train+val 微调训练,然后使用 VOC2012的test测试 ,这个用法是论文中经常看到的 07++12+COCO,这种方法需提交到VOC官方服务器上评估结果,因为VOC2012 test没有公布。 18 | 19 | - ##### 数据集数量 20 | ![image](https://arleyzhang.github.io/articles/1dc20586/1523033381386.png) 21 | 黑色字体所示数字是官方给定的,由于VOC2012数据集中 test 部分没有公布,因此红色字体所示数字为估计数据,按照PASCAL 通常的划分方法,即 trainval 与test 各占总数据量的一半。 22 | 23 | - ##### 提交详情 24 | 每一类都有一个txt文件,里面每一行都是测试集中的一张图片,每行的格式按照如下方式组织 25 | 26 | -------------------------------------------------------------------------------- /目标检测篇/评测指标/mAP.md: -------------------------------------------------------------------------------- 1 | ### Pascal-mAP 2 | 3 | - ##### 相关定义 4 | 5 | mAP: mean Average Precision, 即各类别AP的平均值; 6 | AP: PR曲线下面积; 7 | PR曲线: Precision-Recall曲线段; 8 | 目标检测中的召回、进度定义如下图所示: 9 | 10 | ![image](https://note.youdao.com/yws/api/personal/file/WEB32b532e547a2140d3b39415f1945f23d?method=download&shareKey=3ad63af42397bbb84584fef9fddfd46c) 11 | 12 | - ### P-R曲线 13 | Precision-Recall曲线,简称P-R曲线,其横轴是召回率,纵轴是精确率。 14 | 15 | - ### AP计算 16 | AP即PR曲线的面积,计算方式有: 17 | - 积分求解 18 | - 插值求解 19 | 20 | - ### VOC-AP计算 21 | 22 | - P-R曲线图 23 | 24 | **对于某类下全部的真实目标,将IOU>=0.5的作为检测出来的目标,取不同的confidence 阈值计算对应的precision和recall。** 25 | ![image](https://note.youdao.com/yws/api/personal/file/WEBc4a87e63f151aa09b000df4b8ba7e0c4?method=download&shareKey=82b5f9d0b1c0112da4c2924c876d557e) 26 | - #### 2010之前 27 | 取recall >= [0,0.1,0,2,0,3,0,4,0.5,0.6,0.7,0.8,0.9,1.0]共11个点时的precision最大值,然后AP就是这11个precision的平均值.如下图红色点所示: 28 | 29 | ![image](https://note.youdao.com/yws/api/personal/file/WEBdfdc186999291fa106abc89310986f6a?method=download&shareKey=a40d40ac4998f7f54fec2ff5d7bccbd0) 30 | 31 | 假设召回为0时的precision即取在recall>=0时的最大精度作为该点的precision,召回为0.1时的precision即取在recall>=0.1时的最大精度作为该点的precision。 32 | 33 | - #### 2010之后 34 | 不再是对召回率在[0,1]之间的均匀分布的11个点,而是对每个不同的recall值都计算一个precision,然后再求平均。每个点的precision计算与之前一样,都取recall>=该点时的最大precision作为该点的precision。如下图红色部分所示: 35 | 36 | ![image](https://note.youdao.com/yws/api/personal/file/WEB3de0a00b9747160a163685de6be5c670?method=download&shareKey=ab508664f99d237810d6b7718ae8e637) 37 | 38 | 39 | - ### mAP 40 | mAP就是多个类别AP的平均。 41 | 42 | 43 | 44 | ### coco-mAP 45 | 46 | **在评测时,COCO评估了在不同的交并比(IoU)[0.5:0.05:0.95]共10个IoU下的AP,并且在最后以这些阈值下的AP平均作为结果,记为mAP@[.5, .95]。 而在Pascal VOC中,检测结果只评测了IOU在0.5这个阈值下的AP值。 因此相比VOC而言,COCO数据集的评测会更加全面:不仅评估到物体检测模型的分类能力,同时也能体现出检测模型的定位能力。因此在IoU较大如0.8时,预测框必须和真实的框具有很大的重叠比才能被视为正确。** -------------------------------------------------------------------------------- /网络篇/GCNet-SRC.md: -------------------------------------------------------------------------------- 1 | ## ****GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond**** 2 | 3 | ## 1.概述: 4 | 5 | **GCNet通过分析No-Local(Non-local Neural Networks)网络,实现发现No-Local网络用了大量的计算量来建立的特征长程关系,但是却发现通过No-local网络来建模的全局语义信息在不同的点上几乎是相同的。对于这一现象,作者进行了改进。** 6 | 7 | 8 | 9 | 10 | ## 2. 具体实现: 11 | 12 | ### 2.1 No-Local Net 13 | 14 | **No-Local信息能够更好的理解图像,不管是RNN还是CNN,都通过重复堆叠的形式来获取No-Local信息,但是这会存在几个问题:** 15 | 16 | - **为了获取No-Local信息,通常需要堆叠很深的深度** 17 | - **大量的参数导致优化并不容易** 18 | - **这种方式提取的特征也并不是那么No-Local,比如通过卷积,最终32倍下采样,那么特征图的右下角和左上角肯定还是没什么交集的,所以并不是那么No-Local** 19 | 20 | **为此No-Local网络的提出使得网络能够以更浅的层实现完全No-Local的目的,主要分为3个步骤:** 21 | 22 | 1. **一个上下文建模单元通过聚集所有点的特征形成一个全局上下文特征** 23 | 2. **一个特征转换单元获取channel-wise的互相依赖关系** 24 | 3. **一个融合单元融合所有点全局上下文特征** 25 | 26 | **只看这三个步骤可能有些疑惑,看公式和框架图会更加清楚一点:** 27 | $$ 28 | \large \mathbf{z}_{i}=\mathbf{x}_{i}+W_{z} \sum_{j=1}^{N_{p}} \frac{f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)}{\mathcal{C}(\mathbf{x})}\left(W_{v} \cdot \mathbf{x}_{j}\right)\\ 29 | \large \mathbf{X}=\left\{\mathbf{x}_{i}\right\}_{i=1}^{N_{p}}表示特征图\\ 30 | \large N_{p}是特征图上位置的数量,对于图像N_{p}=H.W\\ 31 | \large 上式求和符号后面部分代表上下文建模单元;W_{z}代表特征转换单元;+代表融合单元。\\ 32 | \large f(x_{i},x_{j})代表位置x_{i}和x_{j}的关系,一般有如下四种关系:\\ 33 | \large 1. Gaussian \quad denotes\\ 34 | \large 2. Embedded \quad Gaussian\\ 35 | \large 3. Dot \quad product\\ 36 | \large 4. Concat\\ 37 | \large 用的比较多的是第二种,即:\\ 38 | \large \omega_{i j}=\frac{\exp \left(\left\langle W_{q} \mathbf{x}_{i}, W_{k} \mathbf{x}_{j}\right\rangle\right)}{\sum_{m} \exp \left(\left\langle W_{q} \mathbf{x}_{i}, W_{k} \mathbf{x}_{m}\right\rangle\right)} 39 | $$ 40 | 41 | 42 |
43 | 44 |
45 | 46 | ​ 图1 47 | 48 | ### 2.2 No-Local Net缺点 49 | 50 | 为了更加直观的了解No-Local block,作者可视化了不同位置的attention map,如下图所示: 51 | 52 |
53 | 54 |
55 | 56 | **图中红色的点是query position,可以看到不同的query position的attention map竟然几乎相同,如果说图像比较直观,那么数据就更加客观,作者分析特征之间的距离,主要包括:1. no-local block input之间的距离,2. no-local block output before fusio之间的距离,3. query position attention map之间的距离,结果如下图所示:** 57 | 58 |
59 | 60 |
61 | 62 | 63 | 64 | **从上图中可以看出不同input的余弦距离还是蛮大的,但是output的距离却很小,attention map的距离也很小。说明为每一个query position通过一个No-Local block获取global context,global context随着训练的进行会变得相似。** 65 | 66 | ### 2.2 Simplify-No-Local Net 67 | 68 | **有了以上发现,这座机智的设计了一个简化版本的 No-Local Net,既然global context与query position关系不大,那么就没必要为每一个query position获取其global context,这样太耗时。于是作者就为每一个query position共享一个global attention map,反正都是一样的,那么共享一个能够省掉很多计算量,岂不美哉。** 69 | $$ 70 | \large \mathrm{z}_{i}=\mathrm{x}_{i}+\sum_{j=1}^{N_{p}} \frac{\exp \left(W_{k} \mathbf{x}_{j}\right)}{\sum_{m=1}^{N_{p}} \exp \left(W_{k} \mathbf{x}_{m}\right)}\left(W_{v} \cdot \mathbf{x}_{j}\right)\\ 71 | \large 通过合并同类项可以写成: 72 | \large \mathrm{z}_{i}=\mathrm{x}_{i}+W_{v}\sum_{j=1}^{N_{p}} \frac{\exp \left(W_{k} \mathbf{x}_{j}\right)}{\sum_{m=1}^{N_{p}} \exp \left(W_{k} \mathbf{x}_{m}\right)}\mathbf{x}_{j}\\ 73 | $$ 74 | 75 |
76 | 77 |
78 | 79 | ### 2.3 GC Net 80 | 81 | **GCNet是作者分析SENet得出的,其实就是通过1*1的卷积达到降维的目的:** 82 | 83 |
84 | 85 |
86 | 87 | 88 | 89 | ## 3. 总结: 90 | 91 | **** 92 | 93 | **GCNet我觉得十一篇非常棒的文章,我个人非常喜欢这种类型的文章,通过试验分析然后再解决问题,不像很多文章基本都是发现一个提升点就在那里狂讲故事。作者通过删掉每个query position的no-local bkock,建立一个共享global attention为每一个query position享用,这一步能省去很多计算量,最后再通过1*1卷积降维的作用进一步减小计算量,使之能够嵌到网络的每一个residual block中可以提升精度。no-local net的层数一般不会太多,计算负担不起,而嵌入GCNet的网络类似resnet,层数一般很深又加持了no-local特征精度当然蹭蹭涨。** -------------------------------------------------------------------------------- /网络篇/GCNet.md: -------------------------------------------------------------------------------- 1 | ## ****GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond**** 2 | 3 | ## 1.概述: 4 | 5 | **GCNet通过分析No-Local(Non-local Neural Networks)网络,实现发现No-Local网络用了大量的计算量来建立的特征长程关系,但是却发现通过No-local网络来建模的全局语义信息在不同的点上几乎是相同的。对于这一现象,作者进行了改进。** 6 | 7 | 8 | 9 | 10 | ## 2. 具体实现: 11 | 12 | ### 2.1 No-Local Net 13 | 14 | **No-Local信息能够更好的理解图像,不管是RNN还是CNN,都通过重复堆叠的形式来获取No-Local信息,但是这会存在几个问题:** 15 | 16 | - **为了获取No-Local信息,通常需要堆叠很深的深度** 17 | - **大量的参数导致优化并不容易** 18 | - **这种方式提取的特征也并不是那么No-Local,比如通过卷积,最终32倍下采样,那么特征图的右下角和左上角肯定还是没什么交集的,所以并不是那么No-Local** 19 | 20 | **为此No-Local网络的提出使得网络能够以更浅的层实现完全No-Local的目的,主要分为3个步骤:** 21 | 22 | 1. **一个上下文建模单元通过聚集所有点的特征形成一个全局上下文特征** 23 | 2. **一个特征转换单元获取channel-wise的互相依赖关系** 24 | 3. **一个融合单元融合所有点全局上下文特征** 25 | 26 | **只看这三个步骤可能有些疑惑,看公式和框架图会更加清楚一点:** 27 | 28 |
29 | 30 |
31 | 32 | 33 |
34 | 35 |
36 | 37 | ​ 图1 38 | 39 | ### 2.2 No-Local Net缺点 40 | 41 | 为了更加直观的了解No-Local block,作者可视化了不同位置的attention map,如下图所示: 42 | 43 |
44 | 45 |
46 | 47 | **图中红色的点是query position,可以看到不同的query position的attention map竟然几乎相同,如果说图像比较直观,那么数据就更加客观,作者分析特征之间的距离,主要包括:1. no-local block input之间的距离,2. no-local block output before fusio之间的距离,3. query position attention map之间的距离,结果如下图所示:** 48 | 49 |
50 | 51 |
52 | 53 | 54 | 55 | **从上图中可以看出不同input的余弦距离还是蛮大的,但是output的距离却很小,attention map的距离也很小。说明为每一个query position通过一个No-Local block获取global context,global context随着训练的进行会变得相似。** 56 | 57 | ### 2.2 Simplify-No-Local Net 58 | 59 | **有了以上发现,这座机智的设计了一个简化版本的 No-Local Net,既然global context与query position关系不大,那么就没必要为每一个query position获取其global context,这样太耗时。于是作者就为每一个query position共享一个global attention map,反正都是一样的,那么共享一个能够省掉很多计算量,岂不美哉。** 60 |
61 | 62 |
63 | 64 |
65 | 66 |
67 | 68 | ### 2.3 GC Net 69 | 70 | **GCNet是作者分析SENet得出的,其实就是通过1*1的卷积达到降维的目的:** 71 | 72 |
73 | 74 |
75 | 76 | 77 | 78 | ## 3. 总结: 79 | 80 | **** 81 | 82 | **GCNet我觉得十一篇非常棒的文章,我个人非常喜欢这种类型的文章,通过试验分析然后再解决问题,不像很多文章基本都是发现一个提升点就在那里狂讲故事。作者通过删掉每个query position的no-local bkock,建立一个共享global attention为每一个query position享用,这一步能省去很多计算量,最后再通过1*1卷积降维的作用进一步减小计算量,使之能够嵌到网络的每一个residual block中可以提升精度。no-local net的层数一般不会太多,计算负担不起,而嵌入GCNet的网络类似resnet,层数一般很深又加持了no-local特征精度当然蹭蹭涨。** -------------------------------------------------------------------------------- /网络篇/readme.md: -------------------------------------------------------------------------------- 1 | 2 | --------------------------------------------------------------------------------