『cs231n』Faster_RCNN(待续)

前言

研究了好一阵子深度学习在计算机视觉方面的实际应用意义不大的奇技淫巧,感觉基本对研究生生涯的工作没啥直接的借鉴意义,硬说收获的话倒是加深了对tensorflow的理解,是时候回归最初的兴趣点——物体检测了,实际上对cs231n的Faster RCNN讲解理解的不是很好,当然这和课上讲的比较简略也是有关系的,所以特地重新学习一下,参考文章链接在这,另:

Faster RCNN github : https://github.com/rbgirshick/py-faster-rcnn

Faster RCNN paper : https://arxiv.org/abs/1506.01497

综述

图1 Faster CNN基本结构(来自原论文)

如图1,Faster RCNN可以分为四个部分:

  1. Conv layers:                          Faster RCNN首先使用CNN网络提取image的feature maps;
  2. Region Proposal Networks:   RPN网络用于生成region proposals,该层通过softmax判断anchors属于foreground或者background,再利用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 RCNN网络。

图2展示了Python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构:

  1. 对于任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;
  2. Conv layers中包含了13个conv层+13个relu层+4个pooling层;
  3. RPN网络首先经过3x3卷积,再分别生成foreground anchors与bounding box regression偏移量,然后计算出proposals;
  4. Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。

图2 faster_rcnn_test.pt网络结构

网络结构介绍

1、Conv layers

对于VGG16模型(原论文使用的模型),所有的卷积层使用了3*3的卷积核,既是最优的卷积核大小并padding,然后poling层使用的2*2大小过滤器,步长取2,也就是每一次池化后尺寸缩短1/2,Conv layers部分共有13个conv层,13个relu层,4个pooling层,这样MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16),当然这本身并没什么值得介绍的,主要是这揭示了Conv layers生成的feature map和原图对应的关系实际上是简单的映射过来的。

2、Region Proposal Networks(RPN)

传统的滑动窗口+图像金字塔生成检测框以及RCNN使用SS(Selective Search)方法生成检测框的过程是十分耗时的,Faster RCNN的主要创新之处也正在于此:RPN生成检测框的方法能极大提升检测框的生成速度。

图3 RPN网络结构

上图3展示了RPN网络的具体结构,可以看到RPN网络实际分为2条线:

  1. 上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground);
  2. 下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。

而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

2.1 anchors

提到RPN网络,就不能不说anchors。所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。直接运行demo中的generate_anchors.py可以得到以下输出:

    [[ -84.  -40.   99.   55.]
     [-176.  -88.  191.  103.]
     [-360. -184.  375.  199.]
     [ -56.  -56.   71.   71.]
     [-120. -120.  135.  135.]
     [-248. -248.  263.  263.]
     [ -36.  -80.   51.   95.]
     [ -80. -168.   95.  183.]
     [-168. -344.  183.  359.]]

其中每行的4个值[x1,y1,x2,y2]代表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为:width:height = [1:1, 1:2, 2:1]三种,如图4,实际上通过anchors就引入了检测中常用到的多尺度方法:

图4 anchors示意图

【注】:关于上面的anchors size,是根据网络输入图像设置的,在python demo中,会把任意大小的输入图像reshape成800x600(即图2中的M=800,N=600),再看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。

图5

解释一下图5:

  1. Conv Layers最后生成256张特征图,所以相当于feature map每个点都是256-d;
  2. Conv Layers之后,做了rpn_conv/3x3卷积且输出深度256,相当于每个点又融合了周围3x3的空间信息,同时256-d不变,注意卷积层不改变图片大小,即(M/16)x(N/16)不变;
  3. 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分foreground和background,所以每个点由256d feature转化为cls=2k scores,而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates;
  4. 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练。

【注1】:之前了解Faster RCNN时最为费解的部分就是上面的第3条,实际上结合cs231n课程中介绍的定位任务(单目标)就比较容易理解了,这实际上和把定位任务分化为分类+回归是一个原理,对于同一个输入分别设计得分网络(分类)和坐标网络进行学习。

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

2.2 softmax判定foreground与background

接上面的参数,RPN网络输入为(M/16)x(N/16),设W=M/16,H=N/16。这一步实际就是一个1x1卷积或者是全连接,如图6:

图6 RPN中判定fg/bg网络结构

1x1卷积其输出深度18(相当于全连接层),也就是经过该卷积的输出图像为WxHx18大小,对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是foreground和background。

2.4 bounding box regression原理

3、Roi Pooling

时间: 2024-12-26 02:11:47

『cs231n』Faster_RCNN(待续)的相关文章

『cs231n』计算机视觉基础

线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.差劲的方案,随机搜索 bestloss = float('inf') # 无穷大 for num in range(1000): W = np.random.randn(10, 3073) * 0.0001 loss = L(X_train, Y_train, W) if loss < bestloss: bestloss = loss bestW = W scores = bsetW.dot(Xt

『cs231n』图像定位与检测(下,待续)

图像检测原理 定义: 给出一张图片和几个类别,定位出图片中这些类所有的实例. 思路分析:回归vs分类 由于输出数目不定,所以不能简单的把检测任务像定位任务一样归化为回归任务(检测任务会导致回归层神经元数目是不确定的) 在机器学习中,分类和回归是解决所有问题的两种基本思路,所以我们尝试用分类的思想分析问题. 思路是将所有可能分类的区域送入网络 问题是图片数量太多 直观的解决思路是换个速度快的电脑... ... 实际上新电脑还是不够快... ... 那就只查看一些可能的区域(预处理) Region

『cs231n』卷积神经网络的可视化与进一步理解

cs231n的第18课理解起来很吃力,听后又查了一些资料才算是勉强弄懂,所以这里贴一篇博文(根据自己理解有所修改)和原论文的翻译加深加深理解. 可视化理解卷积神经网络 原文地址 一.相关理论 本篇博文主要讲解2014年ECCV上的一篇经典文献:<Visualizing and Understanding Convolutional Networks>,可以说是CNN领域可视化理解的开山之作,这篇文献告诉我们CNN的每一层到底学习到了什么特征,然后作者通过可视化进行调整网络,提高了精度.最近两年

『cs231n』视频数据处理

视频信息 和我之前的臆想不同,视频数据不仅仅是一帧一帧的图片本身,还包含个帧之间的联系,也就是还有一个时序的信息维度,包含人的动作判断之类的任务都是要依赖动作的时序信息的 视频数据处理的两种基本方法 - 使用3D卷积网络引入时间维度:由于3D卷积网络每次的输入帧是有长度限定的,所以这种方法更倾向于关注局部(时域)信息的任务 - 使用RNN/LSTM网络系列处理时序信息:由于迭代网络的特性,它更擅长处理全局视频信息 发散:结合两种方法的新思路 上面的具体实现也未必需要3D卷积,毕竟递归网络自己已经

『cs231n』RNN之理解LSTM网络

概述 LSTM是RNN的增强版,1.RNN能完成的工作LSTM也都能胜任且有更好的效果:2.LSTM解决了RNN梯度消失或爆炸的问题,进而可以具有比RNN更为长时的记忆能力.LSTM网络比较复杂,而恰好找到一篇不错的介绍文章,和课程的讲述范围差不多,所以这里摘下来(自己截图记录好麻烦),另外找到一篇推了公式的LSTM介绍,这个cs231n的课程并没有涉及,我暂时也不做这方面的研究,不过感觉内容不错,链接记下来以备不时之需. 本篇原文链接 RNN以及LSTM的介绍和公式梳理 按照老师的说法,LST

『cs231n』作业1问题1选讲_通过代码理解K近邻算法&amp;交叉验证选择超参数参数

通过K近邻算法探究numpy向量运算提速 茴香豆的"茴"字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用broadcast和矩阵的数学性质实现无循环 图片被拉伸为一维数组 X_train:(train_num, 一维数组) X:(test_num, 一维数组) 方法验证 import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3]]) b

『cs231n』线性分类器最优化

最优化策略 1.差劲的方案,随机搜索 bestloss = float('inf') # 无穷大 for num in range(1000): W = np.random.randn(10, 3073) * 0.0001 loss = L(X_train, Y_train, W) if loss < bestloss: bestloss = loss bestW = W scores = bsetW.dot(Xte_cols) Yte_predict = np.argmax(score, ax

『cs231n』作业2选讲_通过代码理解优化器

1).Adagrad一种自适应学习率算法,实现代码如下: cache += dx**2 x += - learning_rate * dx / (np.sqrt(cache) + eps) 这种方法的好处是,对于高梯度的权重,它们的有效学习率被降低了:而小梯度的权重迭代过程中学习率提升了.要注意的是,这里开根号很重要.平滑参数eps是为了避免除以0的情况,eps一般取值1e-4 到1e-8. 2).RMSpropRMSProp方法对Adagrad算法做了一个简单的优化,以减缓它的迭代强度: ca

『cs231n』图像定位与检测

图像处理任务 分类,定位,检测,图像分割辨析: 定位: 每张图片只有单个对象(可以有多个类),后面有提到,一般只要是固定个对象即可,不一定是一个(人体姿势判断部分)由于实现相对简单,所以能划分为定位任务时尽量划分为定位任务 检测: 每张图片可以有多个对象和多个类 分割: 不是简单的画框,而是围出轮廓,本节不予讨论 图像分类&定位 定位任务引入 和分类任务输出一个代表类标签的向量不同,定位任务输出的是描述框的四个数字,而网络评估不使用准确率而使用IOU.[注]IOU定义如下: 矩形框A.B的一个重