【CS231n笔记】08 Spatial Localization and Detection

1.分类+定位
2.物体检测

计算机视觉任务一般可分为下列四类:
— 分类
— 分类+定位
— 检测
— 实例分割
【CS231n笔记】08 Spatial Localization and Detection

1.分类+定位
分类:C个类别
输入:图像
输出:类别标签
评价指标:准确率
【CS231n笔记】08 Spatial Localization and Detection
定位:
输入:图像
输出:边框(x,y,w,h)
评价指标:IoU(Intersection over Union)
【CS231n笔记】08 Spatial Localization and Detection
分类+定位即同时完成上述两个任务

ImageNet数据集的分类+定位(CLS-LOC)任务:
共1000类(同分类任务一样)
每张图像中有一类物体,并且最少有一个位置边框
每类约有800训练图像
算法每次生成5个预测,包括类别标签及位置边框,即top-5预测
预测正确的条件是,在5个预测中分类正确且位置边框>=0.5 IoU
【CS231n笔记】08 Spatial Localization and Detection

思路#1:将定位视为回归问题
图像经过神经网络后输出位置边框坐标,将其与正确坐标的L2距离作为损失函数。
【CS231n笔记】08 Spatial Localization and Detection
基本流程如下:
Step1:训练一个分类模型(如AlexNet, VGGNet, GoogLeNet等)
【CS231n笔记】08 Spatial Localization and Detection
Step2:附加一个新的全连接层“regression head”到网络上
【CS231n笔记】08 Spatial Localization and Detection
Step3:利用SGD和L2损失单独训练“regression head”
【CS231n笔记】08 Spatial Localization and Detection
Step4:在测试时同时使用两个全连接层完成两个任务
【CS231n笔记】08 Spatial Localization and Detection

分类后定位 vs. 未分类定位
【CS231n笔记】08 Spatial Localization and Detection

在何处附加“regression head”?
【CS231n笔记】08 Spatial Localization and Detection

另:定位多个目标,即在每张图像
【CS231n笔记】08 Spatial Localization and Detection

另:人体姿态估计(Human Pose Estimation)
【CS231n笔记】08 Spatial Localization and Detection

思路#2 滑动窗口(Sliding Window)
— 高分辨率、多目标定位,应用分类+回归网络
— 将全连接层替换为卷积层以提高运算效率
— 在所有尺寸中结合分类+回归的预测作为最终预测

Overfeat
ILSVRC2013定位任务冠军
【CS231n笔记】08 Spatial Localization and Detection
使用滑动窗口在整个图像滑动,并进行评分
【CS231n笔记】08 Spatial Localization and Detection

在实际应用中会使用很多不同位置不同尺寸的滑动窗口
【CS231n笔记】08 Spatial Localization and Detection

将全连接层替换为卷积层
【CS231n笔记】08 Spatial Localization and Detection

在测试阶段只增加扩大区域运算量
【CS231n笔记】08 Spatial Localization and Detection

ImageNet分类+定位任务历年冠军
【CS231n笔记】08 Spatial Localization and Detection

2.物体检测
— 物体检测任务中目标数量不定,使用回归的方法已不再适合
— 将检测看作分类,需要测试多个位置和尺寸,如果分类器够快,挨个试就好:)

传统方法:HoG、DPM
【CS231n笔记】08 Spatial Localization and Detection

将检测视作分类并且使用深度学习方法时,需要在不同位置和尺寸上使用对计算要求极高的卷积神经网络,那么只能处理可能位置集合中极小的子类。

候选区域(Region Proposals)
— 在图像中寻找可能包含物体的“blobby”区域
— 未知类别(class-agnostic)物体检测器
— 寻找块状区域
【CS231n笔记】08 Spatial Localization and Detection

Selective Search算法
【CS231n笔记】08 Spatial Localization and Detection

提取候选区域方法汇总
【CS231n笔记】08 Spatial Localization and Detection
相比较最优的是EdgeBoxes

R-CNN
【CS231n笔记】08 Spatial Localization and Detection
候选区域提取(Selective Search)+特征提取(CNN)+分类(SVM)&定位(Bounding-box Regression)

训练流程如下:
Step1:利用ImageNet数据集训练一个分类模型
【CS231n笔记】08 Spatial Localization and Detection
Step2:微调(fine-tune)模型用于检测
— 不同于ImageNet的1000类,这里只关心20类物体,背景也算一类
— 去掉最后一个全连接层,根据实际类别数量设置全连接层神经元数量,重新初始化
— 从检测图像中选取正/负样本区域对模型进行训练
【CS231n笔记】08 Spatial Localization and Detection
Step3:提取特征
— 从所有图像中提取候选区域
— 对每个区域:缩放到和CNN模型输入尺寸相同大小,进行前向传播,将pool5层特征保存下来
— 需要一个大容量硬盘,因为从PASCAL数据集中提取的特征大约200GB
【CS231n笔记】08 Spatial Localization and Detection
Step4:针对每个类别训练一个二分类SVM来对区域特征进行分类
【CS231n笔记】08 Spatial Localization and Detection
【CS231n笔记】08 Spatial Localization and Detection
Step5:bbox regression
针对每一类训练一个线性回归模型,将区域特征映射到边框坐标,对候选框进行调整
【CS231n笔记】08 Spatial Localization and Detection

物体检测相关数据集
【CS231n笔记】08 Spatial Localization and Detection

物体检测任务的性能评估
使用一种称为mAP(mean average precision)的度量标准
对每一类计算相应的精度均值,然后计算在所有类别上的精度均值
当检测区域与真实值区域的IoU大于某阈值(一般取0.5([email protected]))时检测结果判定为正确
汇总所有测试图像的检测结果,画出每类的准确率/召回率曲线,精度均值就是曲线下方的区域面积
mAP的取值范围为0~100,越高表示性能越好

R-CNN结果
【CS231n笔记】08 Spatial Localization and Detection
从图中可以看出,R-CNN相比之前非深度学习方法性能有了很大提升,使用bounding-box regression可以提高一些性能,使用更深层的网络架构可以提高一些性能。

R-CNN缺陷
1.测试阶段运行太慢,因为需要对所有候选区域图像进行CNN前向传播
2.SVM和回归模型都是事后处理,CNN特征无法根据SVM和回归模型的相应进行更新
3.训练流程分多个阶段,过于复杂

Fast R-CNN
【CS231n笔记】08 Spatial Localization and Detection

针对R-CNN缺陷#1,同一张图像不同候选区域共享卷积层的计算结果
【CS231n笔记】08 Spatial Localization and Detection

针对R-CNN缺陷#2#3,对整个系统进行端到端训练
【CS231n笔记】08 Spatial Localization and Detection

Fast R-CNN:Region of Interest Pooling
【CS231n笔记】08 Spatial Localization and Detection

Faster R-CNN结果(VGG-16模型,Pascal VOC 2007数据集)
【CS231n笔记】08 Spatial Localization and Detection
但是,测试阶段的时间并没有考虑候选区域提取的耗时,加上这部分耗时之后提速幅度便小很多
【CS231n笔记】08 Spatial Localization and Detection
解决办法,使用CNN进行候选区域提取,这就是Faster R-CNN

Faster R-CNN
在最后的卷积层后面插入一个候选区域网络RPN(Region Proposal Network),用于进行候选区域提取,提取出候选区域的后续处理同Fast R-CNN一样。
【CS231n笔记】08 Spatial Localization and Detection

Faster R-CNN: Region Proposal Network
— 在特征图中使用滑动窗口
— 建立一个小的网络:(1)区分是不是目标物体(2)bbox regression进行定位
— 滑动窗口的位置提供了关于图像的定位信息
— box regression提供了关于该窗口的更精准的定位信息
【CS231n笔记】08 Spatial Localization and Detection
— 在每个位置使用N个锚点框(anchor box)
— 锚点框具有平移不变性,在每个位置使用相同的一组锚点框
— 回归算法计算锚点框与真正位置的偏移量
— 分类器计算出每个锚点框(已调整)区域是否属于某物体类型的概率
【CS231n笔记】08 Spatial Localization and Detection

Faster R-CNN: Training
论文中描述的是交替优化RPN及后续处理,比较复杂
实际应用是结合在一起进行训练,一个网络,四个损失
— RPN分类(锚点框中是否有物体)
— RPN回归(锚点框->候选框)
— Fast R-CNN分类(所属类别)
— Fast R-CNN回归(候选框->定位框)
【CS231n笔记】08 Spatial Localization and Detection

Faster R-CNN结果
【CS231n笔记】08 Spatial Localization and Detection

当前最先进的物体检测算法:ResNet 101 + Faster R-CNN + some extras
【CS231n笔记】08 Spatial Localization and Detection

ImageNet Detection 2013-2015
【CS231n笔记】08 Spatial Localization and Detection

YOLO
You Only Look Once Detection as Regression
将图像划分为S*S个网格
对于每个网格进行预测:
bbox:4个坐标+可信度
类别评分:C类
回归算法在图像*有7 x 7 x (5 * B + C)个预测框坐标
直接使用CNN进行预测
【CS231n笔记】08 Spatial Localization and Detection
比Faster R-CNN更快,但效果略差
【CS231n笔记】08 Spatial Localization and Detection

源码链接:
R-CNN
(Cafffe + MATLAB): https://github.com/rbgirshick/rcnn
Fast R-CNN
(Caffe + MATLAB): https://github.com/rbgirshick/fast-rcnn
Faster R-CNN
(Caffe + MATLAB): https://github.com/ShaoqingRen/faster_rcnn
(Caffe + Python): https://github.com/rbgirshick/py-faster-rcnn
YOLO
http://pjreddie.com/darknet/yolo/

概述
定位(Localization)
— 寻找固定数量物体类型
— 使用L2回归算法将CNN特征映射为边框坐标
— 比检测更简单
— Overfeat:回归+高效滑动窗+全连接层->卷积层
— 更深的网络结构性能更好
物体检测(Object Detection)
— 在图像中寻找不定数量的物体
— 在使用CNN之前,一般使用密集多尺寸滑动窗(如HoG,DPM)
— 在后续区域提取时避免使用密集滑动窗
— R-CNN:Selective Search + CNN classification / regression
— Fast R-CNN:交换卷积层提取特征和提取候选区域的顺序
— Faster R-CNN:在CNN网络中进行候选区域提取
— 更深的网络结构性能更好