开始
本文是自己在读《深度学习与图像识别原理与实践 作者:魏溪含 涂铭》这本书时的笔记,其中记录了自己对各个模块的理解,并梳理了深度学习的发展历程,包括从传统的图像分类算法、到机器学习分类以及深度学习方法的整个过程,总路线如下:
代表性的传统图像分类(非重点)→ 人工神经网络分类 → 卷积神经网络分类(重点)→ 目标检测(单目标的分类+定位)→ 目标检测(多目标的分类+定位)→ 语义分割(像素级分类)。
目前已理清了各网络之间的过度关系及脉络,并用通俗的话说明了各个结构诞生的原因以及特点(比如从这个网络怎么就产生出另一个网络的,作者为何要这样设计结构等等);
(1)Tensorflow: Google 推出的框架,支持python和c++借口,基于Tensorflow的模型便于部署在各种服务器和移动设备之上
(2)Keras: 是一个高层网络API,纯Python编写;它最大的特点是对Tensorflow及Theano的后端进行了层层的 封装,使得对用户不可见,提供便利的接口;但是会使得程序缓慢,获取底层数据较难,不是太灵活。
(3)PyTorch:Pytorch是一个python软件包,最大的优点就是它的图是动态的,利于扩展其内部功能。
pip命令可以在任何环境安装Python包,而conda仅在conda环境中安装 任何语言包(包括Python及第三方包)
—————————————————————————————————————————————————
首先基础知识:线性回归 和 逻辑回归 以及对应的梯度下降优化算法
(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(y−ypre)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−(1−y)log(1−ppre)
(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,也即是说θ不变而收敛。
实际上人工神经网络模拟的就是线性(或非线性)回归的映射过程: 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=x1⋅w1+x2⋅w2+...+xn⋅wn,梯度下降时就是将权重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×n⋅Xn,其中 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+e−z1 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+e−xex−e−x 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+e−Wm×n⋅Xn1,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)=k⋅Wm×n⋅Xn+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=N1∑in(y−ypre)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)欠拟合:网络没学到东西,在训练数据集上的表现都很差,更别提在测试集上了。 解决方法:(待定)
卷积神经网络(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
5、其他CNN结构
后续的结构: 什么Wide Resnet、ReseNeXt、DenseNet、包括现在都很流行的CNN结构 等等都是在前面的网络结构上做了或多或少的改变得来的,但万变不离其宗,基本上都是前面4个的变种或结合体,这里不再介绍了。
对于图中只有单目标的情况,分类问题这里就不赘述了。
定位问题需要模型返回目标所在位置的外界边框(x, y, w, h),如何来实现呢?最初的做法是:
(1)首先,还是训练一个分类网络(如: VGGNet, ResNet),先满足分类的需求。
(2)在分类网络的最后一个卷积层上加一个“回归头(regression head)”用于预测边框,也就是说将定位看作一个回归问题,这里输出的就是4个边框参数值(x, y, w, h)。
从3.1可知,单个目标的定位比较容易,直接将网络的“regression head”设置4个固定的输出单元,然后输出目标位置的4个参数即可,但实际是一张图像中往往有很多目标且数量不确定时,由于不知道预测图片中到底有多少个目标出现,因此就没法设置固定个数的输出了。那怎么办呢?
当时的研究者想到最直接的办法就是滑动窗口,即 设计大量不同尺度和长宽比的“滑窗”在图像上滑动,每滑动一次不就可以确定图像的一小块了嘛,把这一小块作为单目标的图像输入到3.1章中的网络中进行分类和定位,这样就转化为单目标的分类和定位,也就不用考虑多目标怎么输出的问题了(这个思想不就是“分而治之”吗,其实很多算法的提出都是大问题转小问题,分而治之);但很明显的缺点就是滑窗的尺寸、大小、位置的不同,将导致滑窗多、计算量very巨大!!!虽然这方法性能较差,但差不要紧,重要的是有方法了(开端),于是,对于这个问题学者们做了很多研究,并出现了很多的目标检测算法。
有了上面初步的解决方法,有研究者就着手去实现了,这不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)=W⋅V5,而这个 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)并非端到端的网络,每个模块都是独立的,一个模块有问题整体就有问题,且每个模块需要单独训练。
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算法还是挺耗时的。
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精度更高呢?】
由于R-CNN系列的目标检测算法在获取粗略的Proposals时,需要预先生成很多的锚框,这些锚框具有很多的重复区域,导致了很多的重复计算;那么YOLO就改变了Proposals的思路,而是将一张图像划分为S × S个小格子,然后对每个小格子做分类+定位,最后将结果合并即可。这些小格子是并列的,没有重复的区域,这样在卷积、计算的时候可以减少大量的重复工作,提高模型效率,与此同时,因为其划分的力度比较粗,所以精度上比Faster RCNN要略差。【细节可看YOLOv3白话解读: YOLOV3详解】
——————————————————————————————————————后续更新