什么是R-CNN算法?

R-CNN(Regions with CNN features)是一种基于区域的图像检测方法。

它的主要步骤是:

  1. 从输入图像中提议若干区域(Region Proposals),通常使用Selective Search方法。
  2. 对每个提议区域使用CNN提取特征,获得区域特征向量。
  3. 对每个区域特征向量进行SVM分类以判断是否包含物体。
  4. 对物体区域执行回归以精确定位物体框。
  5. 对重叠的检测框执行非极大抑制(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在此基础上的改进,实现了较高的速度和精度。