Pytorch VOC2012(Faster RCNN)

本篇文章介绍了Faster RCNN的基本原理和思路,参考地址为一文读懂Faster RCNN

Faster RCNN基本结构

经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。

依作者看来,如图1,Faster RCNN其实可以分为4个主要内容:

图1 Faster RCNN基本结构(来自原论文)
  1. Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
  3. Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

所以本文以上述4个内容作为切入点介绍Faster R-CNN网络。

图2展示了python版本中的VGG16模型中的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络

  1. Conv layers中包含了13个conv层+13个relu层+4个pooling层(其实就是VGG16的网络结构);
  2. RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals;
  3. Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification
  4. classification分类proposal到底是什么类别,同时再次bounding box regression获得检测框最终的精确位置。
图2 Faster RCNN具体网络结构

注:
本文不会讨论任何关于R-CNN家族的历史,分析清楚最新的Faster R-CNN就够了,并不需要追溯到那么久。实话说我也不了解R-CNN,更不关心。有空不如看看新算法。

1 Conv layers

Conv layers包含了conv,pooling,relu三种层。以python版本中的VGG16模型中的网络结构为例(如图3),Conv layers部分共有13个conv层,13个relu层,4个pooling层(如图4)。

图3 VGG网络结构
图4 VGG 11/13/16/19具体网络结构

这里有一个非常容易被忽略但是又无比重要的信息,在Conv layers中:

  1. 所有的conv层都是:kernel_size=3,pad=1,stride=1,所以conv层不改变输入和输出矩阵大小;
  2. 所有的pooling层都是:kernel_size=2,pad=0,stride=2 ,所以这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小

总结:conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!这样Conv layers生成的feature map中都可以和原图对应起来。

2 Region Proposal Networks(RPN)

经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。

图5 RPN网络结构

RPN部分的输入、输出如下:

  • 输入:feature map、物体标签,即训练集中所有物体的类别与边框位置。
  • 输出:Proposal、分类Loss、回归Loss,其中,Proposal作为生成的区域,供后续模块分类与回归。两部分损失用作优化网络。

2.1 Anchors

理解Anchor是理解RPN乃至Faster RCNN的关键。Faster RCNN先提供一些先验的边框,然后再去筛选与修正,这样在Anchor的基础上做物体检测要比从无到有的直接拟合物体的边框容易一些。

Anchor的本质是在原图大小上的一系列的矩形框,但Faster RCNN将这一系列的矩形框和feature map进行了关联。具体做法是,首先对feature map进行3×3的卷积操作,得到的每一个点的维度是512维,这512维的数据对应着原始图片上的很多不同的大小与宽高区域的特征,这些区域的中心点都相同。如果下采样率为默认的16,则每一个点的坐标乘以16即可得到对应的原图坐标。

为适应不同物体的大小与宽高,在作者的论文中,默认在每一个点上抽取了9种Anchors,具体Scale为{8,16,32},Ratio为{0.5,1,2},将这9种Anchors的大小反算到原图上,即得到不同的原始Proposal,如图6所示。而后通过分类网络与回归网络得到每一个Anchor的前景背景概率和偏移量,前景背景概率用来判断Anchor是前景的概率,回归网络则是将预测偏移量作用到Anchor上使得Anchor更接近于真实物体坐标。

图6 Anchors示意图

那么这9个anchors是做什么的呢?借用Faster RCNN论文中的原图,如图7,遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次回归可以修正检测框位置。

图7 anchors示意图

解释一下上面这张图的数字。

  1. 在原文中使用的是ZF Net(ILSVRC2013分类任务的冠军,使用反卷积对CNN的中间特征图进行可视化分析,通过分析特征行为找到提升模型的办法,微调Alexnet提升了表现。)其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions
  2. 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试),同时256-d不变(如图4和图7中的红框)
  3. 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分前景和背景,所以每个点由256d feature转化为cls=2k scores(二分类嘛);而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates(回归的四个值)
  4. 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(后面再说)

注意,在本文讲解中使用的VGG conv5 num_output=512,所以是512d,其他类似

言归正传,其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的前景,哪些是没目标的背景。所以,仅仅是个二分类而已

那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:

c e i l ( 600 / 16 ) ∗ c e i l ( 800 / 16 ) ∗ 9 = 37 ∗ 50 ∗ 9 = 16650 ceil(600/16) * ceil(800/16) * 9 = 37 * 50 * 9 = 16650 ceil(600/16)ceil(800/16)9=37509=16650

其中ceil()表示向上取整,是因为VGG输出的feature map size= 37*50。

图8 生成的Anchors

2.2 RPN的真值与预测量

理解RPN的预测量与真值分别是什么,也是理解RPN原理的关键。对于物体检测任务来讲,模型需要预测每一个物体的类别及其出现的位置,即类别、中心点坐标x与y、宽w与高h这5个量。由于有了Anchor这个先验框,RPN可以预测Anchor的类别作为预测边框的类别,并且可以预测真实的边框相对于Anchor的偏移量,而不是直接预测边框的中心点坐标x与y、宽高w与h。

举个例子,如图9所示,输入图像中有3个Anchors与两个标签,从位置来看,Anchor A、C分别和标签M、N有一定的重叠,而Anchor B位置更像是背景。

图9 图像中Anchor与标签的关系

首先介绍模型的真值。对于类别的真值,由于RPN只负责区域生成,保证recall,而没必要细分每一个区域属于哪一个类别,因此只需要前景与背景两个类别(二分类),前景即有物体,背景则没有物体。

RPN通过计算Anchor与标签的IoU来判断一个Anchor是属于前景还是背景。IoU的含义是两个框的公共部分占所有部分的比例,即重合比例。在图9中,Anchor A与标签M的IoU计算公式如式如下:

IoU ⁡ ( A , M ) = A ∩ M A ∪ M \operatorname{IoU}(A, M)=\frac{A \cap M}{A \cup M} IoU(A,M)=AMAM

当IoU大于一定值时,该Anchor的真值为前景,低于一定值时,该Anchor的真值为背景。

然后是偏移量的真值。如图10所示绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。

图10

对于窗口一般使用四维向量 ( x , y , w , h x,y,w,h x,y,w,h)表示,分别表示窗口的中心点坐标和宽高。对于图 11,红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:

  • 给定anchor A = ( A x , A y , A w , A h ) A = (A_x , A_y , A_w , A_h) A=(Ax,Ay,Aw,Ah) G T = ( G x , G y , G w , G h ) GT = (G_x , G_y , G_w , G_h) GT=(Gx,Gy,Gw,Gh)
  • 寻找一种变换F,使得: F ( A x , A y , A w , A h ) = ( G x ′ , G y ′ , G w ′ , G h ′ ) ≈ ( G x , G y , G w , G h ) = G T F (A_x , A_y , A_w , A_h) = (G_x' , G_y' , G_w' , G_h') ≈ (G_x , G_y , G_w , G_h) = GT F(Ax,Ay,Aw,Ah)=(Gx,Gy,Gw,Gh
要使用PyTorch中的Faster R-CNN训练自己的数据集,你需要以下步骤: 1. 准备数据集:首先准备自己的数据集,包括图像和相应的标注信息。标注信息可以使用类似于PASCAL VOC或COCO的标注格式,其中包含每个图像中物体的边界框和类别。 2. 数据预处理:对于数据预处理,你可能需要对图像进行缩放、裁剪、归一化等操作,以确保它们与模型的输入要求相匹配。同时,还需要将标注信息转换成模型所需的格式。 3. 构建数据集类:创建一个自定义数据集类,继承PyTorch的Dataset类,并实现__getitem__和__len__方法。__getitem__方法应当返回图像和标注信息的元组,同时根据需要进行必要的转换。 4. 定义模型:使用PyTorch中的torchvision.models中的Faster R-CNN模型作为基础,将其实例化为一个对象。你可以选择是否使用预训练的模型权重,以加快训练过程。 5. 设置训练参数:通过定义优化器、学习率调度器以及损失函数等来设置训练的参数。常用的优化器是SGD和Adam,并且可以使用不同的学习率调度器来动态调整学习率。 6. 训练模型:使用准备好的数据集、模型和训练参数来进行训练。在每个epoch中,循环遍历数据集并使用模型进行前向传播和反向传播,最后更新模型的权重。 7. 评估和测试模型:训练完成后,可以使用测试集或验证集对模型进行评估。评估指标可以包括准确率、召回率、平均精确度等。你可以根据需要进行必要的调整和优化。 8. 模型保存和使用:将训练好的模型保存为.pth文件,以便以后使用。你可以加载模型并在新的图像上进行预测,以获得目标检测的结果。 以上是使用PyTorch中的Faster R-CNN训练自己的数据集的大致步骤。根据具体的需求,你可能还需要进行其他的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值