作为时代的分水岭,R-CNN利用了CNN提取特征的强大之处,同时利用了传统方法和机器学习的方法,最终达到了不错的效果。R-CNN大致分为以下四个步骤:
- 候选区域生成;
- CNN特征提取;
- SVM分类;
- 回归器特征box位置。
流程图如下图所示:
一、候选区域生成
目标检测的核心就是分类classification+定位location,定位就是用矩形框选定目标物体。
候选区域生成其实就是一个粗定位:得到一些大概率是目标的区域。
具体的方法有滑窗,分割等。
R-CNN使用的是Selective Search。
在特征上,Selective Search利用了纹理,颜色等信息;在多样性上,Selective Search尝试了多种起始点,多种相似度策略,多种色彩空间;在流程上,Selective Search使用Hierarchical Grouping Algorithm,这是一种自下而上的思想,不断地合并细小的区域,得到整幅图像时停止。最终Selective Search会得到约2000张候选区域。
与sliding windows相比,得到的regions数量少,且具有一定的语义。
二、CNN特征提取
以往的特征提取方法都是手动设计,如方向梯度直方图
(Histogram of Oriented Gradient, HOG),SIFT
等,而CNN
强大之处就在于可以提取到深层次的特征。
可以直接使用ILSVRC训练好的模型,然后再在PASCAL VOC上进行迁移学习。这一阶段是依靠监督学习分类来学习特征。
Alexnet精度是58.5%,VGG16精度是66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。RCNN使用的是AlexNet的finetuning版本。
(Alexnet是CNN五大经典模型(Lenet1986,Alexnet2012,Googlenet2014,VGG2014,DeepResidual learning2015)之一,也是最经典的算法,赢得了当年的ImageNet比赛冠军,使CNN成为图像分类中的核心算法模型。
相关论文出自NIPS2012,作者是大神Alex Krizhevsky,属于多伦多大学Hinton组。《ImageNet Classification with Deep Convolutional Neural Networks》)
在迁移学习中有三点需要注意:
1.预训练分类模型是1000类,VOC中是20类(加上背景是21类),所以需要调整全连接的大小;
2.输入是第一步中得到的候选区域,而因为全连接的存在,需要将输入归一化到尺寸相同;
3.VOC的类别标签是针对定位框的,只有当候选区域的框位置与标签的定位重合到一定程度时才认为是正样本。
关于第二点的归一化方法有几种可选的方法,分别是直接各向异性缩放warp和crop。第二种又分先扩充后裁剪和先裁剪后填充。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。
关于第三点,如何量化重合度需要引入IoU的概念,其含义是两个区域的交集和并集之比。大于0.5则认为该region的label与GT一致。
三、SVM分类器
之前使用的CNN表面是在分类,但真正目的其实只是提取特征,提取特征之后,每个候选框可以得到一个4096维的特征向量,使用得到的CNN特征再输入线性SVM中训练分类器。
为什么要“画蛇添足”般地使用SVM呢?
因为CNN容易过拟合,所以期望样本数目多一些,所以在判断正样本的时候条件比较松,IoU>0.5就认为是正样本。而SVM本身是结构风险最小,以SVM为分类器时改变了正负样本的判定条件:候选框完全包含GoundTruth的定位框才是正样本,当IoU<0.3时是负样本。
SVM支持向量机其实是可以支持多分类的,即SVMs分类器。但是论文不是对21个类(别漏了background类哦)使用一个SVM,而是使用了One-Versu-All的方法,对每个类别都使用个SVM(这里只需要20个SVM,想想为什么?)。
方法很简单,对于每个类别来说,一个Region如果不是该类别,那就是背景。由于负样本很多,使用hard negative mining方法。每个SVM判断候选框是否属于这一类。对于2000个候选框,属于第i类的得分进行降序排列,可以使用NMS去除重叠的候选框。
四、回归器