参考:https://www.cnblogs.com/skyfsm/p/6806246.html
https://www.cnblogs.com/dudumiaomiao/p/6560841.html
细节:https://www.cnblogs.com/zf-blog/p/6740736.html
步骤一:训练(或者下载)一个分类模型(比如AlexNet)
步骤二:对该模型做fine-tuning
将分类数从1000改为20,加上背景共21类;变成21类的分类任务,进行端对端训练。
步骤三:特征提取
提取图像的所有候选框(选择性搜索)
对于每一个区域:缩放区域大小以适合CNN的输入,做一次前向运算(第二步已经完成分类模型的训练),将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
步骤四:训练一个SVM分类器(二分类)
判断这个候选框里物体的类别,每个类别对应一个SVM二分类器,判断是不是属于这个类别,是就是positive,反之negative
比如下图,就是狗分类的SVM
步骤五:使用回归器精细修正候选框位置
对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。
类似于下图:
注意:使用选择行搜索,确定候选框 ;然后把候选框输入到CNN网络,提取候选框的特征;最后把特征输入到SVM中,进行分类。
最后总结一下各大算法的步骤:
RCNN (选框,提特征,分类,定位)
- 在图像中确定约1000-2000个候选框 (使用选择性搜索)
- 每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
- 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
- 对于属于某一特征的候选框,用回归器进一步调整其位置
SPPnet (链接)
- SPPnet算法过程和R-CNN一样,只是在提特征方式上做了改进:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature map,然后对各个候选框对应的特征采用空间金字塔池化SPP,提取出固定长度的特征向量。
- 回顾R-CNN的特征提取过程:对于每一个候选框,缩放候选框大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
Fast RCNN
- 输入训练图像;
- 利用selective search 算法在图像中从上到下提取2000个左右的候选框(Region Proposal);
- 将整张图片输入CNN,进行特征提取,得到feature map;
- 把建议窗口映射到CNN的最后一层卷积feature map上;前四步和SPP-net一样。
- 通过RoI pooling层(单层sppnet的网络层,即只有一种网格)使每个候选框对应的特征图生成固定尺寸的feature map。而SPPnet采用的空间金字塔池化,生成的是固定尺寸的feature vector;
- 利用Softmax Loss(分类器) 和Smooth L1 Loss(边框回归器),对分类概率和边框回归(Bounding box regression)联合训练,去掉了SVM。SPPnet是分步训练的。
Faster RCNN
- 对整张图片输进CNN,得到feature map;
- 卷积特征输入到RPN,提取候选框(主要贡献);
- 对候选框中提取出的特征,对其进行分类;
- 对于属于某一特征的候选框,用回归器进一步调整其位置。
RPN简介:
• 在feature map上滑动窗口
• 建一个神经网络用于物体分类+框位置的回归
• 滑动窗口的位置提供了物体的大体位置信息
• 框的回归提供了框更精确的位置