FPN
背景Faster-RCNN选取一个特征提取网络如VGG16做backbone,然后在高层特征(如VGG16后面的conv4)接RPN和检测头进行网络。正是由于Faster-RCNN基于图像的高级特征,这就导致对小目标的检测效果很差。而CV领域常用的处理尺度问题的办法就是特征金字塔,将原图以不同的比例采样,然后得到不同分辨率的图像进行训练和测试,在多数情况下确实是有效的。但是特征金字塔的时间开销非常大,导致在工程中应用是及其困难。FPN从新的角度出发提出了一个独特的特征金字塔网络来避免图像金字塔产生的超高计算量,同时可以较好的处理目标检测中的尺度变化问题,对小目标检测更鲁棒,同时在VOC和COCO数据集上MAP值均超过了Faster-RCNN。 简介使用下图来阐释是如何处理尺度变化大的物体检测的。 上图(a)是处理这类问题最常用的方法,即特征金字塔,这种方法在传统的手动设计特征的方法中非常常用,例如DPM方法使用了接近10种不同的尺度获得了不错的效果。 上图(b)是在CNN提出之后出现的,因为神经网络模型对物体尺度本身有一定的鲁棒性,所以也取得了不错的性能,但最近的研究表明将特征金字 ...
YOLOv3及YOLOv3-Tiny
算法原理YOLOv3应该是现在YOLO系列应用的最广泛的算法了,基本就很少有人做工程还用V2了。而YOLOv3的算法原理也很简单,就引入了2个东西,一个是残差模型,一个是FPN架构。 残差模型Darknet-53YOLOv3在YOLOv2提出的Darknet-19的基础上引入了残差模块,并进一步加深了网络,改进后的网络有53个卷积层,命名为Darknet-53,网络结构如下: 同时为了说明Darknet-53的有效性,作者给出了在TitanX上,使用相同的条件将256 x 256的图片分别输入到以Darknet-19,Resnet-101,以及Resnet-152以及Darknet-53为基础网络的分类模型总,实验结果如下表: 从结果来看,Darknet-53比ResNet-101的性能更好,而且速度是其1.5倍,Darknet-53与ResNet-152性能相似但速度几乎是其2倍。同时,Darknet-53相比于其它网络结构实现了每秒最高的浮点数计算量,说明其网络结构可以更好的利用GPU。 YOLOV3结构一张非常详细的结构图,其中YOLOv3有三个输出,维度分别是: (batc ...
YOLOv2损失函数详解
前言YOLOv2详细讲解了YOLOv2的算法原理,但官方论文没有像YOLOv1那样提供YOLOv2的损失函数,难怪Ng说YOLO是目标检测中最难懂的算法。今天我们尝试结合DarkNet的源码来分析YOLOv2的损失函数。 关键点回顾直接位置预测YOLOv2借鉴RPN网络使用Anchor boxes来预测边界框相对于先验框的offsets。边界框的实际中心位置$(x, y)$需要利用预测的坐标偏移值$\left(t_{x}, t_{y}\right)$,先验框的尺度$\left(w_{a}, h_{a}\right)$以及中心坐标$\left(x_{a}, y_{a}\right)$来计算,这里的${x}_{a}$和${y}_{a}$也即是特征图每个位置的中心点: 上面的公式也是Faster-RCNN中预测边界框的方式。但上面的预测方式是没有约束的,预测的边界框容易向任何方向偏移,例如当$t_{x}=1$时边界框将向右偏移Anchor的一个宽度大小,导致每个位置预测的边界框可以落在图片的任意位置,这就导致模型训练的不稳定性,在训练的时候要花很长时间才可以得到正确的offsets。所以, ...
AlexeyAB DarkNet BN层代码详解(batchnorm_layer.c)
BatchNorm原理 这是论文中给出的对BatchNorm的算法流程解释,这篇推文的目的主要是推导和从源码角度解读BatchNorm的前向传播和反向传播,就不关注具体的原理了(实际上是因为BN层的原理非常复杂),我们暂时知道BN层是用来调整数据分布,降低过拟合的就够了。 前向传播推导前向传播实际就是将Algorithm1的4个公式转化为编程语言,这里先贴一段CS231N官方提供的代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647def batchnorm_forward(x, gamma, beta, bn_param): """ Input: - x: (N, D)维输入数据 - gamma: (D,)维尺度变化参数 - beta: (D,)维尺度变化参数 - bn_param: Dictionary with the following keys: - mode: 'train' 或者 ...
SSD
摘要本文提出了仅需要单个卷积神经网络就能完成目标检测的算法,并命名为SSD(Single Shot Detector)。SSD算法将目标框的输出空间离散化为一组在每个特征图位置不同大小和形状的默认框。预测时,网络对位于每个默认框类的物体类别进行打分,并修正默认框位置来更好的匹配物体的位置。此外,SSD网络在不同分辨率的特征图上预测,这样就可以处理大小不同的物体。SSD比那些需要搜索物体候选框的算法简单,因为它完全去除了proposal生成和随后的特征再筛选的过程,把所有的计算封装在一个网络里面。这使得SSD训练起来很容易,可以直接加入到检测系统里面。在PASCAL VOC,COCO,和ILSVRC数据集上的实验也证明,与那些需要object proposal的算法相比,SSD在保证准确性的同时,速度更快。SSD只需一个完整的框架来训练和测试。在NVIDIA Titan X对于一个大小是300 x 300的输入图像,SSD在VOC2007测试上的MAP是74.3%,速度是59FPS。对于512 x 512的输入,SSD的MAP是76.9%,比Faster RCNN更准。和其他单阶段的 ...
AlexeyAB DarkNet池化层代码详解(maxpool_layer.c)
原理为了图文并茂的解释这个层,我们首先来说一下池化层的原理,池化层分为最大池化以及平均池化。最大池化可以用下图表示: 可以看到最大池化层需要记录池化输出特征图的每个值是由原始特征图中哪个值得来的,也就是需要额外记录一个最大值在原图的中的索引。而平均池化只需要将上面的求最大值的操作换成求平均的操作即可,因为是平均操作所以就没必要记录索引了。 池化层的构造池化层的构造由make_maxpool_layer函数实现,虽然名字是构造maxpool_layer,但其实现也考虑了平均池化,也就是说通过参数设置可以将池化层变成平均池化。这一函数的详细讲解请看如下代码,为了美观,我去掉了一些无关代码,完整代码请到github查看。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394/*** 构建最 ...
YOLOv2
原理YOLOv1作为One-Stage目标检测算法的开山之作,速度快是它最大的优势。但我们知道,YOLOv1的定位不够准,并且召回率低。为了提升定位准确度,提高召回率,YOLOv2在YOLOv1的基础上进行了改进。具体的改进方法如图Fig1所示: 可以看到YOLOv2通过增加一些Trick使得v1的map值从63.4提高到了78.6,说明了YOLOv2改进方法的有效性。接下来我们就分析一下这些改进方法。 批量归一化这个应该不用多说了,YOLOv2在每个卷积层后面增加了BN层,去掉全连接的dropout。使用BN策略将map值提高了2%。 高分辨率当前大多数目标检测网络都喜欢使用主流分类网络如VGG,ResNet来做Backbone,而这些网络大多是在ImageNet上训练的,而分辨率的大小必然会影响到模型在测试集上的表现。所以,YOLOv2将输入的分辨率提升到$448 \times 448$,同时,为了使网络适应高分辨率,YOLOv2先在ImageNet上以$448 \times 448$的分辨率对网络进行10个epoch的微调,让网络适应高分辨率的输入。通过使用高分辨率的输入,YO ...
YOLOV3损失函数代码详解(yolo_layer.c)
前言YOLOV3的损失函数在YOLOV2的基础上,用多个独立的逻辑回归损失代替了YOLOV2里面的softmax损失,然后去掉了对Anchor在前12800次训练轮次中的回归损失,也即是YOLOV2损失函数的第二项。另外新增了一个ignore_thresh参数来忽略一些和GT box的IOU大于ignore_thresh的预测框的objectness损失。除了以上细节,其它部分和YOLOV2的处理类似。 AlexeyAB的一些更新除了上面提到的相对于YOLOV2一些基础改动,AlexeyAB大神在目标框回归过程中新增了IOU/GIOU/DIOU/CIOU Loss,并且在分类过程中新增了Focal Loss,方便大家在自己的数据集上进行试验,预祝涨点。 代码解析步骤[yolo]层YOLOV3使用[yolo] 层来计算损失函数以及预测分类和边界框回归,前面经过 darknet-53 的基础网络提取特征,又经过一些特征融合,就得到了3个不同尺度的 yolo 层,分别预测大、中、小物体。主要代码在/src/yolo_layer.c。cfg文件的配置如下:123456789[yolo]mask ...
YOLOv1
创新点 将整张图作为网络的输入,直接在输出层回归bounding box的位置和所属类别。 速度快,One-Stage检测算法开山之作。 介绍回顾YOLO之前的目标检测算法,都是基于产生大量可能包含物体的先验框,然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区域再进行检测的方法虽然有较高的精度,但速度非常慢。YOLO直接将目标检测堪称一个回归问题进行处理,将候选区和检测两个阶段合二为一。YOLO的检测过程如下所示:事实上,YOLO并没有真正的去掉候选区,而是直接将输入图片划分成7 x 7=49个网格,每个网格预测两个边界框,一共预测49 x 2=98个边界框。可以近似理解为在输入图片上粗略的选取98个候选区,这98个候选区覆盖了图片的整个区域,进而用回归预测这98个候选框对应的边界框。 原理介绍YOLO将输入图像划分为S x S的栅格,每个栅格负责检测中心落在该栅格中的物体。每一个栅格预测B个bounding boxes, ...
YOLOV2损失函数代码详解(region_layer.c)
YOLOV2损失函数YOLOV2对每个预测box的[x,y],confidence进行逻辑回归,类别进行softmax回归; 在Darknet中,损失函数可以用下图来进行表示: 可以看到这个损失函数是相当复杂的,损失函数的定义在Darknet/src/region_layer.c中。对于上面这一堆公式,我们先简单看一下,然后我们在源码中去找到对应部分。这里的$W$和$H$代表的是特征图的高宽,都为13,而$A$指的是Anchor个数,YOLOv2中是5,各个$\lambda$值是各个loss部分的权重系数。我们将损失函数分成3大部分来解释: 第一部分:第一项需要好好解释一下,这个loss是计算background的置信度误差,这也是YOLO系列算法的特色,但是用哪些预测框来预测背景呢?这里需要计算各个预测框和所有的ground truth之间的IOU值,并且取最大值记作MaxIOU,如果该值小于一定的阈值,YOLOv2论文取了0.6,那么这个预测框就标记为background,需要计算$\lambda_{n o o b j}$这么多倍的损失函数。为什么这个公式可以这样表达呢?因为 ...