首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

源码入门之Faster RCNN

带你一起学习 Faster Rcnn 源码

前言

学习深度学习和计算机视觉,特别是目标检测方向的学习者,一定听说过Faster Rcnn;在目标检测领域,Faster Rcnn表现出了极强的生命力,被大量的学习者学习,研究和工程应用。网上有很多版本的Faster RCNN的源码,但是很多版本代码太过于庞大,对新入门的学习者学习起来很不友好,在网上苦苦寻找了一番后终于找到了一个适合源码学习的Faster Rcnn的pytorch版本代码。

根据该版本的作者讲该代码除去注释只有两千行左右,并且经过小编的一番学习之后,发现该版本的代码真的是非常的精简干练,读起来“朗朗上口”,并且深刻的感觉到作者代码功底之深厚。在此先附上源码的地址(https://github.com/chenyuntc/simple-faster-rcnn-pytorch) ,并对源码作者(陈云)表示由衷的感谢和深深地敬意。

本文章主要的目的是对该版本代码的主要框架进行梳理,希望能够对一些想学习源码的读者有一定的帮助。

代码的主要文件

-data文件中主要是文件的与dataset相关的文件

-misc中有下载caffe版本预训练模型的文件,可以不看

-model文件中主要是与构建Faster Rcnn网络模型有关的文件

-utils中主要是一些辅助可视化和验证的文件

-train.py是整个程序的运行文件,下面有一部分会做介绍

-trainer.py文件主要是用于训练,模型的损失函数的计算都在这个文件中

train

先来看一下train.py里的主要内容:

从train.py中的主要函数可以看出,主要的步骤涉及训练数据和测试数据的预处理,网络模型的构建(Faster RCNN),然后就是迭代训练,这也是通用的神经网络搭建和训练的过程。在Faster Rcnn网络模型中主要包含Extractor、RPN和RoIhead三部分。网络中Extractor主要是利用CNN进行特征提取,网络采用的VGG16;RPN是候选区网络,为RoIHead模块提供可能存在目标的候选区域(rois);RoIHead主要负责rois的分类和微调。整体的框架图如下图所示:

图片来源于陈云的知乎

Dataset

在本版本的代码中读取的数据格式为VOC,Dataset和TestDataset类分别负责训练数据和测试数据的读取及预处理。在预处理部分主要的操作就是resize图像的大小、像素值的处理以及图像的随机翻转。主要的内容如下:

FasterRCNNVGG16

下面主要介绍Extractor、RPN和RoIHead三部分结构

Extractor

Extractor部分主要使用的VGG16的网络结构,同时使用预训练好的模型提取图片的特征。论文中主要使用的是Caffe的预训练模型,根据代码的作者讲该版本的预训练模型效果比较好。

为了节约显存,作者将前四层卷积层的学习率设置为0,Conv5_3的输入作为图片的特征输入到RPN网络中。根据网络结构,Conv5_3部分的感受野为16,也就是相较于输入的图片大小,feature map的尺寸为(C,H/16,W/16).该部分网络结构图如下所示:

具体的decom_vgg16()代码如下:

RPN

Faster RCNN中最突出的贡献就是提出了Region Proposal Network(RPN),将候选区域提取的时间开销几乎降为0。该模块的主要作用提供可能存在目标的候选区域rois。模块结构图如下所示:

图片来源于陈云的知乎

RoIHead

RoIhead主要任务是对RPN网络选出的候选框进行分类和回归,在RoIhead中作者提出了RolPooling方法将不同尺度的候选区域全部pooling到一个尺度上。模块结构图如下所示:

运行代码

整体来说该版本的代码环境相当简单,配置起来相当容易,没有什么坑,认真阅读作者的readme就好。在utils文件中有一个config.py文件,在里边可以修改文件读取的路径,学习率等参数,自己运行时根据自己的情况进行修改即可。小编运行自己的数据(非VOC2007)结果如下图:

总结

本篇文章主要的目的是推荐一个适合源码学习的Faster rcnn版本给大家,并对代码框架做了初步的介绍,希望对大家的源码学习有一定的帮助,由于整个算法实现的代码较为复杂,且细节比较多,很难通过一篇文章进行详细的说明,如果大家对本版本的代码感兴趣,可以自己阅读源码学习。在学习源码的时候我个人是有很多感想的,作为一个小白,通过源码的学习真的学习到了很多,之前论文阅读过几遍,别的版本的代码也拿来训练过数据,但是读了这个的源码,又如发现了新大陆,很多算法的细节和精髓才算有了深刻的理解,真的是纸上得来终觉浅,绝知此事要coding。除了算法本身,在一些代码的实现上也有很多的学习,真的感受到代码作者的功力深厚,再次对作者表示深深地敬意.最后留个问题,在阅读源码的时候,发现作者使用了visdom进行可视化,如运行的截图,小编还知道pytorch中一个可视化工具tensorboardX,但都不是很熟悉,还请知情人士在下方留言,详细的讲解一下两种可视化工具的优劣。由于小编是一个刚入门(入坑)的学习者,文章中的不当之处还请大家谅解和提出,很希望能与大家一起讨论学习。

最后再次放上源码链接:

https://github.com/chenyuntc/simple-faster-rcnn-pytorch

参考:

https://zhuanlan.zhihu.com/p/32404424

https://www.cnblogs.com/kerwins-AC/p/9734381.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191025A08B6I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券