读书笔记《深度学习与图像识别原理与实践 大白话讲解对小白易懂》2022-8-5

news2024/11/20 9:02:12

开始

目录

  • 前言
  • 1. 常见深度学习框架
  • 2. 图像分类算法
    • 2.1 传统类
    • 2.2 机器学习
      • 2.2.1 人工神经网络(神经元)
      • 2.2.2 卷积神经网络
  • 3. 目标检测算法
    • 3.1 分类+定位(单目标)
    • 3.2 分类+定位(多目标,目标检测)
      • 3.2.1 R-CNN
      • 3.2.2 Fast R-CNN
      • 3.2.3 Faster R-CNN
      • 3.2.4 YOLO系列

前言

本文是自己在读《深度学习与图像识别原理与实践 作者:魏溪含 涂铭》这本书时的笔记,其中记录了自己对各个模块的理解,并梳理了深度学习的发展历程,包括从传统的图像分类算法、到机器学习分类以及深度学习方法的整个过程,总路线如下:
代表性的传统图像分类(非重点)→ 人工神经网络分类 → 卷积神经网络分类(重点)→ 目标检测(单目标的分类+定位)→ 目标检测(多目标的分类+定位)→ 语义分割(像素级分类)。

目前已理清了各网络之间的过度关系及脉络,并用通俗的话说明了各个结构诞生的原因以及特点(比如从这个网络怎么就产生出另一个网络的,作者为何要这样设计结构等等);

1. 常见深度学习框架

(1)Tensorflow: Google 推出的框架,支持python和c++借口,基于Tensorflow的模型便于部署在各种服务器和移动设备之上
(2)Keras: 是一个高层网络API,纯Python编写;它最大的特点是对Tensorflow及Theano的后端进行了层层的 封装,使得对用户不可见,提供便利的接口;但是会使得程序缓慢,获取底层数据较难,不是太灵活。
(3)PyTorch:Pytorch是一个python软件包,最大的优点就是它的图是动态的,利于扩展其内部功能。

pip命令可以在任何环境安装Python包,而conda仅在conda环境中安装 任何语言包(包括Python及第三方包)

2. 图像分类算法

2.1 传统类

K近邻算法:核心就2点,对待分类的目标X(下图绿色),找最近的K个邻居中,把X预测为占比最高的那一个类别。

—————————————————————————————————————————————————
图片来源:https://blog.csdn.net/codedz/article/details/108862498?utm_medium=distribute.pc_feed_404.none-task-blog-2defaultBlogCommendFromBaiduRate-3-108862498-blog-null.pc_404_mixedpudn&depth_1-utm_source=distribute.pc_feed_404.none-task-blog-2defaultBlogCommendFromBaiduRate-3-108862498-blog-null.pc_404_mixedpud

2.2 机器学习

首先基础知识:线性回归 和 逻辑回归 以及对应的梯度下降优化算法
(1)线性回归

目标函数: y = θ 0 x + θ 1 y=θ_0x+θ_1 y=θ0x+θ1 … 损失函数: J ( θ ) = ( 1 2 n ) ∑ i n ( y − y p r e ) 2 J(θ)=(\frac{1}{2n})\sum_i^n(y-y_{pre})^2 J(θ)=(2n1)in(yypre)2

(2)逻辑回归(sigmoid):

目标函数: y = 1 1 + e θ ⋅ x y = \frac{1}{1+e^{θ\cdot{x}}} y=1+eθx1… 损失函数: J ( θ ) = − y l o g p p r e − ( 1 − y ) l o g ( 1 − p p r e ) J(θ)=-ylogp_{pre}-(1-y)log(1-p_{pre}) J(θ)=ylogppre(1y)log(1ppre)

(3)梯度下降算法

先给各 θ θ θ赋初值,然后,公式: θ = θ − α ⋅ d J ( θ ) d θ θ = θ-α\cdot\frac{d_{J(θ)}}{d_θ} θ=θαdθdJ(θ)

因为要最小化代价函数 J ( θ ) J(θ) J(θ),所以把它看作关于θ的函数、并对θ求导,用θ逐渐减去一个较小的值( α d J ( θ ) d θ α\frac{d_{J(θ)}}{d_θ} αdθdJ(θ)),使得θ到达 J ( θ ) J(θ) J(θ)取最小值的点就行了;此时,斜率 d J ( θ ) d θ \frac{d_{J(θ)}}{d_θ} dθdJ(θ)等于0,也即是说θ不变而收敛。

2.2.1 人工神经网络(神经元)

在这里插入图片描述

实际上人工神经网络模拟的就是线性(或非线性)回归的映射过程: Y = f ( X ) Y = f(X) Y=f(X),对应在图像分类上就是,X为图像,Y为输出的类别概率。其中, x 1 , x 2 . . . , x n x_1,x_2...,x_n x1,x2...,xn就是图像像素点值,网络中连接线上的权重w对应参数θ。因此, y = x 1 ⋅ w 1 + x 2 ⋅ w 2 + . . . + x n ⋅ w n y = x_1\cdot w_1+x_2\cdot w_2 + ...+x_n\cdot w_n y=x1w1+x2w2+...+xnwn,梯度下降时就是将权重w调整到最佳,使得网络的模拟效果最好。

1、数据在神经网络中的工作流程(前向传播)总结就是:数据输入、加权求和、激活函数、分类输出。
(1)数据输入:略
(2)加权求和:简单来说就是前后全连接层之间的传递, 即 h ( X n ) m = W m × n ⋅ X n h(X_{n})_m = W_{m×n}\cdot X_n h(Xn)m=Wm×nXn,其中 W m × n W_{m×n} Wm×n是参数矩阵,m×n等于前后层之间的连接线条数; X n X_n Xn为n维列向量。
(3)激活函数:为何要用激活函数?(好像说是实际生活中存在线性不可分的问题)用非线性激活函数对隐藏层的每个节点值进行函数激活,以此改变网络的线性性,就可以让神经网络模拟非线性的函数(即 Y = f ( X ) Y = f(X) Y=f(X) f f f变成非线性的),从而实现非线性分类,增强网路的表现能力。那为何又非得要用非线性函数呢?(书中说是:加了线性函数之后,整个网络模拟的仍然还是线性过程,处理不了非线性分类的问题。下面例子说明),几个常见的非线性激活函数:Sigmoid(二分类激活)、Tanh、ReLU、Softmax(多分类激活)。


      S i g m o i d = 1 1 + e − z \space \space \space \space \space {Sigmoid = \frac{1}{1+e^{-z}}}      Sigmoid=1+ez1        T a n h = e x − e − x e x + e − x \space \space \space \space \space \space Tanh = \frac{e^x-e^{-x}}{e^x+e^{-x}}       Tanh=ex+exexex        R e L U = m a x ( 0 , x ) \space \space \space \space \space \space ReLU = max(0,x)       ReLU=max(0,x)        S o f t m a x = e i V ∑ e i V \space \space \space \space \space \space Softmax=\frac{e^V_i}{\sum{e^V_i}}       Softmax=eiVeiV


那么激活的过程,就是将加权求和的值代入上述中的函数,使得整个网络模拟的函数变成非线性性的、以提高网络表现力。这里以Sigmoid举例,将上述 h ( X n ) m h(X_{n})_m h(Xn)m等式代入后 得到激活: A ( X ) = 1 1 + e − W m × n ⋅ X n {A(X)= \frac{1}{1+e^{-W_{m×n}\cdot X_n}}} A(X)=1+eWm×nXn1,A(X)其实已经是关于自变量X的一个非线性函数了,那如果改用线性函数( f ( x ) = k x + b f(x) = kx+b f(x)=kx+b)来激活会怎样呢?同样代入 h ( X n ) m h(X_{n})_m h(Xn)m进行激活后: A ( X ) = k ⋅ W m × n ⋅ X n + b {A(X) = k\cdot W_{m×n}\cdot X_n +b} A(X)=kWm×nXn+b,这实际上还是X的线性函数,神经网络模拟的仍然是线性函数,这就不能进行非线性分类。

2、网络的优化过程,即参数的更新过程(反向传播):计算损失、求梯度后 用梯度下降更新参数。
(1)计算损失:当然是根据前向传播得到的分类结果,利用对应的损失函数来计算损失。常见损失函数有:

均方误差 L o s s = 1 N ∑ i n ( y − y p r e ) 2 均方误差Loss =\frac{1}{N}\sum_i^n(y-y_{pre})^2 均方误差Loss=N1in(yypre)2       交叉熵损失 L o s s = − ∑ i c ( y i l o g   y p r e ) \space\space\space\space\space\space 交叉熵损失Loss=-\sum_i^c(y_ilog\space y_{pre})       交叉熵损失Loss=ic(yilog ypre)

(2)梯度下降:利用上述梯度下降算法对上述Loss求关于参数的梯度(导数),并逐步更新参数即可。


3、因此,神经网络的整个训练过程就是: 前向传播 + 后向传播。流程如下:

for epoch in epoches:	 # epoch: 整个数据集在网络中跑一次
	for iteration in iterations:  # iteration: 1个iteration等于使用batch_size的数据在网络中训练1次
		# 对于每个batch_size的数据 进行的训练过程如下
		# 1.前向传播
		数据输入
		加权求和并激活
		分类输出(概率)
		# 2.后向传播
		计算损失
		梯度下降
		更新参数
	参数收敛
4.、不可避免的,训练神经网络通常会遇到过拟合与欠拟合的问题,这里记录下当遇到时的解决方法:

(1)过拟合:就是网络模型过分的模拟了训练数据集,使得在测试集上表现并不好,导致泛化性能差。常用的解决方法如下:

正则化惩罚:在损失函数加上一个惩罚项对复杂的模型进行惩罚,即强制让模型的参数值尽可能小,惩罚系数越大惩罚越厉害。
数据增强:就是增大数据集,让模型能够拟合更多的数据(因为数据集太少,对于复杂的网络来说,很轻松就学完东西了)
Dropout(抛弃):就是让网络中的神经元以一定的概率不参与前向和后向传播的计算,类似于去掉部分神经元从而减小网络的复杂度,这样网络可以适当丢掉非必要特征的学习,仅学习到少部分主要特征就行了,如此还能增强网络的适应性(推荐链接:Dropout详解)

(2)欠拟合:网络没学到东西,在训练数据集上的表现都很差,更别提在测试集上了。 解决方法:(待定)

2.2.2 卷积神经网络

卷积神经网络(CNN)是一种深度前馈神经网络,最核心的一个部分组合是(卷积层,激活层,池化层),当然还有其他的结构,比如批规范化层(BatchNorm:加速收敛和提高训练稳定性的);目前,它在图像分类、图像检索、目标检测、目标分割、视频分类、姿态估计等图像相关领域已经有许多成功的应用;常见的CNN网路有:AlexNet(2012)、VGGNet(2014)、GoogleNet(2014)、ResNet(2015)、SENet(2017),依次了解这些网络的结构,能够摸透这些作者设计网络时的思路,也给自己点经验。

CNN与人工神经网络这两者其实在原理上很类似,可以说异曲同工;人工神经网络的输入是以向量的形式,其参数在神经元的全连接上,而CNN以图像(二维矩阵)作为输入,参数在卷积核上;比较而言,两者在网络里传递都是加权求和再激活,只不过CNN以矩阵的形式保留了图像的空间特征。

最后附上,推荐阅读:
CNN最直观的理解链接

1、AlexNet网络

CNN网络开始火热估计就是从AlexNet开始的(LeNet开山),AlexNet是Hinton在2012年和他的学生设计的,该模型拿到了ImageNet举办的图片分类和检测竞赛的冠军从而掀起了一波深度学习的热潮。此后,很多的优秀的神经网络结构都是从这个比赛中诞生的。AlexNet是一个8层的网络结构,如下:

在这里插入图片描述

结构超级简单,就5个卷积层+3个全连接层的网络,与人工神经网络很相似,从这以后,很多CNN都是在这之上 针对不同的问题进行结构上的改进;至于作者这样设计的理由,我也不晓得。

2、VGGNet

2014年,VGGNet针对AlexNet网络性能不佳的问题,将网络结构加得更深以提升性能(作者怎么想到要增加网络深度来改善性能的呢???【尝试吗】),这算是第一种改进网络的方法吧;整体上相比AlexNet的特点就是:把卷积核减小,卷积数增多,网络深度更深,性能更好(因为更深的网络结构会学到更复杂的非线性关系【估计是激活函数叠得更多了】)。

在这里插入图片描述
3、GoogleNet

2014年,GoogleNet最初的想法就很简单,要想更好的预测效果,那我不仅增加网络的深度,我还增加其宽度(加宽度有什么好处吗?),这样性能会不会更加好呢,由此提出了GoogleNet最基本的单元Inception结构:

在这里插入图片描述

事实证明:第一,在更深的线性网络结构中,卷积核尺寸固定、尺度单一,对含有不同尺度目标的图像泛化能力就不行(目标小那么小卷积核能提取更有效的特征图,目标大,反之)。第二,网络深度越深,梯度容易消失,致使难以训练。对此,我增加网络的宽度(Inception结构),能利用各种卷积核提取到图像不同尺度的特征,得到更加丰富的特征信息,分类判断时也就更加准确了,所以适当增加深度和宽度能提升网络的性能。(这里可以发现,后续的特征金字塔、跳连接结构好像也是提取多尺度信息)

4、ResNet

2015年,何凯明提出了高达152层的Resnet(为何能这么深?),并赢得了当年ILSVRC的冠军,同时也使得CNN有了真正的“深度”,因为从前面的几个网络可看出,CNN想要获得好的性能,就需要网络更深,而实际操作是网络太深 存在梯度消失 所以又不能让它太深【由于梯度是小于1的 梯度根据链式法则反向传播时(乘法)会逐渐趋于0的 梯度消失就没法训练了】,因此,对于这样一个尴尬的局面,ResNet结构提出了输出层为: F i + 1 ( X ) = F i ( X ) + X F_{i+1}(X) = F_{i}(X) + X Fi+1(X)=Fi(X)+X

在这里插入图片描述
F(X)加个X之后,在求导时有个1,就不存在梯度消失了。

5、其他CNN结构

后续的结构: 什么Wide Resnet、ReseNeXt、DenseNet、包括现在都很流行的CNN结构 等等都是在前面的网络结构上做了或多或少的改变得来的,但万变不离其宗,基本上都是前面4个的变种或结合体,这里不再介绍了。

3. 目标检测算法

前面讲的各种CNN结构都是在卷积层之后加几个全连接层之后输出类别,换句话说,什么 AlexNet、ResNet结构都只是停留在分类的层次,于是就有人想了,利用CNN确定了目标的类别,那我能不能更进一步确定目标的位置呢???那目标检测做的就是这个事——我不仅要分类出图中目标是什么,而且还要确定目标在哪里,即是说分类+定位,所以卷积神经网络就从处理的任务上逐渐增多并发展到目标检测领域,其中,这个过度阶段就是→单目标的分类+定位。

3.1 分类+定位(单目标)

对于图中只有单目标的情况,分类问题这里就不赘述了。
定位问题需要模型返回目标所在位置的外界边框(x, y, w, h),如何来实现呢?最初的做法是:
(1)首先,还是训练一个分类网络(如: VGGNet, ResNet),先满足分类的需求。
(2)在分类网络的最后一个卷积层上加一个“回归头(regression head)”用于预测边框,也就是说将定位看作一个回归问题,这里输出的就是4个边框参数值(x, y, w, h)。

在这里插入图片描述

3.2 分类+定位(多目标,目标检测)

从3.1可知,单个目标的定位比较容易,直接将网络的“regression head”设置4个固定的输出单元,然后输出目标位置的4个参数即可,但实际是一张图像中往往有很多目标且数量不确定时,由于不知道预测图片中到底有多少个目标出现,因此就没法设置固定个数的输出了。那怎么办呢?

当时的研究者想到最直接的办法就是滑动窗口,即 设计大量不同尺度和长宽比的“滑窗”在图像上滑动,每滑动一次不就可以确定图像的一小块了嘛,把这一小块作为单目标的图像输入到3.1章中的网络中进行分类和定位,这样就转化为单目标的分类和定位,也就不用考虑多目标怎么输出的问题了(这个思想不就是“分而治之”吗,其实很多算法的提出都是大问题转小问题,分而治之);但很明显的缺点就是滑窗的尺寸、大小、位置的不同,将导致滑窗多、计算量very巨大!!!虽然这方法性能较差,但差不要紧,重要的是有方法了(开端),于是,对于这个问题学者们做了很多研究,并出现了很多的目标检测算法。

3.2.1 R-CNN

有了上面初步的解决方法,有研究者就着手去实现了,这不2014,Ross Girshick等在CVPR上发表了目标检测算法RCNN;R-CNN的全称是Region-CNN,是第一个成功将深度学习应用到目标检测上的算法(堪称开山之作),采用的思路其实就是分而治之。R-CNN基于卷积神经网络(CNN),线性回归,和支持向量机(SVM)等的算法。整体流程如下:
1、Selective search(SS)算法 找出大约2000个包含潜在目标的候选框(不同尺寸、位置、比例),SS算法是相对滑动窗口的改进吧
2、CNN特征提取每个候选框的特征(AlexNet)
3、将特征送入SVM进行分类
4、将特征送入线性回归模型预测边框(重点理解如何实现定位的

在这里插入图片描述
每一步具体做法:

1、SS算法寻找候选框

当我们输入一张图片时,我们要搜索出所有可能是物体的区域,这个采用的方法是传统文献的算法:《search for object recognition》,通过这个算法我们搜索出2000个候选框(相比于滑动窗口效率高点吧)。然后从上面的总流程图Input Image可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形候选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小,然后挨个送入CNN中提取特征。
在这里插入图片描述

2、CNN特征提取

有了每个候选框,原本可以直接用数据集中图片的每个候选框作为Alexnet(5层卷积+3层全连接)的输入并进行训练,等AlexNet训练好之后,就可以对每个候选框进行分类,然后在5层卷积之后加一个“Regression head”用于输出每个候选框的bbox就完成了目标检测了。那事实上真的就这样简单吗? 答案当然是不;
作者的做法是:将完整的AlexNet(包括3个全连接层)在ImageNet数据集上进行预训练得到比较好的权重,然后就用预训练好的权重及AlexNet(同样含3个全连接层)来对候选框进行有监督的训练(提到训练,就需要对每个候选框打标签,IOU>0.5的作为前景目标,反之作为背景),实质上就是对权重做微调,这样就能得到更为准确的特征;然后,作者并没有直接用全连接层Softmax进行分类,而是将第二个全连接层输出的特征向量(4096维),用于训练一个SVM二分类器进行的分类,原因是因为候选框基本上与GT不重合,甚至相差很大,用Softmax对这样的候选框分类会使得结果不准确,所以用SVM分类比Softmax精度更高(但感觉这样忒麻烦了呀)。

因此, 简述以上步骤就是,先用ImageNet数据集预训练AlexNet网络,然后把数据集中图片的候选框打标签,在标签的监督下,把候选框输入到Alexnet进行训练, 用SGD微调权重并得到准确的特征提取模型;最后去掉最后一个全连接层,将第二个全连接层的特征向量用于训练SVM做分类,将最后一个卷积层的特征向量用于线性回归模型做定位(重点)。
在这里插入图片描述

3、SVM分类

将2000个候选框经过AlexNet(5卷积+2全连接)后得到2000个4096维向量(2000×4096),然后对每一个类别训练一个SVM分类器(4096维向量),用于判断是否属于某类别;假如有20个类别,需要训练20个分类器,然后将每个候选框向量输入到20个分类器判断是哪个类别,那么2000个就是:矩阵(2000, 4096)×(4096, 20) = (2000, 20);矩阵(2000, 20)的每一行就是每个向量对20个类别的分类结果。
在这里插入图片描述

4、边框回归预测

SS算法生成的候选框本身包含了边框信息(x, y, w, h),但因为预先生成的候选框和真实目标可能并不是很重合,所以对每个候选框分类后,还需要进行微调修正边框,使其框得更准确,如果分类后直接就用原始生成的候选框作为定位的结果,那边框将非常不准确。
那如何进行的修正呢?实际上就是在Alexnet的第5个卷积层(4096维向量 V 5 V_5 V5)后面增加了个回归模型【就是几个全连接层】,用于输出候选框相对真实框(Ground Truth)的偏移量。
比如:假设W为回归模型的权重, V 5 V_5 V5为第5卷积层得到的特征向量,边框回归要做的就是要建立一个线性映射: d e t a ( P ) = W ⋅ V 5 deta(P) = W\cdot V_5 deta(P)=WV5,而这个 d e t a ( P ) deta(P) deta(P)就是预测出来的相对于真实框(GT)的偏移量,若候选框的边框信息为 P = ( P x , P y , P w , P h ) P =(P_x, P_y, P_w, P_h) P=(Px,Py,Pw,Ph) ,那么在P的基础上加上偏移量 d e t a ( P ) deta(P) deta(P)就是该模型修正的框 G ^ \hat G G^了。 具体如下图(来自于B站同济子豪兄):

在这里插入图片描述

那么在训练时如何使修正的框 G ^ \hat G G^更准确呢?我们最希望的就是 G ^ \hat G G^与真实框( G T = ( G x , G y , G w , G h ) GT=(G_x, G_y, G_w, G_h) GT=(Gx,Gy,Gw,Gh))尽可能的一样,要一样,这就需要损失函数做梯度下降了,具体如下图:

在这里插入图片描述
在这里插入图片描述

只要最小化这个Loss就能更新权重W,使得 输出的偏移量 d e t a ( P ) deta(P) deta(P)加上P更加接近真实框(GT)了。

由于对于每一个候选框经过回归模型之后,都进行修正中心坐标 ( x , y ) (x,y) (x,y),以及缩放宽高 ( w , h ) (w,h) (w,h),使得候选框更接近真实目标框,那么大量与原图中物体IOU>0.5的候选框都将输出为相对准确的边框,这就使得整个网络对于单张图像的当个目标会输出很多的检测框,所以就需要用非极大值抑制算法(NMS)筛选最优的框作为检测结果。

5、总结一下RCNN

优点:目标检测领域的开创之作
缺点:
(1)SS算法产生候选框有点耗时——约2s
(2)缩放候选框也要操作很久——约2s
(3)单张图片要做CNN约2000次——约6s
(4)并非端到端的网络,每个模块都是独立的,一个模块有问题整体就有问题,且每个模块需要单独训练。

3.2.2 Fast R-CNN

Fast RCNN, “人”如其名,它是较快速的RCNN,主要是针对RCNN 速度慢、结构繁琐、以及非端到端等问题进行的改进版本。那么Fast RCNN快速在哪里,怎么改进的,框架结构又是怎样的?我们逐一来看。

在这里插入图片描述

首先,Fast RCNN的框架结构如上图所示,它是将一张图片完整地输入到卷积网络中(CNN)去提取特征,并得到较大的特征图(Featur map),【ps:这里不像RCNN要把2000个候选框抠出来分别送入到CNN网络中去提特征】,然后,还是用Selective Search算法生成候选框(ROI),把这些候选框映射到Feature map上,从而得到各个候选框的特征图;【这个映射的过程就不需要每个候选框都经过CNN做卷积运算了,大大减少了运算量】最后,用ROI pooling把候选特征图池化到固定大小送入两个全连接层分支,分别进行Softmax分类和bbox回归,而分类和回归是需要标签的,这里还是在原图上求IOU得到每个候选框的标签。

其实Fast RCNN结构整体上与RCNN很相似,主要的思想并没有改变,仍然是基于候选框的算法,不同的地方就两点:
(1)将特征提取、分类、回归这三个结构结合在一起了,实现一个端到端的结构,也更便于训练了。
(2)将整张图片送入CNN提取特征,而不用把每个候选区域抠出来都送入CNN做计算了,提升了速度

虽说做了改进,但还是存在一些问题,比如,还是需要用SS算法在原图上寻找候选框,得到这些框的位置,然后依照卷积的方式映射到Feature map上去,虽说你不需要把每个候选框输入CNN提取特征了,但SS算法还是挺耗时的。

3.2.3 Faster R-CNN

Faster RCNN 也是在 Fast RCNN基础上改进来的,它是比Fast RCNN更快的RCNN,结构上与Fast RCNN没有区别,就只针对SS算法比较耗时这一点,进行了改进。它的结构如下:
在这里插入图片描述
可以看到,这个结构仅仅是在Fast RCNN的基础上加了一个RPN网络,只要这个RPN网络弄懂了,那么Faster RCNN也就懂了。这个RPN是干嘛的呢?说白了,它的作用和Selective search算法(SS)的功能一样,就是产生候选框的,只不过RPN比起SS算法更先进、速度更快罢了(为什么它很快呢?)。

RPN结构: 在RPN之前还是用AlexNet/VGGNet等卷积结构提取特征图Feature map,RPN就需要在这个特征图上“做文章”,也就是产生候选框,原文中叫ancher(锚框);产生的方式为:在Feature map的每个特征点上滑动并产生9个不同尺度(大小,长宽比)的ancher,然后把这些ancher根据缩放关系映射回输入图像(与Fast RCNN相反的),映射回去的目的,就是因为要得到这些ancher的标签啊,也就是通过与Ground Truth求交并比(正(1):IOU>0.7,负(0):IOU<0.3,其他丢弃),,同时也得到偏移量标签,有了标签,就把这些特征图上的anchor(约2万个)分别丢入RPN进行训练【2w太多了,每张图像实际参与训练的只有正负比为1:1的256个ancher,参照:Faster RCNN超详细】,最后输出每个ancher的概率并判断是属于前景目标还是背景(前景:p>0.5,背景:p<0.5),同时也预测出每个ancher相对Ground Truth的偏移量,用梯度下降算法不断优化网络的参数权重,使得预测更准。等RPN训练好了,测试图像的2万个ancher全输进去,分别判断是属于前景和背景,然后提取出proposals(边框已修正),针对前景目标的proposals,剔除尺寸特小的、把超出边界的限定边界、重叠的合并(NMS),最后得到约2000个前景proposals(对应上了SS算法),然后将它们映射回Feature map、并抠出来池化到固定尺寸进行Fast RCNN的精细预测和回归。
疑问1:根据RPN预测的偏移量,如何对边框进行修正,在原图上重新画框?】
疑问2:最后Fast RCNN的精细预测的标签(类别和边框),是RPN修正后的,还是仍然为生成ancher时的标签?】
疑问3:用RPN代替SS算法为什么就更快了?对每张测试图像还是输入2万个ancher到RPN进行判断呢,这计算量不更大更耗时吗?难道是因为做卷积运算所以快些?】
疑问4:Faster RCNN是一个由粗到细的网络——先判定是目标再识别是什么目标,那是不是由于这个由粗到细的过程,使得各结构的参数分工合作、而不是一个参数同时管各个工作,进而使得Faster RCNN精度更高呢?】

3.2.4 YOLO系列

由于R-CNN系列的目标检测算法在获取粗略的Proposals时,需要预先生成很多的锚框,这些锚框具有很多的重复区域,导致了很多的重复计算;那么YOLO就改变了Proposals的思路,而是将一张图像划分为S × S个小格子,然后对每个小格子做分类+定位,最后将结果合并即可。这些小格子是并列的,没有重复的区域,这样在卷积、计算的时候可以减少大量的重复工作,提高模型效率,与此同时,因为其划分的力度比较粗,所以精度上比Faster RCNN要略差。【细节可看YOLOv3白话解读: YOLOV3详解

——————————————————————————————————————后续更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

近端串扰NEXT和远端串扰的ADS仿真

目录 近端串扰NEXT和远端串扰FEXT 串扰仿真原理图 NEXT特征 减少NEXT的措施 FEXT特征 减少FEXT的措施 本文记录近阶段对近端串扰和远端串扰概念的理解。 经验法则&#xff1a;最大可容许串扰大约是信号摆幅的5%。 近端串扰NEXT和远端串扰FEXT 静态线上的靠近驱动源的一端…

CTF中常用的http知识点总结

目录 前提知识 请求头大全 响应头大全 请求方法大全 常见考点 从某ip访问 从某网站跳转 身份为admin才可以访问 从某某浏览器访问 靶场练习 [极客大挑战 2019]Http Become A Member 前提知识 请求头大全 Header解释示例Accept指定客户端可以接收的内容类型Accep…

逆向分析资料汇总

商务合作 2023年招聘 ​安全业务和软件业务(商务合作) 移动端漏洞或隐私合规检测 APP常见漏洞扫描器 ​移动端APP隐私合规检测 2023年逆向分析资料汇总 移动端漏洞/安全检测与隐私合规解决方案 Frida逆向分析基础 APP基于Frida脱壳 frida hook so导出或未导出函数的方法…

【写作能力提升】写作小白需要避免的五个写作误区和灵魂五问

“ 【写作能力提升】系列文章&#xff1a; 为什么建议你一定要学会写作? 手把手教你快速搞定4个职场写作场景 5种搭建⽂章架构的⽅法”免费赠送! ”一、前言 Hello&#xff0c;我是小木箱&#xff0c;今天主要分享的内容是: 写作小白需要避免的五个写作误区和灵魂五问。 二、 …

E. The Human Equation(前缀和与差分数组)

嘤&#xff0c;总算过了 题目大意&#xff1a;可以从一个序列中按照顺序&#xff08;可间断&#xff09;选出一堆数&#xff0c;选出的这些数可以做以下操作&#xff1a; 奇数位置&#xff0b;1&#xff0b;1&#xff0b;1&#xff0c;偶数位置−1- 1−1偶数位置&#xff0b;1…

微信小程序项目实例——食堂吃哪个

微信小程序项目实例——食堂吃哪个 文章目录微信小程序项目实例——食堂吃哪个一、项目展示二、操作流程和核心代码三、效果展示文末项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 这是一款娱乐性的小程序 目的是为了解决大学生吃饭的选择困难症 用户可以选择不…

51单片机的特殊功能寄存器(SFR)

阅读前提醒&#xff1a; 文中提到的8051指的是8051微控制器&#xff0c;即51单片机 在上一篇文章51单片机的存储结构中&#xff0c;提到8051微控制器的RAM被划分为通用寄存器、按位寻址寄存器、寄存器组、以及特殊功能寄存器。 这里讲一下特殊功能寄存器&#xff08;SFR&…

五金制造业ERP如何解决企业销售管理难题?

销售管理是五金制造企业管理中非常重要的一个环节&#xff0c;它决定着企业发展的提速和效益的提升。那么企业要如何才能做好销售管理呢&#xff1f;在这里五金制造业ERP系统就起到了重要作用。五金制造业常见的销售管理难题及解决方法&#xff1a;销售插单改单严重&#xff0c…

在不同环境下 Docker 的安装部署

本篇内容主要介绍了&#xff1a;Docker&#xff1a;不同环境下的安装部署&#xff0c;包括&#xff0c;Docker 在 Centos7 下的安装、Docker 在 MacOS 下的安装、Docker 在 Windows 下的安装、以及 Docker 服务相关基础命令&#xff01; 文章目录一、Docker 在 Centos7 下的安装…

使用Redhat OpenStack发放云主机

云管理员操作创建项目登录到OpenStack主界面&#xff0c;使用admin账户登录&#xff0c;创建项目虚拟内核&#xff1a;表明此项目可以使用的vCPU的数量实例&#xff1a;表明该项目最多可以运行的虚拟机数量注入的文件&#xff1a;表明最多可以向此数据中心存多少文件已注入文件…

react基础Day03-生命周期render props模式高阶组件原理揭秘

组件生命周期&#xff08;★★★&#xff09; 目标 说出组件生命周期对应的钩子函数钩子函数调用的时机 概述 意义&#xff1a;组件的生命周期有助于理解组件的运行方式&#xff0c;完成更复杂的组件功能、分析组件错误原因等 组件的生命周期&#xff1a; 组件从被创建到挂…

JVM学习(二):JVM监控及诊断工具-命令行篇

一、概述性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&#xff0c;在用户体验至上的今天&#xff0c;解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一&#xff0c;其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因…

十二.自定义类型:结构体、联合、枚举

目录 一.结构体 1.结构体类型的基础知识 &#xff08;1&#xff09;结构的声明 &#xff08;2&#xff09;匿名结构体 &#xff08;3&#xff09;结构体变量的定义和初始化 &#xff08;4&#xff09;结构的自引用 &#xff08;5&#xff09;结构体传参 2.结构体内存对齐…

227. 基本计算器 II

227. 基本计算器 II题目算法设计&#xff1a;栈扩展&#xff1a;后缀表达式题目 传送门&#xff1a;https://leetcode.cn/problems/basic-calculator-ii/submissions/ 算法设计&#xff1a;栈 一个功能完备的计算器功能&#xff0c;有很多功能&#xff0c;我们需要从最简单的…

【CAD .NET】第一课 开发自己的CAD软件

开发自己的CAD软件(解析库私信我buy) 介绍 CAD .NET 为在 .NET 环境下开发解决方案的库。它支持 AutoCAD DWG、DXF、PLT 和其他 CAD 格式。它支持 AutoCAD DWG, DXF, PLT 和其他 CAD 格式。 该库可用于广泛领域: 处理所有项目阶段的工业图纸 监测和远程控制程序 数控(C…

ReactNative0.71正式版发布,Ts作为首要开发语言

时隔近4个月的时间&#xff0c;ReactNative带来了0.71版本的更新&#xff0c;这速度对比隔壁Flutter不得不说是真的有的慢。 这个版本的更新的内容还是比较重磅和突破性的&#xff0c;主要体现在如下几点&#xff1a; 编程语法默认改为TypeScript使用Flexbox Gap使布局更加简…

AlmaLinux 9部署JumpServer

JumpServer简介 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。 JumpServer 使用 Python 开发&#xff0c;配备了业界领先的 Web Terminal 方案&#xff0c;交互界面美观、用户体验好。 JumpServer 采纳分布式架构&#xff0c;支持多…

【C++11】—— 类的新功能

目录 一、移动构造和移动赋值的特点 二、类成员变量初始化 三、强制生成默认函数的关键字default 四、禁止生成默认函数的关键字delete 五、继承和多态中的fifinal与override关键字 一、移动构造和移动赋值的特点 默认成员函数 原来C类中&#xff0c;有6个默认成员函数&a…

Yolov8实例分割Tensorrt部署实战

目录 0 引言 1 生成onnx模型 2 onnx转为tensorrt的engine模型 3 Tensorrt推理 3.1 yolov8n-seg分割结果 3.2 yolov8s-seg分割结果 3.3 yolov8m-seg分割结果 3.4 yolov8l-seg分割结果 3.5 yolov8x-seg分割结果 0 引言 ultralytics在github发布了yolov8模型&#xff0c;…

C语言 atoi 函数解析

文章目录前言atoi函数的介绍atoi函数的使用atoi函数的自我实现写在最后前言 对于atoi函数大家可能会有些陌生&#xff0c;不过当你选择并阅读到这里时&#xff0c;请往下阅读&#xff0c;我相信你能对atoi函数熟悉该函数的头文件为 <stdlib.h> 或 <cstdlib> atoi函…