【目标检测】【深度学习】【Pytorch版本】YOLOV1模子算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV1模子算法详解前言
YOLOV1是由华盛顿大学的Joseph Redmon等人《You Only Look Once:
Unified, Real-Time Object Detection【CVPR-2016】》【论文地点】一文中提出的首个单阶段目标检测模子,核心头脑是将目标检测转化为回归题目求解,并基于一个单独的端到端(end-to-end)网络,利用全卷积神经网络直接从整张原始图像中预测物体的位置和种别,无需生成候选区域,从而大大提高了检测速率。
传统的目标检测方法通常包罗候选区域生成、特性提取、分类和边界框回归等步调,这些步调通常是分开举行的,导致处理速率较慢。随着深度学习技术尤其是卷积神经网络(CNN)的发展,研究人员开始尝试将CNN应用于目标检测任务中。在YOLOv1出现之前,主流的目标检测算法如R-CNN系列接纳了两阶段的方法:起首生成一系列可能包罗物体的候选区域(region proposals),然后对这些候选区域举行分类和边界框回归。这种方法固然精度较高,但计算本钱大、速率慢,由于它们需要对每个候选区域单独处理。
YOLOV1的模子结构
YOLOV1模子的根本执行流程
下图是博主根据原论文提供的YOLOV1模子结构重新绘制的详细结构示意图:
https://i-blog.csdnimg.cn/direct/6183c9b2a05442aabba0174bf108227c.png
根本流程: 将图像reshape成448×448的图像,24个卷积层对输入图像举行特性提取生成一个7×7×1024的特性图,将这个特性图拉平后,第1个全毗连层将卷积得到的分布式特性映射到样本标志空间,把输入图像的全部卷积特性整合到一起,第二个全毗连层将全部神经元得到的卷积特性举行维度转换,最后reshape成7×7×30的特性图,此中包罗了检测框的位置、大小、置信度以及分类条件概率。
YOLO网络借鉴了GoogLeNet,结构简朴,包罗卷积、池化、激活函数以及全毗连层,此中利用了1x1卷积用于多通道信息融合。
YOLOV1模子的网络参数
YOLOV1网络参数: YOLO网络借鉴了GoogLeNet,结构简朴,包罗卷积、池化、激活函数以及全毗连层,此中利用了1x1卷积用于多通道信息融合。除了最后一全毗连层利用了线性激活函数外(可以理解成没有举行任何激活操作),其余卷积层和全毗连层的激活函数为Leaky ReLU。
https://i-blog.csdnimg.cn/direct/ea8866a195ad48ef945893090cd20729.png
YOLOV1模子的训练方式
YOLOV1训练分为两个阶段:
[*]在ImageNet分类数据集上预训练分类模子。网络模子的输入为224x224,前20层卷积层作为模子的特性提取网络,随后利用全局平均池化层举行池化操作,最后利用全毗连层举行1000分类;
[*]将分类模子调整为检测模子。将网络模子的输入调整为448x448,去除全局平均池化层,并新到场4个卷积层和2个全毗连层,最后将模子的输出调整为7×7×30这样的向量大小。
在训练中利用了Dropout与数据加强方法来防止过拟合。
YOLOV1的核心头脑
前向传播阶段
网格单元(grid cell)的概念及其作用
网格单元的划分: YOLOV1模子输出7×7分辨率大小的特性图,标志出输出特性图每个像素在原始图片上的对应区域,即将原始图片划分为7×7个小方格大小的图片区域块,每个区域块大小为64×64。
https://i-blog.csdnimg.cn/direct/28733a208de240f191094c1e0c7b05a9.png
将原始图片划分为7×7个小方格并不是真正的将图片划分为7×7块小图像区域,只不过是输出的特性图的分辨率大小为7×7,此中每个1×1的特性像素都有对应的图像区域。
网格单元的作用: 每个grid cell预测多个边界框(YOLOV1中选择2个),预测结果包罗俩部门信息:
[*]边界框的根本信息:每个框固定包罗5个元素,分别为是中央坐标x和y,检测框的宽高w和h以及对应检测框的置信度c;
[*]多种别物体的概率值:类似于图像分类任务,根据现实的任务需求的差别,种别物体个数是不固定,因此YOLOV1最终的输出是5×2+种别物体个数,当前任务的是30=2×5+20。
当前任务的每个grid cell输出的数据维度为30×1,而7×7个方格输出的维度即为7×7×30,查抄框的个数为7×7×2。
注意:这里一个grid cell只能预测一个物体种别,而不是一个检测框预测一个种别,由于俩个检测框通用(绑定)同一个多种别物体的概率值,后续的YOLO版本对其举行了改进。
https://i-blog.csdnimg.cn/direct/fb475efc113d4d91ab73f193c6c331af.png
网格单元边界框位置解析: 赤色区域指定当前grid cell,白点表现当前grid cell左上角坐标(0,0);橙色和浅绿色代表当前grid cell的俩个边界框;橙色点和浅绿色表现这两个边界框的中央坐标,且中央坐标一定在当前grid cell内部;边界框左边和上边的差别颜色的值分别表现对应的边界框的高和宽。
坐标值是颠末归一化后的值(在0-1之间),以左上坐标(0,0)的为坐标起始点参考;同样边界框的宽高也是颠末归一化后的值,表现边界框的宽高相对于原始图像的宽高(448×448)的比值。
https://i-blog.csdnimg.cn/direct/b60fa930850a4c99ba0be04bf579c067.png
网格单元边界框置信度解析: 置信度 C C C用于评估模子预测的边界框内包罗某个对象的可能性以及该边界框的正确性。
C = Pr ( O b j e c t ) × I O U p r e d t r u t h C = \Pr (O{\rm{bject}}) \times IOU_{{\rm{pred}}}^{{\rm{truth}}} C=Pr(Object)×IOUpredtruth
[*]包罗对象的可能性 P r ( O b j e c t ) Pr (O{\rm{bject}}) Pr(Object):指的是模子对于某个边界框内存在特定对象的确信程度,反映了模子认为该边界框确实包罗了某个对象的信心水平,认为在当前边界框内有一个或多个对象存在的概率。这个概率,并非指详细某个种别对象在边界框内的概率,而是任意一个种别对象在边界框内的概率,只要不是配景的;
[*]边界框的正确性 I O U p r e d t r u t h IOU_{{\rm{pred}}}^{{\rm{truth}}} IOUpredtruth:通过计算预测边界框与真实边界框(ground truth)之间的交并比(Intersection over Union, IoU)来衡量的,IoU是介于0到1之间的值,表现两个边界框重叠面积占它们归并面积的比例。值越接近1,说明预测的边界框与真实边界框越吻合。同时在非极大值抑制计算中IOU作为此中的重要指标。
https://i-blog.csdnimg.cn/direct/21d46349f1854fa2a18dbbd7a3b1c795.png
网格单元种别概率值解析: 每个小方格都会输出对应的20个种别中概率最高的种别,输出的概率利用Softmax函数举行映射,维度为20×1。20个种别个数并不是固定的,而是随任务差别而差别,只是当前博文展示的任务种别是20,
https://i-blog.csdnimg.cn/direct/cd14eb2b60974ba4a0def95cdf5f7c60.png
注意:如上图,边界框并不是每个雷同分类的小方格拼接在一起后绘制出的总区域,而是前面提到的每个小方格单独预测的。
网格单元内容总结: 在边界框示意图中,置信度越大,边界框越粗,证明此中存在目标的可能性越大;在概率图中,标志出物体种别概率的最大的类。
https://i-blog.csdnimg.cn/direct/538a2985b06d49c4bfac1af5d4e05ee1.png
到此为止,网格单元(grid cell)的所扮演的脚色以及其作用已经全部讲解完成,下一步则是对网格单元的输出结果举行筛选。
输出结果的后处理过程以及作用
种别置信度筛选: 在有物体的情况下,对应种别的物体的置信度,其公式为:
C i = Pr ( C l a s s i ∣ O b j e c t ) × Pr ( O b j e c t ) × I O U p r e d t r u t h {C_i} = \Pr (Clas{s_i}|O{\rm{bject}}) \times \Pr (O{\rm{bject}}) \times IOU_{{\rm{pred}}}^{{\rm{truth}}} Ci=Pr(Classi∣Object)×Pr(Object)×IOUpredtruth
从公式中不难理解论文作者表达的含义:置信度即表现一种自尊程度,包罗了边界框内有物体的自尊程度、物体归属于某个类型的自尊程度以及边界框将将整个物体包罗进来的自尊程度。下图中框上的数值表现种别置信度的值,可以通过设置种别置信度阈值,剔除一部门置信度低于阈值的边界框。
https://i-blog.csdnimg.cn/direct/2d30ab92e30347c7a6070c459cb4f5a4.png
根据博主的履历,由于种别置信度和置信度的性质和作用相似,因此一样平常不会通过设置种别置信度阈值来筛选合格的边界框,而是直接通过设置置信度阈值就举行筛选,可以省略计算种别置信度这个步调。
非极大值抑制筛选: NMS(Non-Maximum Suppression)主要目的是在检测到的多个重叠边界框中选择最正确的一个作为最终结果,去除多余的重叠框。每个种别的全部边界框之间单独举行相互比较,差别种别边界框之间不会相互比较,而且差别种别间是并行处理的。
https://i-blog.csdnimg.cn/direct/53024ec499994790b019077167fa83df.png
以检测狗为例,NMS算法流程:
[*]得分排序:根据每个边界框的置信度得分对全部框举行排序作为候选列表;
[*]选择最高分:选取得分最高的边界框作为一个确定有效的检测结果,到场到已选列表中成为已选框,并从候选列表中移除它;
[*]抑制操作:计算全部候选框与全部已选框之间的IoU。依次取出删除候选列表中的候选框,和全部已选框举行IoU比较,假设当前候选框与某个已选框的IoU大于设定的阈值,则认为这两个框高度重合,删除得分较低的那个框,保留得分高的框在已选列表中;反之,假设当前候选框与某个已选框的IoU小于设定的阈值,则将候选框到场到已选列表中成为新的已选框。
后处理总结: 全部输出的边界框颠末置信度阈值过滤和NMS过滤后得到最终确定有效的筛选结果。
https://i-blog.csdnimg.cn/direct/e6c67115457245e3b7f62219236bd3e1.png
反向传播阶段
丧失函数: YOLOV1原论文作者提供的丧失函数公式为:
L o s s = λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x i ∧ ) 2 − ( y i − y i ∧ ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w i ∧ ) 2 − ( h i − h i ∧ ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C i ∧ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j ( C i − C i ∧ ) 2 + ∑ i = 0 S 2 1 i j o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p i ∧ ( c ) ) 2 L{\rm{oss}} = {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {{x_i} - \mathop {{x_i}}\limits^ \wedge } \right)}^2} - {{\left( {{y_i} - \mathop {{y_i}}\limits^ \wedge } \right)}^2}} \right] + {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {\sqrt {{w_i}} - \sqrt {\mathop {{w_i}}\limits^ \wedge } } \right)}^2} - {{\left( {\sqrt {{h_i}} - \sqrt {\mathop {{h_i}}\limits^ \wedge } } \right)}^2}} \right] + \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} + {\lambda _{{\rm{noobj}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{noobj}}}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} + \sum\limits_{{\rm{i}} = 0}^{{S^2}} {1_{ij}^{obj}\sum\limits_{c \in classes} {{{\left( {{p_i}\left( c \right) - \mathop {{p_i}}\limits^ \wedge \left( c \right)} \right)}^2}} } Loss=λcoordi=0∑S2j=0∑B1ijobj[(xi−xi∧)2−(yi−yi∧)2]+λcoordi=0∑S2j=0∑B1ijobj (wi −wi∧ )2−(hi −hi∧ )2 +i=0∑S2j=0∑B1ijobj(Ci−Ci∧)2+λnoobji=0∑S2j=0∑B1ijnoobj(Ci−Ci∧)2+i=0∑S21ijobjc∈classes∑(pi(c)−pi∧(c))2
[*] ∑ i = 0 S 2 \sum\limits_{{\rm{i}} = 0}^{{S^2}} {} i=0∑S2表现遍历全部网格单元并举行累加;
[*] ∑ j = 0 B \sum\limits_{{\rm{j}} = 0}^B {} j=0∑B表现遍历全部预测边界框并举行累加;
[*] ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{obj}}}} } i=0∑S2j=0∑B1ijobj表现第 i i i个网格中第 j j j个边界框有对象时为1,否则为0;
[*] ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{noobj}}}} } i=0∑S2j=0∑B1ijnoobj表现第 i i i个网格中第 j j j个边界框没有对象时为1,否则为0;
[*] ∑ i = 0 S 2 1 i j o b j ∑ c ∈ c l a s s e s \sum\limits_{{\rm{i}} = 0}^{{S^2}} {1_{ij}^{obj}\sum\limits_{c \in classes} {} } i=0∑S21ijobjc∈classes∑表现第 i i i个网格中有对象时为1,否则为0;
[*] λ c o o r d {\lambda _{{\rm{coord}}}} λcoord和 λ n o o b j {\lambda _{{\rm{noobj}}}} λnoobj是均衡系数(分别是5和0.5),通常情况下,图片中只有少数几个目标,而绝大部门区域是没有目标的,因此加上均衡系数以制止过渡学习到没有目标的区域。
坐标丧失: 包罗了两个丧失值,一个是边界框中央点坐标丧失,一个是边界框大小丧失。
λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x i ∧ ) 2 − ( y i − y i ∧ ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w i ∧ ) 2 − ( h i − h i ∧ ) 2 ] {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {{x_i} - \mathop {{x_i}}\limits^ \wedge } \right)}^2} - {{\left( {{y_i} - \mathop {{y_i}}\limits^ \wedge } \right)}^2}} \right] + {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {\sqrt {{w_i}} - \sqrt {\mathop {{w_i}}\limits^ \wedge } } \right)}^2} - {{\left( {\sqrt {{h_i}} - \sqrt {\mathop {{h_i}}\limits^ \wedge } } \right)}^2}} \right] λcoordi=0∑S2j=0∑B1ijobj[(xi−xi∧)2−(yi−yi∧)2]+λcoordi=0∑S2j=0∑B1ijobj (wi −wi∧ )2−(hi −hi∧ )2
边界框中央点坐标丧失接纳的是平方差,容易理解的通例操作,不再解释。边界框大小丧失则先对宽 w w w,高 h h h举行开根
号,然后再计算平方差。原因如下图所示,以宽 w w w为例,宽度相差同等的情况下,不开根号计算标注框和预测框的丧失,大目标检测和小目标检测没有任何区别,丧失都是一样的;但在开根计算丧失时,小目标检测的丧失是比大目标检测的丧失大,加强了小目标丧失的影响,抑制了大目标丧失的影响,这种计划更符合现实情况。
举个例子,满分10分和满分100分的俩种评价体系中,9分和8分之间1分的影响,远比90分和89分的之间1分的影响更为突出,更应该关注8分到9分的提升。
https://i-blog.csdnimg.cn/direct/6d6483e923ce428a9db3426199be9100.png
置信度丧失: 当有对象时, P r ( O b j e c t ) = 1 Pr (O{\rm{bject}})=1 Pr(Object)=1,因此置信度的标签值 C i ∧ {\mathop {{C_i}}\limits^ \wedge } Ci∧是预测框和标注框之间的交并比 I o U IoU IoU;当没对象时, P r ( O b j e c t ) = 0 Pr (O{\rm{bject}})=0 Pr(Object)=0,因此标签值 C i ∧ {\mathop {{C_i}}\limits^ \wedge } Ci∧为0。
注意!!!这里并非是有对象时置信度的标签值 C i ∧ = 1 {\mathop {{C_i}}\limits^ \wedge }=1 Ci∧=1。但后续yolo版本会对这里作出了调整,改成了 C i ∧ = 1 {\mathop {{C_i}}\limits^ \wedge }=1 Ci∧=1。
∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C i ∧ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j ( C i − C i ∧ ) 2 \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} + {\lambda _{{\rm{noobj}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{noobj}}}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} i=0∑S2j=0∑B1ijobj(Ci−Ci∧)2+λnoobji=0∑S2j=0∑B1ijnoobj(Ci−Ci∧)2
概率丧失: 全部网格单元中,只让有目标对象的网格单元参与计算。
∑ i = 0 S 2 1 i j o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p i ∧ ( c ) ) 2 \sum\limits_{{\rm{i}} = 0}^{{S^2}} {1_{ij}^{obj}\sum\limits_{c \in classes} {{{\left( {{p_i}\left( c \right) - \mathop {{p_i}}\limits^ \wedge \left( c \right)} \right)}^2}} } i=0∑S21ijobjc∈classes∑(pi(c)−pi∧(c))2
总结
尽可能简朴、详细的介绍了YOLOV1模子的结构,深入讲解了YOLOV1核心头脑。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]