R-CNN(Regions with CNN features)是一种基于区域的图像检测方法。
它的主要步骤是:
- 从输入图像中提议若干区域(Region Proposals),通常使用Selective Search方法。
- 对每个提议区域使用CNN提取特征,获得区域特征向量。
- 对每个区域特征向量进行SVM分类以判断是否包含物体。
- 对物体区域执行回归以精确定位物体框。
- 对重叠的检测框执行非极大抑制(NMS)过滤。
主要包含区域提议(Selective Search)、CNN特征提取(AlexNet)、SVM分类器和回归器。
R-CNN的关键代码如下:
python
import torch
from selective_search import selective_search
# 区域提议
proposals = selective_search(im, mode='fast')
# 提取每个区域的特征
features = extract_features(im, CNN)
# 为每个区域分类和回归
bboxes = np.empty((len(proposals), 4), dtype=np.int32)
probas = np.empty((len(proposals), 2), dtype=np.float32)
for i, proposal in enumerate(proposals):
x1, y1, x2, y2 = proposal['rect']
feat = features[y1:y2, x1:x2, :]
probas[i, 1] = svm_model.predict_proba(feat)[:, 1]
reg_model.predict(feat)
bboxes[i, :] = [x1, y1, x2, y2]
# 非极大抑制
keep = nms(bboxes, probas, 0.7)
final_bboxes = bboxes[keep]
final_probas = probas[keep, 1]
在上述代码中:
- selective_search生成区域提议。
- extract_features提取每个区域的CNN特征。
- SVM模型判断区域是否包含物体,数字1表示包含物体。
- 回归模型精炼区域框。
- NMS过滤重叠框。
R-CNN将深度学习引入到物体检测任务,取得了较大提高。但其区域提议和特征提取过程较为耗时,无法满足实时性要求。后续出现的Fast R-CNN和Faster R-CNN在此基础上的改进,实现了较高的速度和精度。