步骤一:训练(或者下载)一个分类模型(比如AlexNet)

CNN训练流程图_CNN训练流程图

 

步骤二:对该模型做fine-tuning

将分类数从1000改为20,加上背景共21类;变成21类的分类任务,进行端对端训练。

CNN训练流程图_搜索_02

步骤三:特征提取 

 提取图像的所有候选框(选择性搜索)

对于每一个区域:缩放区域大小以适合CNN的输入,做一次前向运算(第二步已经完成分类模型的训练),将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘

CNN训练流程图_特征提取_03

步骤四:训练一个SVM分类器(二分类)

判断这个候选框里物体的类别,每个类别对应一个SVM二分类器,判断是不是属于这个类别,是就是positive,反之negative
比如下图,就是狗分类的SVM 

CNN训练流程图_CNN训练流程图_04

步骤五:使用回归器精细修正候选框位置

对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。 

CNN训练流程图_特征提取_05

类似于下图:

CNN训练流程图_CNN训练流程图_06

 

注意:使用选择行搜索,确定候选框 ;然后把候选框输入到CNN网络,提取候选框的特征;最后把特征输入到SVM中,进行分类。

 

最后总结一下各大算法的步骤:
RCNN (选框,提特征,分类,定位)

  1. 在图像中确定约1000-2000个候选框 (使用选择性搜索)
  2. 每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取 
  3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
  4. 对于属于某一特征的候选框,用回归器进一步调整其位置

SPPnet

  1. SPPnet算法过程和R-CNN一样,只是在提特征方式上做了改进:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature map,然后对各个候选框对应的特征采用空间金字塔池化SPP,提取出固定长度的特征向量。
  2. 回顾R-CNN的特征提取过程:对于每一个候选框,缩放候选框大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘

Fast RCNN

  1. 输入训练图像;
  2. 利用selective search 算法在图像中从上到下提取2000个左右的候选框(Region Proposal);
  3. 将整张图片输入CNN,进行特征提取,得到feature map;
  4. 把建议窗口映射到CNN的最后一层卷积feature map上;前四步和SPP-net一样。
  5. 通过RoI pooling层(单层sppnet的网络层,即只有一种网格)使每个候选框对应的特征图生成固定尺寸的feature map。而SPPnet采用的空间金字塔池化,生成的是固定尺寸的feature vector
  6. 利用Softmax Loss(分类器) 和Smooth L1 Loss(边框回归器),对分类概率和边框回归(Bounding box regression)联合训练,去掉了SVM。SPPnet是分步训练的。

Faster RCNN

  1. 对整张图片输进CNN,得到feature map;
  2. 卷积特征输入到RPN,提取候选框(主要贡献);
  3. 对候选框中提取出的特征,对其进行分类
  4. 对于属于某一特征的候选框,用回归器进一步调整其位置

      RPN简介:
     • 在feature map上滑动窗口
     • 建一个神经网络用于物体分类+框位置的回归
     • 滑动窗口的位置提供了物体的大体位置信息
     • 框的回归提供了框更精确的位置