目标检测问题定义
目标检测是在图片中对可变数量的目标进行查找和父类
- 目标种类问题
- 目标尺度问题
- 外在环境干扰问题
目标检测问题方法:
传统目标检测方法到深度学习目标检测方法的变迁
目标检测问题方法:
深度学习的目标检测方法:
目标检测的的任务
- 输入:图片
- 输出:物体类别,位置坐标
- xmin,ymin,xmax,ymax:物体位置的左上角、右下角坐标
目标定位的简单实现思路:
- 添加一段全连接层输出4个位置,做损失计算
- 早期的目标检测:
添加两个全连接层:FC1,FC2
- FC1:作为类别输出
- FC2:作为中国物体位置数值的输出
两种Bounding box名称
- Ground-truth bounding box: GT图片真实目标位置(标记结果)
- Predict bounding box:预测的框位置
- 掌握分类
- 父类与定位:图片中只有一个物体需要检测
- 目标检测:图片由多个物体需要检测
R-CNN
- 对多个目标的情况,就不能以固定个数输出物体的位置
目标检测-Overfeat模型
滑动窗口
- 首先定义若干个大小窗口,k个
- k中每个窗口都要滑动图片,每个串钩滑动M次
- K*M
Overfeet模型总结
- 暴力破解方法
- 计算消耗大
目标检测-R-CNN模型
- CVPR 2014
- 候选区方法(region proposal method):提供了额外物体检测的一个共重要思路
-
步骤:
-
1、对于一张图片,找出默认2000个候选区
-
2、2000个候选区的大小变换,输入AlexNet当中,得到特征向量
-
【2000,4096】
-
3、经过20个类别的SVM分类器,对于2000个候选区域做判断,得到【2000,20】得分矩阵
-
4、2000个候选区域做NMS,取出不好的,重叠度搞的一些候选区域,得到剩下分数高,结果好的框
-
修正候选框,bbox的回归调微
候选区域(region of interest(ROI))得出
- SelectiveSearch在一张图片上提取出来约2000个候选区
- 由于长宽不定,不能直接输入AlexNet
- 2000个候选区做大小变换
特征向量训练分类SVM
- R-CNN选用SVM进行二分类。将入检测20个类别那么会提供20个不同类别的SVM分类器了,么个分类都会对2000个候选区域的特征向量分别判断一次,这样得出【2000,20】的得分矩阵
非最大抑制(NMS)
-
目的
-
筛选候选区域,目标是一个物体只保留一个最优的框,来抑制那些冗余的候选框
-
RCNN预测2000个候选框,得到三个,比如有3个ground truth 比较准确的候选框
迭代过程:
-
1、对于所有的2000个候选区域得分进行概率筛选,0.5
-
2000—》5个
-
2、剩余 的候选框
-
对于每个候选框找到自己对应的GT
-
3、第一轮:杜宇右边车辆,假设B得分最高的,与B的IoU>0.5删除。现在与B计算IoU,DE结果>0.5,删DE,B作为一个预测结果
第二轮:对于左变车辆,AC中,A的得分最高,与A计算IoU,C的结果>0.5,删
除C,A作为一个结果
- 最终结果:理想状态,每个Ground truth 都有一个候选框预测
候选框修正
-
为了让候选框标注更加准确率,去修正原来的位置
-
A是候选框,G是目标GT框
-
让A与G做回归训练,得到四个参数
-
RCNN输出:一张图片预测一个X候选框,x x w =y_loacte
-
y_locate:=是真正算法输出的位置
IoU交并比
- 取值是在【0,1】之间。
- 位置的考量
平均精确率(mean average precison )map
改进-SPPNet
-
SPPNet主要存在两点改进地方,提出了SPP层
-
减少卷积计算
- 1、图片输入到网格先得到一个feture map
- 2、原图中通过SS得到的候选区域直接映射feature map中对应位置
- 3、映射过来的特征,经过SPP层(空间金字塔变换结构),S输出固定大小的特征向量
映射
经SS选出来的候选区后,找到候选区的特征值的映射
-
论文当中S=16=2x2x2x2
-
原图:特征图中xmin
,ymin
=[xmin/16]+1,ymin/16+1 -
特征图:xmax
,ymax
=[xmax/16]-1,ymax/16-1 -
3、映射过来的(假如还是2000个)候选区域的特征,经过SPP层(空间金字塔变换层),S输出固定大小的特征向量
Spatial pyramid pooling
- 候选区域的特征图换成固定大小的特征向量
- spp layer 会将每一个候选区域分成1x1 2x2 4x4 三张图
- (16+4+1)x256=21x256=5376
- Spatial bins (空间盒个数):1+4+16=21
、
Fast R-CNN
改进:
-
提出一个Roi pooling
-
分类是用softmax计算:k个类别加上“背景”类
-
与SPPNet一样的地方
-
首先将整个图片输入到一个基础卷积网络,得到整张图的feature map
-
将选择性搜索算法的结果region proposal(RoI)映射到feature map 中
RoI pooling
- 为了减小计算时间并且得出固定长度的向量
- 使用一种4x4的盒子
- 因此Fast-R-CNN要比SPPNet快很多的因为这里的原因
特点:
-
训练会比较统一:废除了svm以及sppnet
-
roi pooling layer + soft max
-
多任务损失 Multi-task loss
-
平均绝对误差(MAE)损失即L1损失+ 交叉熵损失
-
缺点:
-
使用Selective Search提取Region proposals 没有实现真正意义上的端到端,操作也十分耗时
Faster-R-CNN
-
候选区域筛选融合到网络当中
-
四个基本步骤(候选区域生成,特征提取,分类,位置精确)终于被统一到一个深度网络框架
-
区域生成网络(RPN)+Fast R-CNN
-
RPN替代了SS选择性搜索算法
-
RPN网络通过生成region proposals
-
通过softmax判断anchors属于foreground或者background
-
bounding box regression 修正获得精确proposals
-
得到默认300个候选区域给roi pooling继续后面fast rcnn的步骤
RPN的原理
-
用nxn(默认3x3=9)的大小窗口去扫描特征图得到k个候选框窗口
-
每个特征图中像素对应的9个窗口大小?
-
三种尺度【128,256,512】,三种长宽比【1:1,1:,2:1】
-
3x3=9不同大小的候选宽
-
窗口输出【N,256】-------》分类:判断是否背景
-
回归位置:N个候选框与自己对应目标位置GT做回归,修正位置
-
得到更好的候选框提供给RoI pooling使用
Faster RCNN训练
-
RPN训练
-
分类:二分类,softmax ,logisticregression
-
候选框的调整
-
Fast RCNN部分的训练
-
预测类别训练:softmax
-
还有预测位置的训练:均方误差
YOLO(you only look once)
一个网格搞定一切,GoogleNet +4个卷积+2个全连接层
流程:
-
单元格(grid cell)
-
7 x 7=49个像素值,理解层49个单元格
-
1、每个单元格负责预测一个物体类别,并且直接预测物体的概率
-
2、每个单元格:两个(默认)bbox位置,两个置信度confidence
-
一个bbox:xmin,ymin,xmax,ymax,confidence
-
两个bbox:4+1+4+1=10个值
-
30:10个,20个(20代表20类的预测结果)、
-
网格筛选
-
一个网格会预测两个Bbox,在训练时我们只有一个Bbox专门负责预测概率(一个Objet 一个Bbox)
-
20个类别概率代表中国网络当中的一个bbox
-
一个confidence score
-
如果grid cell 里面没有object ,confidence为0
-
如果有,测confidence score等于预测的box和ground truth的IoU乘积
-
两个bbox 的4个值都与GT进行IoU计算得到两个IoU值
-
YOLO框,概率值都直接由网络输出7x7x30(默认给30个值赋了具体定义)
训练
- 预测框对应的目标值标记
总结:
-
优点:速度快
-
缺点:
-
准确率会打折扣
-
YOLO对相互靠的很近的物体(挨在一起中点都落在同一格子的情况),还又很小的群体检测想过不好,这是因为一个网格中只预测了两个值
SSD(Single shot MultiBox Detector)
SSD的特点在于:
- SSD结合了YOLO里面的回归思想和Faster-RCNN的Anchor机制,使用全图哥哥位置的多尺度区域进行回归,即保持了YOLO速度快的特点,也保证了窗口预测的跟Faster R-CNN一样精确
- SSD的核心是在不同程度的特征图上常用卷积来预测一些列Default Bounding Boxes的类别和坐标偏移
结构:
- SSD结合了YOLO中的回归思想和Faster-RCNN红的Anchor机制
- 不同尺度的特征特征图上采用卷积来预测一些列Default Bounding Boxes的类别、坐标偏移
- 不同尺度feature map所有特征点上使用PriorBx层(Detector&classifier)
Detector & Classifier
-
1、得到的default boxes
-
PriorBox层:生成default boxes,默认候选框
-
候选框生成结果之后
-
做微调,利用3个variabce做回归调整候选框
-
1、Conv3x3:生成localization,4个位置偏移
-
2、Conv3x3:confidence,21个类别的置信度(要区分出背景)
训练过程:
1、输入------》输出-----》结果为ground truth样本回归损失计算------》反向传播,更新权值
- 1、样本标记:8732个候选框default hoxes ,得到正负样本
- 正:负=1:3
- SoftMax loss (Faster R-CNN是log loss),位置回归则是采用smooth L1 loss(与FasterR-CNN一样
test流程
- 输入-》输出-》nms-》输出## 目标
这里只是理了下各种目标检测的模型理论,没有涉及到代码,大多是基于Python的神经网络框架来建立。网上有很多已经基于理论完善了的神经网络结构,进行微调就可以训练出来可用的模型。