faster rcnn论文_Faster-RCNN学习记录

  1. 引言
  2. Faster-rcnn原理
    1. 大致流程
    2. 数据读取部分
    3. 特征提取器
    4. RPN网络
    5. ProposalTargetCreator
    6. RoIHead网络
  3. 具体实战
    1. 模型测试
    2. 模型评估
    3. 模型训练

引言

近一年多来,因个人兴趣和工作需要学习了许多图像目标检测算法,从最开始的SSD,到后来的retinanet以及去年年底的centernet。学习过程主要是先阅读原始论文,再看懂以及使用github上的优质代码对自身数据集进行训练测试,最后尝试按照自身理解进行代码复现(但均未在VOC或COCO数据集上进行验证,只能说代码大部分正确,但可能忽略了某些细节,不过在自身数据集上能够进行正确的检测);在这期间,一直对二阶段检测算法(这其中以faster-rcnn最著名)有所耳闻,但从未进行深入的了解;前段时间参加水下目标检测,发现前排大佬全部采用pytorch框架下的mmdetection中的cascade-RCNN,突然发现打比赛还是需要二阶段检测器,因此决定找个机会学习下二阶段检测器。

一周前,GiantPandaCV公众号开始推送FasterR-CNN原理及代码讲解系列文章,同时加上本人最近在学习pytorch(天下苦tensorflow久矣。。。),就想着可以通过这个系列把这两部分的内容都给补上,经过一个多星期的学习,就有了现在这篇faster-rcnn学习记录以便以后查阅。

项目及图片参考地址:

  • github地址:https://github.com/chenyuntc/simple-faster-rcnn-pytorch
  • GiantPandaCV系列文章:【资源】Faster R-CNN原理及代码讲解电子书

Faster-rcnn原理与代码理解

总览

首先是跟着GiantPandaCV推送的系列文章把faster-rcnn的检测原理以及项目中各个文件的作用进行了深入的了解;其中faster-rcnn为整体结构如下:

faster rcnn论文_Faster-RCNN学习记录_第1张图片

可以看到faster-rcnn主要分为四个部分:

  • dataset:数据读取。实现标注数据集的读取比如coco,voc数据集,包括图片和目标信息的读取,以及常用的数据增强技术,如果参加过目标检测比赛,可以发现有很多数据增强的奇淫技巧;
  • Extractor:特征提取器。主要是提取输入图片中的特征,提供给后面网络进行分类与回归,也称backbone,常用的有vgg,resnet,densenet,efficientnet等等
  • RPN:候选区域生成网络。这里面最重要的创新点就是提出了anchor机制,通过输入特征图以及anchor机制使得网络能够产生包含目标的候选框,从而替代之前的selective search
  • RoIHead:根据输入的rois对特征图进行roi pooling,然后进行分类与回归。

下面我们分别来看看每个部分的功能以及输入与输出

STEP1:数据读取部分

功能:该部分主要实现数据集的读取与增强

输入:

  • 标注数据集路径,string

输出:

  • img,输入图片张量,维度【B,3,H,W】
  • bbox,,目标框位置,维度【B,R,4】,其中由于每张图片的R不同,因此此处B=1
  • label,目标类别,维度【B,R】,从0开始不包括背景样本
  • scale,输入图片缩放尺度,只知道在roi pooling时使用,具体作用不清楚

faster rcnn论文_Faster-RCNN学习记录_第2张图片

STEP2:特征提取器

功能:该项目采用预训练的vgg16网络提取输入图片的特征,流程与实现代码如下图所示

输入:数据增强后的图片,维度【B,3,H,W】

输出:特征图,维度【B,512,H/16,W/16】

faster rcnn论文_Faster-RCNN学习记录_第3张图片

STEP3:RPN网络

功能:根据输入特征图生成anchor,并预测anchor的前后景概率以及位置偏差,根据位置偏差与anchor位置生成rois,并从中选择置信度高的rois作为候选框区域

输入:

  • features:特征提取器输出图像特征,维度【B,512,H/16,W/16】
  • imags_size:图片尺寸
  • scales:图片缩放因子

输出:

  • anchor,维度【N, 4】
  • rpn_locs,维度【N,4】
  • rpn_scores,维度【N,2】,前后景概率
  • rois,维度【12000,4】,所有anchor按照概率从高到低,然后经过NMS得到12000个
  • rois_indices,维度【12000,】,主要是为了指示各rois对应当前batch中的哪个样本

核心AnchorTargetCreator类

  • 功能:生成所有anchor的类别与位置标签,以便计算RPN的loss
  • 输入:
    • bbox:目标框位置,维度【R,,4】,表示一张图片
    • anchor:先验框位置,维度【N,4】,其中N = H/16 * W/16 * 9
    • img_size:输入图片尺寸,用于滤除超过边界的先验框
  • 输出:
    • loc:所有anchor与所对应gt的位置偏差,其中选择IOU最大的gt
    • label:所有anchor的类别,每个anchor的最大IOU超过门限则为前景,否则为背景

核心ProposalCreator类

    • 功能:对所有的rois进行置信度排序,选择12000个rois,根据loc修正anchor位置后,并利用NMS算法去除冗余的rois,留下一定数目的个rois(其中训练2000,测试300)
    • 输入:
      • loc:RPN网络位置预测,维度【N,4】
      • score:RPN网络前景预测概率,维度【N,】
      • anchor:RPN网络输出的anchor,维度【N,4】
      • img_size:输入图像尺寸
      • scale:缩放尺寸
    • 输出:
      • roi:候选框位置,维度【2000/300,4】
    • rois数目变化:N --》12000(6000)--》2000(300)

STEP3-1:ProposalTargetCreator

功能:从ProposalCreator输出rois中随机选择一定数量的正负样本(总数128,正样本32,负样本96)作为rois,并且得到该rois对应的类别和位置标签,用于计算loss,只用于训练

输入:

    • roi:RPN网络输出的rois,维度【2000,4】
    • bbox:当前图片所有目标的位置信息,维度【R,4】
    • label:当前图片所有目标的类别信息,维度【R,】

输出:

    • sample_roi:选择ROIS,维度【128,4】
    • gt_roi_loc:位置标签,维度【128,4】
    • gt_roi_label,类别标签,维度【128,】

STEP4:RoIHead网络

该项目采用VGG16最后几层实现rois的分类回归

功能:根据rois和特征图实现roi pooling以及分类与回归

输入:

    • rois:ProposalTargetCreator选择的候选框区域
    • x:特征提取器输出特征
    • roi_indices:每个rois所对应当前batch中的哪个样本

输出:

    • roi_cls_locs:预测所有rois的位置偏差,维度【128,21*4】,可以发现每个类别都预测了位置偏差,注意在计算loss时只需考虑当前roi所对应的那个类别的位置偏差即可;
    • roi_scores:预测所有rois的类别,维度【128,21】

具体实战

准备工作:

  • 环境安装,win10,anaconda,pycharm,torch1.2,cuda10.0,GTX-1050
  • VOC2007数据集下载
  • 下载VGG16预训练权值以及作者提供的权值
  • 由于resource包仅适用于linux系统,因此将train.py文件中下面三行进行注释
# import resource
#
# rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)
# resource.setrlimit(resource.RLIMIT_NOFILE, (20480, rlimit[1]))
  • visdom包安装后,运行 python -m visdom.server一直停留在下面这个界面,无法使用
Checking for scripts. 
Downloading scripts, this may take a little while

解决方案参考pytorch visdom安装启动问题

模型测试

在jupyter notebook下运行demo.ipydb,由于百度网盘下载速度太慢,这里只给出了chainer_best_model_converted_to_pytorch0.7053.pth权值0.5与0.7两个门限下的检测结果,如下图所示,其中在model/faster_rcnn.py文件的use_preset函数中修改。

faster rcnn论文_Faster-RCNN学习记录_第4张图片

模型评估

  • 修改配置文件load_path ='chainer_best_model_converted_to_pytorch_0.7053.pth'
  • caffe_pretrain = True
  • 模型加载到了trainer.faster_rcnn,而非之前实例化的faster_rcnn
原代码:
eval(test_dataloader, faster_rcnn, test_num=opt.test_num)
改为:
eval(test_dataloader, trainer.faster_rcnn, test_num=opt.test_num)
  • 各类别的ap以及mAP截图如下
    • chainer_best_model_converted_to_pytorch_0.7053

faster rcnn论文_Faster-RCNN学习记录_第5张图片
  • fasterrcnn_12222105_0.712649824453_caffe_pretrain.pth

faster rcnn论文_Faster-RCNN学习记录_第6张图片

模型训练

运行指令:python train.py train --env='fasterrcnn-torch'

由于本人机器有点渣。。。,此时会报cuda runtime error:out of memory。

修改配置文件中的num_workers=0,test_num_workers=0

重新在终端输入:python train.py train --env='fasterrcnn-torch,成功开始训练,此时打开http://localhost:8097/,可以观察模型训练情况,包括loss和图片预测结果,如下图所示

faster rcnn论文_Faster-RCNN学习记录_第7张图片

不知道为什么图片的排列显得很混乱,而且混淆矩阵的图特别小,以致于都看不到(上图红色部分)。。。。

但是运行7000此迭代后,又出现了cuda runtime error:out of memory。。。。

总之完成了模型的测试,评估以及训练,另外想搞深度学习的小伙伴们一定要搞块好一点的显卡。。。,今天就到这里吧!

你可能感兴趣的:(faster,rcnn论文)