目标检测
1.目标检测概述
1.1 项目演示介绍
- 项目架构
- 数据采集层:数据标注,数据存储格式.
- 深度模型层:数据预处理,模型多GPU训练,得到模型.
- Tensorflow serving进行部署+web后台.
- 用户层:网页,小程序获取识别结果.
1.2 项目安排
2. 目标检测算法原理
2.1 基础知识
- 目标识别:分类,输出目标类别,图(a)
- 目标检测:定位目标,输出目标类别与位置,图(b)
- 目标分割:像素级对前景与背景进行分类,把物体形状描述出来,将背景剔除,图©和图(d)
- 两步走:区域推荐 + 分类
- 端到端: 一个网络,输出类别
当图片只有一个物体的时候:分类 + 定位
- 分类:准确率
- 定位:IOU
- 目标的位置框:Bounding box
- Ground-truth bounding box:图片当中真实标记的框
- Predicted bounding box:预测的时候标记的框
- IOU:交并比
-两个区域的重叠程度ovrtlap:候选区域和标定区域的IOU值 = 重合的面积/两个框所有的面积
- 解决思路:
- 让网络中多出一个全连接层
- 1层输出概率值
- 2层输出四个位置坐标(回归算法输出)
- 预测:300,200,100,200 真实值:310, 200, 130, 200
- 解决思路:
多种物体:目标检测
- 图片中假设存在多个物体的时候,网络输出不确定,全连接层输出的坐标?个
解决思路之一:
- 滑动窗口:K个滑动窗口,M个子图,K*M个图
- 对没一个子图进行分类回归
2.2 Overfeat模型
这种方法类似以一种暴力穷举的方式,会消耗大量计算力量,并且由于窗口大小问题可能会造成效果不准确,但提供了一种解决目标检测的思路.(M和K不定)
2.3 目标检测-R-CNN模型
2.3.1 R-CNN训练过程
步骤(以AlexNet网络为基准):
-
1.找出图片中可能存在的目标候选区域region proposal.
- 通过选择性搜索(SelectiveSearch,SS)算法,进行筛选
- 打消统一:通过Crop+ Warp
-
2.进行图片大小调整, 为了适应AlexNet的网络输入图像大小227227,通过CNN对后选区域提取特征向量,2000个建议框的CNN特征组合成20004096维矩阵.
- AlexNet结构,输入要求277*277
- 提取出的特征会保存到磁盘中
- [2000, 4096]
-
3.将20004096维特征与20个SVM组成的权值矩阵409620相乘(20种分类,SVM是二分类器,则有20个SVM),获得2000*20维矩阵.
- 20代表目标检测数据集,一共需要检测20种类别
- 得出2000*20的得分矩阵,打分
- 4.分别对2000*20维矩阵中每一列即每一类进行非极大值抑制(NMS:non-maximum suppression)剔除重叠建议框,得到该列即该类中得分最高的建议框
以5个候选框为例:
- 5.修正bbox,对bbox做回归预测
- 通过线性回归,特征值是候选区域,目标值是对应的GT
- 建立回归方程学习参数
R-CNN的训练过程
- 过程包括:正负样本准备+预训练+微调网络+训练SVM+训练边框回归器
- 正负样本准备
- 预训练:
- 别人已经在大数据集上训练好的CNN网络参数
- 微调:
- 利用标记好的样本,输入到model1当中,继续训练得出model2(CNN网络),有教迁移学习.
- SVM分类器: 每个类别训练一个分类器
- 特征M4096,一个SVM,409620个权重
- 正负样本标记结果(100个猫,900非猫)
- 总共得到4096*20的SVM权重
- 特征M4096,一个SVM,409620个权重
- 回归训练:
- 筛选候选框,只对那些跟ground truth的IoU超过某个阈值且IoU最大的region proposal回归
- 训练得到回归的参数
- 正负样本准备
2.3.2 R-CNN测试过程
2.3.3 R-CNN的缺点
- 1.训练网络阶段多:步骤繁琐:微调网络+训练SVM+训练边框回归器
- 2.训练耗时:占用磁盘空间空间大:5000张图像产生几百G的特征文件.
- 3.处理速度慢:使用GPU,VGG16模型处理一张图像需要47s.
- 4.图像形状变化:候选区域要经过crop/warp进行固定大小,无法保证图片不变形
2.4 SPPNet
SPPNet存在两点改进的地方:
- 通过影射,减少卷积计算
- 防止变形,提出spp层
2.4.1 映射
原始图片经过CNN变成了feature map,原始图片通过选择性搜索(SS)得到了候选区域,现在需要将基于原始图片的候选区域映射到feature map中的特征向量,映射过程参考如下:
- 将候选区域影射到特征图当中,得出每个候选区域的特征向量.
- 公式:
- 左上角的点: x’ = [x/S] + 1
- 右下角的点: x’ = [x/S] - 1
- 其中S是CNN中所有strides的乘积,包含了池化,卷积的strides.
2.4.2 spatial pyramid pooling
- 对于M个候选区域,每个都要经过SPP层变换
- 把每个候选区域进行分块
- 44, 22, 1*1
- 输出:每个候选区域的特征向量都为21*256(不同网络卷积输出通道数不一定一样)
- 长度固定,特征向量有了
2.4.3 SPPNet优缺点
- 优点
SPPNet在R-CNN基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间,后面的Fast-R-CNN也是受到了SPPNet的启发. - 缺点
训练依然过慢,效率低,需要写入磁盘(因为SVM)的存在
分阶段训练网路:选取候选区域,训练CNN,训练SVM,训练bbox回归器,SPP-Net在fine-tuning截断无法使用反向传播微调SPP-Net前面的Conv层.
2.5 Fast R-CNN
学习目标:
- 了解Fast R-CNN的结构特点
- 说明Rol pooling的特点
- 了解多任务损失
- 提出一个RoI pooling,然后整合整个模型,把CNN,SSP变换层,分类器,bbox回归及格模块一起训练.
2.5.1 RoI pooling
- 目的
减少计算时间,得出固定长度的向量 - 原来SPP是:金子塔形44, 22,11 改成了单个块KM
- 问题:K和M过小,全连接层要求输入比较大
- 66,但是FC要求77,进行动态分割,长6/7,宽6/7
- 相比SPPNet采取的方式
- 设计到single scale与nulti scale两者的优缺点
- 速度与精度的权衡,选择了single scale
2.5.1 多任务损失 -Mlulti-task loss
2.5.2 R-CNN,SPPNet,Fast-R-CNN对比
2.6 Faster-R-CNN
Faster R-CNN=Fast R-CNN+RPN,其中Fast R-CNN结构不变;RPN负责生成proposals,配合最后一层的feature map,使用ROI Pooling,生成fixed length的feature vector。
2.6.1 RPN原理
我们详细讨论一下RPN的操作过程 :
图片说明,红框只是一个滑窗的操作过程,注意这里的anchor是原图像像素空间,而不是feature map上的。这样anchor是RPN的核心:
假设我们现在得到的feature map为W * H * C(13 * 13 * 256就是feature map的width=13,height=13,channel=256),我们如何产生网络需要的proposals呢?我们在feature map使用滑动窗口的操作方式(stride=1,padding=1),当前滑窗的中心在原像素空间的映射点称为anchor,以此anchor为中心,生成k(paper中default k=9, 3 scales and 3 aspect ratios)个proposals。
在此feature map滑动一个mini-network,这个network输入是3 * 3 * 256,经过3 * 3 * 256 * 256的卷积,得到1 * 1 * 256的低维向量;接下来进行分类:①Classification:经过1 * 1 * 256 * 18的卷积核,得到1 * 1 * 18的feature vector,分别代表9个proposals的是/不是Object的概率(这里有一个疑惑,为什么要生成一对?生成一个是Object的概率不就好了?也许是为了设计方便?);②Regression:经过1 * 1 * 256 * 36的卷积核,得到1 * 1 * 36的feature vector,分别代表9个proposals的(center_x,center_y,w,d)。
上述操作只是一个3 * 3的滑动窗口的操作过程,实际操作过程中,必须将13 * 13的feature map均执行一边;于是在RPN中,产生了两个损失函数:①Classification loss②Regression loss。
这样的话,通过滑动窗口和anchor机制,我们就可以找到固定比例、一定大小的proposals:①物体大小不同导致的proposal被覆盖②物体aspects ratios不同导致proposals也被覆盖
由上可知,NRP可以代替Selective Search产生proposals,而且最关键的一点是RPN 更快
ROI pooling V.S. SSP Pooling
ROI是只有一层的SSP Pooling:ROI Pooling将proposal在feature map上的对应区域分为W * H 份,每一份取Max/Avg 将其放到固定位置
SSP Pooling是将proposal分为(4 * 4 / 2 * 2 / 1 * 1份,然后进行拼接,得到fixed length=21的feature vector)
2.6.2 候选区训练
RPN中的分类是二分类,区别于物体和背景
2.6.3 Faster_R-CNN训练
2.6.4 Faster R-CNN总结
- 优点
- 提出RPN网络
- 端到端网络模型
- 缺点
- 训练参数过大
- 对于真实训练来说还是依然过于耗时
2.7 YOLO(you only lok once)算法
最大特点是快.
改进速度:YOLO
- 一个网路解决
- 输入448*448
- 输出7730
- 77=49个像素值,理解成49个单元格,492=98个bbox框
- 30=两个bbox(4+1+4+1) + 20(单元格的代表概率)
- 帅选一个bbox做为训练
- 通过confidence进行筛选
- confidence由网络输出,(进行标记) 所以如何判断一个grid cell中是否由object呢?如果一个object的ground true的中心坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就有该grid cell负责.
- 每一个单元格:输出一个confidence的bbox位置,一个概率大的类别.
2.7.1 grid cell
2.7.2 训练
三部分损失:bbox+confidence+classfication
2.7.3 YOLO总结
- 优点
- 速度快
- 缺点
- 准确率会打折扣
- YOLO对相互靠近很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体体验检测效果不好,这是因为一个网格中只预测了两个框.
2.8 SSD(Single Shot MultiBox Detector)
学习目标:
- 知道SSD结构
- 说明Detector & classifler的作用
- 说明SSD的优点
2.8.1简介
SSD算法源于2016年发表的算法论文,论文网址
SSD的特点在于:
- SSD结合了YOLO中的回归思想和热Faster-RCNN中的Anchor机制,使用全图各个位置的多尺度区域进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster-RCNN一样精准.
- SSD的核心是在不同尺度的特征图上采用卷积核来预测一系列Default Bounding Boxes的类别,坐标偏移.
2.8.2 结构
以VGG-16为基础,使用VGG的前五个卷积,后面增加吃哦猫嗯CONV6开始的5个卷积结构,输出图片要求300*300.
2.8.3 流程
SSD中引入了Default Box,实际上与Faster R-CNN中的anchor box机制类似,就是预设一些目标的预选框,不同的是在不同尺度feature map所有特征点上是使用不同的prior boxes.
2.8.4 Detector $ classifier
- 1.default boxes:默认候选框
- 由公式生成
- 2.localization:4个位置偏移
- 3.confidence:21个类别置信度(要区分出背景)
2.8.5 default boxes
default boxes类似于RPN当中的滑动窗口生成的候选框,SSD也是对特征图中的每一个象素生成若干个候选框.
只不过SSD生成候选框有特定的公式:
2.8.6 localization与confidence
这两者意义如下,主要用来过滤,训练:
问题: SSD中多个Detevtor & classifier有什么作用?
SSD核心是在不同尺度的特征图上来进行Detector & classifier容易使得SSD观察到更小的物体.
2.8.7训练与测试流程
- 输入–>输出–>结果与ground truth标记样本回归损失计算–>反向传播,更新权值.
利用anchor与对应的ground truth进行样本标记,正负样本,每次并不训练8732张计算好的defalt boxes,先进行置信度筛选,并且训练指定的正样本和负样本,如下规则: - 正样本
- 1.与GT重合最高的boxes,其输出对应label设为对应物体
- 2.物体GT与anchor IoU满足大于0.5
- 负样本
- 其他的样本标记为负样本
在训练时,default boxes按照正负样本控制positive:negative = 1:3
- 其他的样本标记为负样本
- 损失:
- 网络输出的predict box与ground truth回归变换之间的损失计算,置信度采用Softmax Loss(Faster RCNN是log loss),位置回归则是采用Smooth L1loss(与Faster R-CNN一样)
- test流程
- 输入–>输出–>nms–>输出
2.8.8 接口介绍
2.8.8.1 模型搭建处理
2.8.8.2 定义网络损失
- ssd_net_losses:
- 网络的输出预测结果与Ground Truth之间的损失计算