机器不学习:卷积神经网络CNN笔记-目标探测2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器不学习:卷积神经网络CNN笔记-目标探测2
算法
神经网络的分类思想是对多个位置,不同尺寸,用卷积神经网络判断区域内图片是不是某物,候选位置(proposal)提出方法一般用EdgeBox。
R-CNN 最初提出的时候选择 20 类进行探测,是在 ImageNet 模型的基础上,把1000 类的分类模型变成能识别21 类(20类+other)的 Fine-tune 分类模型。
=>
特征的提取过程: 对图片计算候选区域;对候选区域切分图片,对切分部分进行 resize 变成输入大小;提取相应高级特征;存储特征(大容量,200-300G空间存储图片)
单独目标探测器训练:对每一类进行单独训练,保证每一类训练数据平衡,每一类都是 binary 分类(yes/no)。
比如猫的分类器,可能大部分图片没有一个理想的猫,只有一个耳朵,这不算猫,我们要与真值进行比较,看左上右下区域,如果重合(共有区域)比较多,就认为是猫的图片。
每一类都有很多的正例反例(1/0)。
单独目标回归器训练-基于候选区域微调: 同样的,每一类单独训练,保证每一类训练数据平衡,这里是每一类做BBOX 回归。
目的是在知道是不是猫以及位置的偏移后,用回归对位置进行offset,离真值(ground truth)更近,最终的探测精度会更高。
总的来说,R-CNN 的测试过程就是
1.对每个图像生成 1k-2k 个候选区域
2.对每个候选区域,使用深度网络进行特征计算
3.特征喂给每一类的 svm 分类器,判别是否属于该类分类;同时用回归修正候选框位置
4.后续处理
1.
常用数据集
评估方法
•MAP(mean average precision)
•IoU
,真值和预测值多重叠部分与两者的并集的比值,一般大于0.5
就认为是正确的
•
R-CNN 结果对比
Regionlets(2013) 并没有经过fine-tune,R-CNN(2014, AlexNet) 用事先训练好的分类器进行了fine-tune,R-CNN+bbox reg(AlexNet),用了 regression,加了 offset 对检测框做了范围调整,R-CNN(vgg-16)把 base model 改成了 vgg
总的来说,主要是从下面三个角度进行了模型的调整
1.Finetune
2.回归微调
3.Base 模型
1.
优缺点
优点:
N 用于目标探测,利用了 CNN 高效识别能力,大大提高性能
2.摆脱人为设计物品模版,方法具有通用性
3.分类+回归,有了找到精确位置的可能
缺陷:
1.为了检测一个目标,所有候选区域计算,大量卷积运算,非常慢
2.对于速度慢这个问题,SPP-NET 给出了解决方案。
R-CNN 对图像提完 region proposal(2k 左右)之后将每个 proposal 当成一张图像进行后续处理(CNN提特征+SVM分类),实际上对一张图像进行了2000次提特征和分类的过程!SPP-NET 对图像提一次卷积层特征,然后将region proposal 在原图的位置映射到卷积层特征图上,这样对于一张图像只需要提一次卷积层特征,然后将每个 region proposal 的卷积层特征输入到全连接层做后续操作
3.SVM 训练与CNN 断裂, SVM Loss 没办法用于 CNN Loss,有效信息不能用于优化模型, not end-to-end
4.每一类单独训练,异常繁琐
Fast R-CNN(ICCV2015)
Fast R-CNN 的三个进步
•共享卷积计算
•增加 ROI pooling layer
•完整训练(end-to-end)
•用 softmax 代替 svm 分类,用多目标损失函数加入候选框回归,除 region proposal 提取外实现了 end-to-end
•多目标一起学习
•
共享卷积计算
Fast R-CNN 在最后一个卷积层后加了一个 ROI pooling layer,实际上就是上面提到的 SPP-NET 的一个精简版,特点是:
1.卷积计算保持空间位置
2.共同区域的卷积计算只需进行一次
3.切割候选区+提取特征图=计算完整特征图+切割对应候选区
4.把图片的region proposal 切割出来,resize,提取特征,其实就等同于在原图特征图里找到 region proposal
1.一个重要的问题是不同区域的特征如何保持一致?
全连接层要求接的区域形状一致;所以要特征图里区域的一致性处理,也就是做一个 pooling
特征一致化 - Max Pooling
局部区域
100x50 =>按 4:2 pooling
50x100 => 按 2:4 pooling
=> 25x25 feature
=> 225 FC
如果 pooling size 不完美,其实也没有问题,pooling 本身就是填充pooling 后的图的每一个pixel,只要从pooling 前某区域选一个 pixel 值即可,不一定要规整
位置 + 类别联合学习
图片 => cnn feature map计算 => proposal应用 => feature map相应区域做region pooling 得到固定大小的feature map => classification & regression
用softmax 代替svm 分类,使用多任务损失函数(multi-task loss),将候选框回归直接加入到cnn 网络中训练,除去region proposal 的提取阶段,这样的训练过程是端到端的(end-to-end),整个网络的训练和测试十分方便
性能提升
看一下性能提升的情况
然而前提是不考虑候选区域(proposal)的生成,如果加上候选区域(proposal)的时间
region proposal 的提取使用 selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),无法满足实时应用,那么,怎么解决候选区域的计算呢?一个方法是也靠神经网络。
Faster R-CNN(NIPS2015)
RPN(Region Proposal Network)
用神经网络来解决候选区域的生成问题,主要是神经网络特征增加一组输出 RPN(Region Proposal Network)候选区域网络
1.直接产生候选区域,无需额外生成
2.本质上是 sliding window,RPN 只需在最后的卷积层上滑动一遍,因为anchor 机制和候选框回归可以得到多尺度多长宽比多region proposal
3.直接用于后续特征图切割
最后的特征图中有很多个pixel,每个pixel 和卷积核进行计算,生成k 个可能的prpoposal(实际中k 往往=9,一个区域可能同时被多个物体占用,所以尽可能把可能分布的形状都生成),每个 proposal 有个 score 的计算。
如图,左边是 3x3 的卷积网络的特征图,右边是k 个anchor box(相当于小的候选生成单元)。
我们对特征图进行sliding window 的计算,每个 pixel 生成 256 长的向量(向量长度其实是自己设计的,vgg 建议 512-d),这个向量用来生成 k 个 proposal 的值,以及对应的 2k score(是/不是目标物体),4k 个 coordinates(上下左右坐标)。
网络输出的值:
1.是不是一个目标
2.覆盖范围的相对位置
k=9(3种尺寸,3种长宽比)个 anchor,能产生多少个 proposal?
特征图 size HxW -> HWx9 in paper 2400x9
如果是 VGG conv5 作为特征图,3x3 区域对应的原始图像区域?
经过了4 个pooling,往前推,6x6 -> 12x12 -> 24x24 -> 48x48,也就是 16 倍的一个缩放
Anchor的平移不变怎么理解
较小的平移 pooling 过程中忽略,3 个 pixel 的移动经过 4 层的pooling,移动后的位置和原位置相差可以忽略
Anchor 同外接 Proposal 区别
数量:1-2个数量级减少;性能:更高效;
速度:10x
Anchor 设计的借鉴意义?
神经网络有能力找到最终量,也有能力找到很多中间量。
只用Anchor 判断是不是目标,会不会存在大材小用,能够判断更多吗?或者说,能在是不是目标的基础上,判断是什么目标吗,也就是直接拟合
为了让RPN的网络和Fast R-CNN网络实现卷积层的权值共享,训练 RPN 和 Fast R-CNN的时候用了4阶段的训练方法:
1.使用在 ImageNet 上预训练的模型初始化网络参数,微调 RPN 网络;
2.使用(1)中RPN网络提取region proposal 训练Fast R-CNN 网络;
3.使用(2)的 Fast R-CNN 网络重新初始化 RPN, 固定卷积层进行微调;
4.固定(2)中Fast R-CNN 的卷积层,使用(3) 中RPN 提取的region proposal 微调网络
1.
Faster R-CNN 用了直接联合学习(joint learning) 的方法,如上图,一个网络有 4 个损失函数
1.Anchor 是不是目标
2.Anchor 回归候选区域回归
3.Fast R-CNN 分类
4.Fast R-CNN 基于候选位置回归
5.联合学习的方法产生了更少的候选区,但是精度不会受到影响,速度却快了 10 倍,接近于实时处理(@K40 GPU, 12G)。
性能提升
接近于实时处理,然而还是很难实时的目标探测,下面的YOLO 这类方法可以达到实时性。
神经网络回归: YoLo 系列方法
YoLo
算法
YoLo 将目标探测任务看作目标区域预测和类别预测的回归问题,用单个神经网络直接预测物品边界和类别分数,可以直接找到物体是什么,在哪里。
把图片分成 SxS 的格子(grid cell),一般是 7x7 的网络,每个网格生成:
1.B 个 Bbox,4 个 coordinates + 1 个 confidence score
2.N 个类别分数 Pr(Class
3.i
4.|Object)
5.Pr(Classi|Object)
6.与 Anchor 不同的是,这里有 N 个分数,表示属于每一类的分数分别是多少
S=7, B=2, N=20
总共的回归目标: SxSx(5B+N)
2x5+20=30 个参数,49x30=1470 个数值,用来回归
候选区域个数: (B=2) 98 个 < faster="">
每个小区域生成2 个候选区,一个小的区域就是一个粗糙的proposal,对小区域进行大范围的 regression,找到目标
损失函数:
性能
性能:
•实时运行
•精度稍微下降
•定位精度较差
经过大量的 pooling,位置的响应会有一定弱化
Limitations
1.YoLo 的每一个网格只预测两个 boxes,一种类别。
这导致模型对相邻目标预测准确率下降。
因此,YOLO 对成队列的目标(如一群鸟)识别准确率较低。
2.YoLo 是从数据中学习预测 bounding boxes,因此,对新的或者不常见角度的目标无法识别。
3.YoLo 的损失函数对small bounding boxes 和large bounding boxes 的 error 平等对待,影响了模型识别准确率。
因为对于小的 bounding boxes,small error影响更大。
SSD: The Single Shot Detector
SSD 分类更细,网络结构有点像resnet。
中间多层特征参与位置、种类计算,在不同 layer 输出的不同尺寸的 feature map 划格子,在格子上提“anchor”,弥补了 Yolo 只在最后一层分 7x7 的框漏掉的部分。
和 Yolo 相比,更快更准确。
•候选区 98 vs 8732
•速度 21:46 (vgg base)
•精度 66.4:74.3
参考链接:
目标检测方法——从RCNN、Fast-RCNN到Faster-RCNN
YOLO:实时快速目标检测。