[pytorch] RCNN物体检测的简化实现(d2l-香蕉数据集)

论文地址
RCNN物体检测的主要步骤如下:
训练:

  1. 监督预训练:利用ILSVRC 2012进行预训练,lr=0.01
  2. 在VOC 2012 train上微调:将CNN最后的1000分类初始化为21分类(20个VOC 类别+背景),使用VOC通过selective search的warped region proposals进行微调。-----所有的region proposals,如果和ground-truth锚框的IoU≥0.5,则视为该类别的positive,其它视为negative。使用SGD,lr=0.001,在每次SGD的Iteration,在所有类别上均匀采样32个positive框以及96个背景框,组成128的mini-batch
  3. 类别分类:注意没有直接使用微调后的CNN进行分类,而是转换为21个二分类SVM问题,在每个二分类中,利用CNN倒数第二层提取出的4096维特征向量以及对应的labels训练,labels的计算方式是(如果region与ground-truth锚框的IoU≥0.3,视为positive,否则为negative) ,在VOC 2012 trainval上优化SVMs
  4. Bounding box回归:最后一个池化层pool输出的特征去训练一个线性回归模型,以预测新的检测框

测试:

  1. selective search产生2000个region proposals(使用selective search’s “fast mode”)
  2. 将这2000个region proposals转化大小为227X227(在转化之前,bounding box需要进行膨胀,各边16像素)
  3. 输入到训练的Alexnet得到4096维的特征向量
  4. 对2000个特征向量使用训练的21个SVM测试
  5. 使用贪婪NMS,如果一个区域与一个更高分数的区域IoU超过阈值,则去除

VOC 2012 数据集较大,类别多,总体的实践步骤较为复杂,这里编写简化版本的RCNN对香蕉数据集进行物体检测。香蕉数据集来自于沐神《动手学深度学习》,数据集中包括1000张训练集与100张验证集,需要检测的物体只有香蕉这一个类别,如下所示。
香蕉数据集
总体实现步骤为:
训练:

  1. 计算proposal regions:(10mins)对每张训练图片利用selective search生成proposal regions,这里直接使用opencv-contrib-python库里的函数,如果没有该库,注意在pip install opencv-contrib-python之前,应先pip uninstall opencv-python。
def cal_pro_region(img_path):
   '''计算每张图片的proposal region
   Args:
       img_path: 图片所在路径
   Returns:
       np.array: proposal region的坐标, 大小为num*4, 4列分别[xmin, ymin, xmax, ymax]
   '''
   ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()
   ss.setBaseImage(cv2.imread(img_path))
   ss.switchToSelectiveSearchFast()
   rects = ss.process()
   rects[:, 2] += rects[:, 0]
   rects[:, 3] += rects[:, 1] 
   return rects
  1. Alexnet微调:对训练集与验证集的每张图片,计算该图片所有候选区域的IoU值,将IoU≥0.5的区域视为positive,0.1<IoU≤0.5的区域为negative,保存候选区域与标签,生成用于Alexnet微调的新数据集。这里训练大概也需要10分钟,最后保存相应网络参数。
    单检测框的IoU计算方式可如下图所示:
    IoU计算

预训练的Alexnet是通过pytorch的torchvision.models.alexnet(pretrained=true)获得的。
之后利用上述新数据集来微调Alexnet,最终测试精度为96%左右。网络的预测结果大致如下:
微调的Alexnet预测性能

  • Bounding box回归:利用微调的Alexnet的最后一个池化层输出的特征,训练一个线性回归模型,以预测当前proposal region的坐标与真实坐标之间的偏移。训练时间同样10分钟左右,保存网络训练参数。
    (注:不再进行svm的训练,直接利用Alexnet的分类结果)

测试:

  • 对测试图片,利用selective search算法生成候选区域-proposal regions,将每个proposal region图像输入训练的Alexnet二分类网络中得到预测标签(即banana或者background)
  • 将预测标签为banana的区域,所对应的Alexnet的最后一个池化层输出的特征,输入训练的线性回归模型,得到预测的检测框角点坐标偏移值。我们将预测的偏移值L1范数作为评价标准,选取最小值对应的区域坐标(加上偏移值)作为最终检测框。
    最终的检测结果如下图所示:
    检测结果
    总结:
    该实现对原始版本的RCNN进行了简化实现,主要体现在:
  • 所使用的数据集较为简单,只有香蕉这一个类别
  • 直接利用Alexnet的分类结果,而不再训练多余的svm分类器
  • 最终检测框是以预测偏移值绝对值之和最小为评判标准,没有实现NMS
  • bounding box没有进行原论文中各边16像素的膨胀,而是直接resize成227*227

所有代码放在https://github.com/Myshrry/RCNN-for-Banana-Dataset
共勉~

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值