| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> Fast R-CNN论文详解 -> 正文阅读 |
|
[人工智能]Fast R-CNN论文详解 |
Fast R-CNN详解文章目录1.RCNN回顾RCNN算法分为4个步骤:
1.1 Fast RCNN主要贡献点
2.Fast RCNN算法框架首先Fast RCNN相比于RCNN主要在以下方面进行了改进:
使用Fast RCNN进行目标检测的预测流程如下:
3.训练过程3.1 详细步骤论文中使用了多种网络结构进行训练,这里以VGG-16(AlexNet之后的又一经典网络)为例。 最开始仍然是在ImageNet数据集上训练一个1000类的分类网络 然后对模型进行“三个变动”
变化后的模型结构如下所示 使用变动后的模型,在标注过的图像数据上继续训练,训练时要输入图像、标注(这里将人为标注的框称为ground truth)和建议框信息。这里为了提高训练速度,采取了小批量梯度下降的方式,每次使用2张图片的128张建议框(每张图片取64个建议框)更新参数。 每次更新参数的训练步骤如下
3.2 训练过程图解训练数据构成 N张完整图片以50%概率水平翻转。 R个候选框的构成方式如下:
4.ROI池化我们知道在ImageNet数据上做图片分类的网络,一般都是先把图片crop、resize到固定的大小(224*224),然后输入网络提取特征再进行分类,而对于检测任务这个方法显然并不适合,因为原始图像如果缩小到224这种分辨率,那么感兴趣对象可能都会变的太小无法辨认。RCNN的数据输入和SPPNet有点类似,并不对图片大小限制,而实现这一点的关键所在,就是ROI Pooling网络层,它可以在任意大小的图片feature map上针对输入的每一个ROI区域提取出固定维度的特征表示,保证后续对每个区域的后续分类能够正常进行。 与SPP的目的相同:如何把不同尺寸的ROI映射为固定大小的特征。ROI就是特殊的SPP,只不过它没有考虑多个空间尺度,只用单个尺度(下图只是大致示意图)。 ROI Pooling的具体实现可以看做是针对ROI区域的普通整个图像feature map的Pooling,只不过因为不是固定尺寸的输入,因此每次的pooling网格大小得手动计算,比如某个ROI区域坐标为 ( x 1 , y 1 , x 2 , y 2 ) (x1,y1,x2,y2) (x1,y1,x2,y2),那么输入size为 ( y 2 ? y 1 ) ? ( x 2 ? x 1 ) (y2-y1)·(x2-x1) (y2?y1)?(x2?x1) ,如果pooling的输出size为 p o o l e d h e i g h t ? p o o l e d w i d t h pooled_{height}·pooled_{width} pooledheight??pooledwidth?,那么每个网格的size为 ( ( y 2 ? y 1 ) / p o o l e d h e i g h t ? ( x 2 ? x 1 ) / p o o l e d w i d t h ) ((y2 - y1)/pooled_{height}·(x2-x1)/pooled_{width}) ((y2?y1)/pooledheight??(x2?x1)/pooledwidth?)。 5.损失函数损失函数分为两个部分,分别对应两个并行层
总损失如下: L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L(p,u,t^u,v) = L_{cls}(p,u) + λ[u ≥ 1]L_{loc}(t^u,v) L(p,u,tu,v)=Lcls?(p,u)+λ[u≥1]Lloc?(tu,v) 损失函数分为两个部分: L c l s L_{cls} Lcls? 表示分类损失, L l o c L_{loc} Lloc? 表示定位损失(回归损失) λ λ λ用于判断背景,如果分类不是背景, λ = 1 λ=1 λ=1 分类如果是背景 λ = 0 λ=0 λ=0,则不考虑定位损失,即: 分类损失: 对于分类的全连接神经网络,它将产生由Softmax产生的概率 p = ( p 0 , p 1... , p K ) p=(p0,p1...,pK) p=(p0,p1...,pK)。这里K=20,所以共有21个概率值。 L c l s ( p , u ) = ? l o g ( p u ) L_{cls}(p,u) = -log(p_u) Lcls?(p,u)=?log(pu?),其中 P u P_u Pu?是真实类型预测的那个概率。也就是说这里只计算一个 ,其他概率值不算。 定位损失: 对于bounding-box回归的全连接网络,它产生的是位置信息 ( x , y , w , h ) (x,y,w,h) (x,y,w,h),分类神经网络每一个概率值,它都对应有一个位置信息。所以网络最后输出维度为: 21 ? 4 = 84 。 21*4=84。 21?4=84。 有了ROI Pooling层其实就可以完成最简单粗暴的深度对象检测了,也就是先用selective search等proposal提取算法得到一批box坐标,然后输入网络对每个box包含一个对象进行预测,此时,神经网络依然仅仅是一个图片分类的工具而已,只不过不是整图分类,而是ROI区域的分类,显然大家不会就此满足,那么,能不能把输入的box坐标也放到深度神经网络里然后进行一些优化呢?。 在Fast-RCNN中,有两个输出层:第一个是针对每个ROI区域的分类概率预测 p = ( p 0 , p 1 , ? ? ? , p K ) p = (p0,p1,···,pK) p=(p0,p1,???,pK),第二个则是针对每个ROI区域坐标的偏移优化 t k = ( t x k , t y k , t w k , t h k ) , 0 ≤ k ≤ K t_k = (t^k_x,t^k_y,t^k_w,t^k_h),0 ≤ k ≤ K tk?=(txk?,tyk?,twk?,thk?),0≤k≤K 是多类检测的类别序号。 假设对于类别 k ? k^* k?,在图片中标注了一个ground truth 坐标: t ? = ( t x ? , t y ? , t w ? , t h ? ) t^* = (t^*_x,t^*_y,t^*_w,t^*_h) t?=(tx??,ty??,tw??,th??),而预测值为$ t = (t_x,t_y,t_w,t_h)$,二者理论上越接近越好,这里定义损失函数: ![]() 这里, s m o o t h L 1 ( x ) smooth_{L1}(x) smoothL1?(x)中的x即为 t i ? t i ? t_i - t^*_i ti??ti??即对应坐标的差距。该函数在 (?1,1) 之间为二次函数,而其他区域为线性函数,作者表示这种形式可以增强模型对异常数据的鲁棒性,整个函数在matplotlib中画出来是这样的 6.SVD加速分类和位置调整都是通过全连接层实现的,假设全连接层参数为
W
W
W,尺寸
u
×
v
u × v
u×v一次前向传播即为:
Y
=
W
x
Y=Wx
Y=Wx ,计算复次数为 从上图可以看出,两个全连接层(fc6、fc7)占用了44.9%的时间,非常消耗时间。 为此,论文中对W进行SVD分解,并用前t个特征值近似: W = U ∑ V T ≈ U ( : , 1 : t ) ? ∑ ( 1 : t , 1 : t ) ? V ( : , 1 : t ) T W = U∑V^T ≈ U(:, 1 : t)·∑(1 : t,1 : t)· V(:,1 : t)^T W=U∑VT≈U(:,1:t)?∑(1:t,1:t)?V(:,1:t)T 原来的前向传播分解成两步: y = W x = U ? ( ∑ ? V T ) ? x = U ? z y = Wx =U · (∑·V^T)·x = U · z y=Wx=U?(∑?VT)?x=U?z 计算复杂度变为 u × t + v × t = ( u + v ) × t u × t + v × t=(u + v) × t u×t+v×t=(u+v)×t 在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。 使用SVD加速后,各部分使用时间如下所示: 7.测试过程7.1模型在各种数据集上的测试效果及对比训练数据越多越好吗? 文中分别在VOC 2007、VOC 2010、VOC 2012测试集上测试,发现训练数据越多,效果确实更好。这里微调时采用100k次迭代,每40k次迭代学习率都缩小10倍。 SPPnet论文中采用ZFnet【AlexNet的改进版】这样的小网络,其在微调阶段仅对全连接层进行微调,就足以保证较高的精度,作者文中采用VGG-16【L for large】网路,若仅仅只对全连接层进行微调,mAP会从66.9%降低到61.4%, 所以文中也需要对RoI池化层之前的卷积层进行微调; 那么问题来了?向前微调多少层呢?所有的卷积层都需要微调吗?
8.smooth L1 loss详解smooth L1 loss从两个方面限制梯度
考察如下几种损失函数,其中: 损失函数对 x 的导数分别为: 从(4)中可以看出,当x增大时,L2损失对x的导数也增大。这就导致训练初期,预测值与 groud truth 差异过于大时,损失函数对预测值的梯度十分大,训练不稳定。 从(5)中可以看出,L1 对 x 的导数为常数。这就导致训练后期,预测值与 ground truth 差异很小时, L1 损失对预测值的导数的绝对值仍然为 1,而 learning rate 如果不变,损失函数将在稳定值附近波动,难以继续收敛以达到更高精度。 从(6)中可以看出,smooth L1 在 x 较小时,对 x 的梯度也会变小,而在 x 很大时,对 x 的梯度的绝对值达到上限 1,也不会太大以至于破坏网络参数。 smooth L1 完美地避开了 L1 和 L2 损失的缺陷。其函数图像如下: 由图中可以看出,它在远离坐标原点处,图像和 L1 loss 很接近,而在坐标原点附近,转折十分平滑,不像 L1 loss 有个尖角,因此叫做 smooth L1 loss。 [本文整理于B站,知乎,CSDN] |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 1:20:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |