文章目录
目前检测常用算法
RCNN系列, fast-rcnn, faster-rcnn (two-stage方法)
rcnn(2014) ref
主要思路:生成候选区域,然后对每个区域用深度网络提取特征,送到 N 个 SVM 分类器判断是否属于某一类,用回归器对位置进行精修。
精修的方式:用一个线性脊回归器(就是普通线性回归加 L 2 L_2 L2 norm,ref)来预测偏移和缩放值
基本上从整个网络的设计和实现思路上都进行了大幅的修改;还是需要离线 selective search 候选框的过程(2s),把原先对每个候选框做特征提取的过程改成 直接对全图做卷积,生成的如 40 * 60 的特征图,其上的每个点映射到原图上对应的候选框,因此所有的候选框都能共享特征图;
而每个候选框的特征图尺寸通常不一致,需要做一个 roi pooling 来归一化尺寸再输入到全连接层;
如何做 roi pooling? 将特征图均匀的划分成 M * N 块,每个块做 max pooling ,生成的就是相同尺寸的特征图;这里的输入层的一个节点可能跟输出层的多个节点相连。。
多任务训练(multi-task): 在深度网络的最后输出1 * 4096的特征向量,分别训练一个类别分类器 + 一个 bbox 回归器,loss 是各自 loss 的加权和。
整个推理的过程2.3s;
借图侵删
faster-rcnn(2015) ref
将 selective search 的候选框生成法改为 加一个 RPN(Region proposals network),实现 end-to-end.
主要介绍这里的 RPN 怎么工作的:如上的 40 * 60 的特征图,每个点对应原图对应位置 9 种尺寸(3种尺寸 * 3种长宽比)的候选框(具体如何映射的细节 todo),由此生成 40 * 60 * 9个候选框,RPN 通过一个分类任务和回归任务来确定哪些 候选框是前景还是背景,以及是否是 candidate 物体。最终选出128 或者 256 个候选框,继续后面的步骤。
yolo 系列,v1,v2,v3 (one-stage方法)
yolov1 参考
核心思路是将448*448的图像通过 VGG(特征提取过程) 转化成 7 * 7 * 30 的featuremap,7 * 7可以理解成网格划分,每个 Cell 预测2个 bounding box,一个 bbox 包含 (x1,y1,w1,h1, score1,x2,y2,w2,h2, score2, 20个类分别的概率) 总计30个元素组成的向量。所有的 cell 预测的 bbox (共 7 * 7 * 2个) 根据 nms 算法进行去重和择优,依据是每个 bbox 的score & 该 box 属于各个类别的概率。
细节:采用 pRelu,非 Relu。损失函数用 sum-squared error,整合定位和分类的误差,这里注意,定位的误差被归一化到0-1,方法是 x,y 定义为 bbox 中心距 grid cell 中心的相对距离,w&h 定义为 bbox 宽高/image 宽高;
其他的值本身属于概率,0-1之间。
损失函数由3部分组成:定位 error(包含 x,y, w,h)+ bbox 置信度 error(bbox 的打分)+ 分类 error(20个类别纵的分类误差和)
同时损失函数中,w&h 的计算做了 sqrt 取根号,原因是宽高对于小目标的影响比大的目标要大,缩小这个差距
。
box 包含 object 和不包含 object的权重是不一样的,不含object 的bbox 需要降低置信度权重
缺点:精确性差,小目标检测不好(一个 grid cell 只能最终最多确定一个bbox);降低了误检率,也降低了召回率;输入尺寸固定,只能 resize 到一个固定尺寸
yolov2 (2017)参考
解决上面的缺点
先简述一下思路:输入图像经过 Darknet-19 得到51 * 39 * 256 的 featuremap,然后对于 51 * 39 的单通道,对每个点进行两种预测,先找到每个点对应原图中的点作为中心点,假定每个点都取9种尺寸的 anchor box
(尺寸、比例和面积都不一样):
- 计算每个截取出来的 box 是前景和背景的概率得到 9 * 2 个值
- 计算当前这个截取的proposal区域与 ground truth 之间的差异,用4个值来标识从 proposal 到 gd 需要的平移缩放参数,即 9 * 4个值
最后怎么用,筛选出最终的目标?todo
改进:
- 输出层改成卷积层; 有啥好处? todo; 然后就变成了 darknet-19了。19 conv+5 max pool
- conv 全部用 BN。 = =
- K-means; 不采用人工设定的 anchor box,而是在数据集上进行 k-means 聚类获取 anchor box;聚类中的距离度量不采用欧式距离,而是 D = 1 − I O U ( b o x , c e n t r o i d ) D = 1-IOU(box, centroid) D=1−IOU(box,centroid),IOU 是交并比,减少图像较大时带来的不均衡问题;聚类的结果,选取5个 box
- 多尺度训练;每隔几次迭代后就会微调网络的输入尺寸。训练时每迭代 10 次,就会随机选择新的输入图像尺寸。尺寸从 320 * 320 -> 608 * 608
改进:
- 使用独立的分类器对每个类别进行二分类,代替 softmax(
softmax默认只分一类
); - 使用空间金字塔结构预测边界框:也就是采用多个 Scale 融合倒方式做预测,v3中每个 cell 预测3个 bounding box,但是因为多个 scale,如416 * 416 的输入,会预测 (1313+2626+52*52)*3 个 bbox,每个特征图预测3个,对小目标的检测效果更好;
- anchor box 更多,用来9个尺寸
- 网络结构变成了 Darknet-53:与 Darknet-19的区别是引入了 residual 结构(能解决层数太多的梯度问题),但为啥比 Resnet-xxx 的效果好呢?可能是其他网络基础单元的差异。。
SSD(one-stage方法)
- 多尺度特征图用于检测
- 最后采样卷积层进行检测,非全连接层;?
- 先验框,类似 yolo 的 anchor box,不过这里的先验框怎么来的?
- 网络基础结构,采用改进的 VGG16