| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【论文】Faster RCNN -> 正文阅读 |
|
[人工智能]【论文】Faster RCNN |
【论文】Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks.(pdf) 整体框架Faster RCNN 可以分为 4 个大模块;
下面展示了 Faster RCNN 的细节处理,假设输入一张任意大小的图片 P × Q P\times Q P×Q
Conv LayersFaster RCNN 中对所有卷积都进行了 padding 处理(padding = 1),于是经过 3 × 3 3\times3 3×3 的卷积后输出图的大小并不发生改变(经过卷积后 ( M ? 3 + 2 × 1 ) / 1 + 1 = M (M-3+2\times1)/1+1=M (M?3+2×1)/1+1=M) 这样的好处是,每次经过池化层图片大小缩小为原来的一半,即 M 2 × N 2 \frac{M}{2}\times\frac{N}{2} 2M?×2N?,而卷积和 relu 不改变图片大小,于是在经过 Conv Layers 后,图片变为 M 16 × N 16 \frac{M}{16}\times\frac{N}{16} 16M?×16N?,这样在 RoI Pooling 时将非常容易对齐 Anchor Generation LayerFast RCNN 中会反复提到一个概念——anchor,所谓 anchor 其实就是一组矩形框,9 个矩形有 3 种形状,长宽比大约为 1 : 1 1:1 1:1 、 、 、 1 : 2 1:2 1:2 和 2 : 1 2:1 2:1,实际上通过关 anchor 就引入了检测中常用的多尺度方法 在 Conv Layers 输出的 feature map 的每个点都配备这 9 个 anchor 作为初始的检测框,这样获得的检测框存在不准确的问题也不用太担心,后面会有两次机会通过回归修正检测框的位置 我们对论文图片做如下两点解释:
于是,接下来 anchor generation layer 的操作就是在原图尺度上生成密密麻麻的候选 anchor,论文中原图的大小为 800 × 600 800\times600 800×600,在通过 Conv Layer 后,feature map 的大小就是 50 × 38 50\times38 50×38(向上取整),那么就会生成 50 × 38 × 9 = 17100 50\times38\times9=17100 50×38×9=17100 个 anchor Bounding Box Regression如下图所示,红色的框为提取的 positive anchor box,绿色的框为 ground truth box,即便红色的框可以识别出飞机,但是由于定位不准确,我们需要 bbox regression 对红色的框进行微调,使得其更加接近于 ground truth 对于一个 box 使用 ( x , y , w , h ) (x,y,w,h) (x,y,w,h) 表示,分别表示中心点的位置和宽高。下图中还是用红色的框表示 positive anchor box A = ( A x , A y , A w A h ) A=(A_x,A_y,A_wA_h) A=(Ax?,Ay?,Aw?Ah?),绿色的框表示 ground truth box G = ( G x , G y , G w , G h ) G=(G_x,G_y,G_w,G_h) G=(Gx?,Gy?,Gw?,Gh?),我们希望寻得一种关系可以使 A A A 经过映射得到一个跟 ground truth box 更接近的 regression box G ′ = ( G x ′ , G y ′ , G w ′ , G h ′ ) G'=(G'_x,G'_y,G'_w,G'_h) G′=(Gx′?,Gy′?,Gw′?,Gh′?) 我们先做平移操作 线性变换可以表示为
Y
=
W
X
Y=WX
Y=WX,输入是 anchor 对应的 feature map 组成的特征向量
?
(
A
)
\phi(A)
?(A),训练同时传入
A
A
A 与
G
G
G 之间的差异
(
t
x
,
t
y
,
t
w
,
t
h
)
(t_x,t_y,t_w,t_h)
(tx?,ty?,tw?,th?),那么变换的目标函数就可以表示为 为了让预测值
d
?
(
A
)
d_*(A)
d??(A) 与真实值
t
?
t_*
t?? 的差距最小,设计 L1 损失函数 实际中使用 smooth-L1 损失 Region Proposal NetworkFaster RCNN 抛弃传统的滑动窗口和 ss(Selective Search)方法生成检测框,直接采用 RPN 生成检测框。RPN 网络分为两条线,一条通过 softmax 分类判断 anchor 是正样本分类还是负样本分类,一条计算 anchor 的 bbox regression 偏移量。后面的 proposal 层负责综合 positive anchor 和回归的偏移量获得 proposal,同时提出太小或超出边界的检测框 RPN 训练的整个损失函数可以表示为 回归损失乘以了一个系数 p i ? p_i^* pi?? 表示我们只关心 positive anchor 的损失。由于实际计算中, N c l s N_{cls} Ncls? 和 N r e g N_{reg} Nreg? 的数量级相差较大,所以引入了平衡因子 λ \lambda λ 如前面所述,
L
r
e
g
L_{reg}
Lreg? 使用 smooth-L1 损失 t x = ( x ? x a ) / w a , ? t y = ( y ? y a ) / h a t w = l o g ( w / w a ) , ? t h = l o g ( h / h a ) t x ? = ( x ? ? x a ) / w a , ? t y ? = ( y ? ? y ) / h a t w ? = l o g ( w ? / w a ) , ? t h ? = l o g ( h ? / h a ) t_x=(x-x_a)/w_a,\ t_y=(y-y_a)/h_a\\ t_w=log(w/w_a),\ t_h=log(h/h_a)\\ t_x^*=(x^*-x_a)/w_a,\ t_y^*=(y^*-y)/h_a\\ t_w^*=log(w^*/w_a),\ t_h^*=log(h^*/h_a) tx?=(x?xa?)/wa?,?ty?=(y?ya?)/ha?tw?=log(w/wa?),?th?=log(h/ha?)tx??=(x??xa?)/wa?,?ty??=(y??y)/ha?tw??=log(w?/wa?),?th??=log(h?/ha?) 其中, x , x a , x ? x,x_a,x^* x,xa?,x? 分别对应 predicted box,anchor box 和 ground truth box proposal layerproposal layer 负责综合回归偏量和 positive anchor,计算出精确的 proposal。除了回归偏量和 positive anchor 外,proposal layer 还有一个输入 im_info,以及一个参数 feature_stride = 16
proposal layer 具体的工作流程如下:
值得一提的是这里 proposal layer 的输出是对应 M × N M\times N M×N 输入尺度的,而不是 feature map 上的尺度 RoI Pooling为什么需要 RoI Pooling 呢? 在历史上,网络训练好后输入图像的尺寸也就固定了,对于输入大小不同的图像有两种解决方法:(1)从图像中截取出固定大小的区域;(2)将图像 warp 成固定大小。但是这两种方式都存在一定的问题,第一种破坏了图像的完整结构,第二种破坏了图像的原始形状信息 而 RoI Pooling 的提出正是为了解决这些问题,对大小形状不同的 proposal 进行一个统一化的处理。RoI Pooling 在 Fast RCNN 中就已经提出,大致流程也是相同的:
ClassificationClassification 通过前面的 proposal feature map 经过全连接层和 softmax 计算每个 proposal 对应每个类别的得分。同时,在 Classification 中会再次利用 bbox regression 对每个 proposal 的位置进行精修 Faster RCNN 训练RPN 和 Fast RCNN 都会要求利用 CNN 网络提取图像特征,所以论文的做法是使 RPN 和 Fast RCNN 共享同一个卷积网络。于是,Fast RCNN 的训练类似于一种弄迭代的过程:
(现在,在 github 上开源的实现大多采用近似联合训练 approximate joint training,采用端到端的一步训练) 下面两幅图展示了 Fast RCNN 的完整流程 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 12:50:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |