算法分类:
两步走: 推荐区域region proposal + 分类
端到端:一个网络输入到输出。类别+位置
分类: 得出每个类别的概率,比较得到最大概率
训练:softmax 进行概率计算,交叉熵损失衡量
当图片中有一个类别时:分类+定位
分类:准确率 mAP
定位 :IoU (交并比):两个框相交的面积除以两个框占的所有面积
目标的位置框 : bounding box
解决思路:让网络多输出一个全连接层
FC1:分类输出概率值
FC2:回归输出 四个位置坐标
一个图片多个目标对象时,网络输出不确定,全连接层回归输出的坐标为多个
R-CNN 基础算法
overfeat模型: k个滑动窗口,每个窗口M个子图,从左到右 从上到下滑动 找到子图,k*m个子图,对于每一个子图进行分类回归。
该方法为暴力穷举的方式,消耗大量的计算力
R-CNN 用候选区域方法
(1)找出可能存在的region proposal,进行图片大小调整
选择性搜索Selective search 将每个像素作为一组,然后计算每一组的纹理,并将两个最接近的组结合起来。
最初使用AlexNet结构227*227,crop+warp ,截取原图片的一个固定大小的patch,将原图片的roi缩放到一个固定大小的patch.
(2)通过CNN对候选区域提取特征向量
提取的特征保存在磁盘中,【2000,4096】
(3)20个svm分类器进行分类,得到2000*20的得分矩阵
20个不同类别的分类器,每个分类器都是二分类,每个分类器都会对2000个候选区域的特征向量分别判断一次,得出【2000,20】的得分矩阵,
(4)进行NMS,提出候选框
对所有2000个候选区域得分进行筛选,然后对剩余的候选框每个类别进行IoU筛选。 如果IoU大与阈值(0.5)则删除那个非极大值的框
(5)修正bbox,对bbox回归微调
建立bbox regressor 回归用于修正筛选后的候选区域,使之回归于groundtruth,默认这两个框之间是线性关系,因为在最后筛选出来的候选区域和groundtruth很接近了。
通过线性回归,特征知识候选区域,目标值是groundtruth,建立回归方程
R-CNN训练过程
(1)正负样本准备 对于训练集中的所有图像采用ss方式来获取,得到2000个region proposal, 但不是每个候选区域都去训练,保证政府样本1:3
(2)预训练 采用imageNet等训练,保存模型参数。
(3)微调 fine-tuning 利用标记好的样本,作为网络的输入,继续训练网络进行参数微调。
(4)训练SVM分类器,每个类别训练一个分类器,正负样本标记结果
(5)bbox回归器训练,只对那些跟groundtruth的IoU超过某个阈值(比较大)且IoU最大的region proposal回归,其余的不参与。
缺点:
(1)训练阶段太多,步骤繁琐
(2)训练耗时
(3) 处理速度慢
(4)图片形状变化:候选区域需要经过crop/warp 进行固定大小,无法保证图片不变形。
SPPNet
改进:减少卷积计算,防止图片内容变形
一张图片直接全部卷积计算,取出crop+warp操作
SPPNet把全图塞给CNN得到全图的feature map, 让候选区域与featuremap直接映射,得到候选区域的映射特征向量。映射过来的特征向量大小不固定,这些特征向量给SPP层(空间金字塔变换层),SPP层接受任何大小的输入,输出固定大小的特征向量,再给FC层。
将候选区域映射到特征图当中,得出每个候选区域的特征向量。
SPP层 空间金字塔变换层
对于M个候选区域,每个都要经过SPP层进行变换,得到 4*4 2*2 1*1 的max pooling结果
输出每个候选区域的特征向量都是(16+4+1)*256 (不同网络卷积输出通道数不一定一样)
sppNET减少了计算时间
缺点训练依然慢,特征需要写入磁盘(因为SVM存在) 需要分阶段训练
Fast R-CNN
改进: 提出RoI pooling 把CNN SPP层 分类器 bbox回归几个模块一起训练
softmax分类替代SVM, 生成n个类别+1个背景
RoI pooling 简单版本的SPP 是一个简单版本的SPP层,目的是为了减少计算时间并且得出固定长度的向量
将SPP层改为单个块 ,转换成具有H * W固定空间范围的小feature map, h w是超参数,独立于任何特定的roi
Single scale 更快 multi scale 即金字塔
End-to-end model
从输入端到输出端直接用一个神经网路相连,整体优化目标函数。
使用softmax 分类 roi pooling能进行反向传播,spp层不适合
多任务损失: 分类loss是一个N+1路的softmax输出,其中N是类别个数,1是背景,使用交叉熵损失;
回归Loss是一个4*n路输出的regresor,也就是对于每个类别都会训练一个单独的regressor,使用平均绝对误差MAE损失,即L1损失
Fine-tuning 在微调时可以一起调整参数
Fast r-cnn缺点 使用ss提取region proposals 没有实现真正意义上的端对端
Faster R-CNN
去掉SS方法 加快速度
区域生成网络+ fast R-CNN模型
Region Proposal Network
步骤:
(1)CNN(VGG16)中输入任意大小的图片提取featuremap
(2)Feature map 被共享用于RPN层和全连接层
(3)经过RPN层生成候选区域
(4)候选区域与特征图共同输入到RoI pooling,得到每个候选区域的特征图然后进行softmax,bbox预测
RPN网络原理:
主要作用是得出比较准确的候选区域
用n*n(3*3)的大小窗口去扫描特征图,每个滑窗位置映射到一个低维的向量(256),并为每个滑窗位置考虑k中可能的参考窗口(anchors);
低维特征向量输入两个并行链接的1*1卷积层然后得出两个部分,reg窗口回归层(用于修正位置)和cls窗口分类层(是否为前景或背景概率)
3*3滑动窗口每个中心点得到9个anchor boxes,长宽通过尺度和长宽比进行计算,得到最原始的anchor boxes(候选区域)
需要一个候选区域的校正过程:(即RPN网络的训练)
训练样本anchor标记:
每个groundtruth box有着最高IoU的anchor标记为正样本
剩下的anchors与任何groundtruth box的IoU大于0.7记为正样本,IoU大于0.3小于0.7的为负样本;其他的anchors全部丢掉
RPN网络的分类是二分类(是否有物体),回归(anchor->proposal)
候选区域的训练是为了让的出来的正确的候选区域并且经过微调,
Faster R-CNN的训练 两个网络的训练,两个网路ode损失合并到一起训练。
YOLO
You only look once
输入448*448
googleNet + 4个卷积+两个全连接层 输出得到7*7*30特征图,然后经过检测程序得到最终结果
最后30可以通过全连接层来控制
不做筛选,直接每个小框3*3中用两个框来预测
检测程序引入单元格的概念 grid cell
每个单元格负责预测一个物体类别,并且直接预测物体的概率值。
每个单元格预测两个bbox位置,49个框一共98个bbox,
输出 7*7*30 (4+1+4+1+20)4个坐标信息,1个置信度,20个类别的概率预测结果
筛选一个bbox作为训练,
通过confidence 进行筛选,
每个bounding box 都对应一个confidence score,如果grid cell 里面没有object, confidence为0, 则confidnece score 等于预测的box和 groundtruth 的IoU值
如果一个object 的groundtruth的中心点坐标在一个grid cell中,那么这个cell就包含这个object
每一个单元格:输出一个confidence高的bbox位置,一个概率大的类别。
YOLO速度快 效果会打折扣,对小目标和靠得很近的物体预测效果不好。
SSD 兼顾速度与精度