RCNN的流程
- Selective Search做候选框提取,1000~2000个
- 候选框Resize到固定大小,输入CNN提取特征
- 特征直接进行SVM分类,得到分类结果
- 进一步进行调整位置
SPPNet的创新点
-
结合空间金字塔方法实现CNNs的多尺度输入。
SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。换句话说,在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。简言之,CNN原本只能固定输入、固定输出,CNN加上SSP之后,便能任意输入、固定输出。
ROI池化层一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接FC层。 -
只对原图提取一次卷积特征。
在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。
而SPP Net根据这个缺点做了优化:只对原图进行一次卷积计算,便得到整张图的卷积特征feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,完成特征提取工作。如此这般,R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。
-
特意说明下:fast rcnn中的spplayer(ROI Pooling),最后输出维度一致是因为是一维线性直接进行的拼接(后面会用到FC);yolov3及后系列的spplayer,输出后维度一致是因为在不同核大小池化过程中,采用的是步长s=1,padding=k//2,最后得到WH_out = k+1尺度的特征。两者的用途不一,前者是为了解决任意输入固定输出的问题,后者为了提升小目标检测能力等问题。
Fast RCNN的流程
-
Selective Search做候选框提取,1000~2000个
-
计算整张图像的特征shared feature map,并将候选框(ROI,感兴趣区域)映射到对应的shared feature map(New)
注:映射规则比较简单,就是把各个坐标除以“输入图片与feature map的大小的比值”,得到了feature map上的box坐标
-
利用ROI Pooling调整到固定尺寸的特征(New)
-
将特征送入CNN提取新特征
-
分类和回归两个损失同时进行监督训练(全连接)(New)
-
ROI Pooling操作
-
根据输入image,将ROI映射到feature map对应位置
-
将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同)
-
对每个sections进行max pooling操作,得到batch×channel×W×H维度的特征
-
Faster RCNN的流程
- 计算整张图像的特征feature map
- 将特征送入RPN网络,回归一系列候选框的信息(目标+坐标,k个锚框),这里需要做回归训练(New)
- 利用ROI Pooling调整到固定尺寸的特征
- 将特征送入CNN(FC)提取新特征
- 分类和回归两个损失同时进行监督训练(全连接)
SSD的创新点
-
使用 VGG16 网络作为特征提取器(和 Faster R-CNN 中使用的 CNN 一样),将后面的全连接层替换成卷积层,并在之后添加自定义卷积层,并在最后直接采用卷积进行检测。
-
不同于Faster R-CNN只在最后一个特征层取anchor, SSD在多个特征层上取default box,可以得到不同尺度的default box
-
在特征图的每个单元上取不同宽高比的default box,一般宽高比在{1,2,3,1/2,1/3}中选取,有时还会额外增加一个宽高比为1但具有特殊尺度的box
-
为了使正负样本尽量均衡(一般保证正负样本比例约为1:3),SSD采用hard negative mining, 即对负样本按照其预测背景类的置信度进行降序排列,选取置信度较小的top-k作为训练的负样本。
-
Q1,如何设置default boxes Q2,怎样对先验框进行匹配 Q3,怎样得到预测的结果
YOLOv1(将检测任务当作回归任务)
- 网络结构:24个卷积+2个全连接(图像位置+类别概率)
- 输入:1x3x448x448尺度图像
- 输出:7 × 7 × 30的尺度,30=20+(4+1)*2,20 为类别数,4为位置,1为score置信度
- 损失函数:分为坐标预测、含有物体的边界框的confidence预测(权重较高)、不含有物体的边界框的confidence预测(权重较小)、分类预测四个部分,使用的是L2损失
YOLOv2的创新点
- DarkNet作为主干网络
- 引入Anchor机制,避免了YOLOv1中全连接直接回归结果导致的信息丢失的问题,使用K-means聚类
- 引入BathNormalization,起到一定提升模型收敛速度的作用,防止模型过拟合
- 使用高分辨率网络输入
- 使用anchor中坐标中心和偏移量来直接回归预测目标的位置
- 借鉴SSD使用多尺度的特征图来做检测
- 多尺度训练,尺度大的预测效果好
- 移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3 × 3 × 2014 3\times 3 \times 2014 3×3×2014卷积层,同时增加了一个passthrough层,最后使用 1 × 1 1\times 1 1×1卷积层输出预测结果
YOLOv3的创新点
- 使用新的主干网络Darknet-53(引入残差块,53个卷积层)
- 使用FPN做多尺度预测
- 使用逻辑回归来代替Softmax做分类器
YOLOv4的创新点
- 输入端:新增了数据增强例如CutMix和Mosaic
- 主干网络:CSPDarkNet-53,Mish激活函数,DroupBlock
- 颈部网络:空间金字塔池化SPP,路径聚合PAN,特征金字塔网络FPN
- 头部网络:CIoU损失,DIoU_NMS
RetinaNet的创新点:
-
作者对One-stage系列算法进行研究发现了类别不平衡问题,对此提出Focal Loss,是对损失函数进行的改进,one-stage结合Focal Loss结合得到的网络是RetinaNet
-
什么是类别不均衡(class imbalance)?
答:负样本的数量极大于正样本的数量,比如包含物体的区域(正样本)很少,而不包含物体的区域(负样本)很多。比如检测算法在早期会生成一大波的bbox。而一幅常规的图片中,顶多就那么几个object。这意味着,绝大多数的bbox属于background。简单来说,因为bbox数量爆炸。 正是因为bbox中属于background的bbox太多了,所以如果分类器无脑地把所有bbox统一归类为background,accuracy也可以刷得很高。于是乎,分类器的训练就失败了。分类器训练失败,检测精度自然就低了。
Focal Loss的定义,引入了modulating factor即 ( 1 − p t ) γ (1-p_t)^\gamma (1−pt)γ, p t p_t pt反应了分类的难易程度
F L ( p t ) = − ( 1 − p t ) γ log ( p t ) FL(p_t) = -(1-p_t)^\gamma \log(p_t) FL(pt)=−(1−pt)γlog(pt)
- RetinaNet = ResNet + FPN + Two sub-networks + Focal Loss