闲话YOLO三部曲

本文介绍了YOLO(You Only Look Once)目标检测算法的发展,从V1到V3的改进,包括预测变量的解释、损失函数、网络结构和训练方法的优化,以及YOLO在自动驾驶等领域的应用。通过对YOLO系列的理解,展现了目标检测领域的创新思维和技术进展。
摘要由CSDN通过智能技术生成
前言

  YOLO最近又出了YOLO-V3,给实时目标检测带来了更强的推力,让我们看下YOLO从V1到V3的变迁,感受下作者在改进上的思路历程。

目标检测

  通常的目标检测,是对图像中的物体识别类型,并指出该物体的位置(center_x, center_y, width, height)。比起普通的图像识别问题,难度明显增大,将物体识别和位置预测混到一起,更为棘手。针对这类问题,出现了许多解法,比如Sliding Windows Detection(1995)、R-CNN(2014)、SSD(Single Shot MultiBox Detector 2015),这些方法各有千秋,YOLO是其中的佼佼者,当然其他方法也很厉害哈。

YOLO-V1

  第一代YOLO(You Only Look Once)是开创性的,将目标检测问题整体视为回归问题,并且在速度上惊艳众人。

预测变量解释

  对这张狗车图,要预测的一共有SxSx(Bx5 + C)个值。


  SxS表示要将图grid的数量,B表示有几个不同形状的Box,5表示每个box需要有center_x, center_y, width, height, confidence五个值要表示当前的box信息,其中confidence表示该box有物体的置信度。C的数量是所要判别类的总数量,C_i表示某个类的判别概率。
意味着,每个grid-cell,都要单独预测B个不同形状的box(指出不同形状下的物体位置,及每个形状位置下存在物体的置信度),每个grid-cell都要对所有物品类型都做出判别概率预测。
   注意1:在YOLO-v1里面,center_x, center_y是相对于grid-box边缘的(偏移比例),width, height是相对于整个图像的(做归一化)。
   注意2:在YOLO-v1里面,不是grid-cell的每个box,都对所有类预测一遍概率。而是当前grid-cell仅预测一遍所有类的判别概率。YOLO-v2就改进了这点。

loss函数

   loss= l o s s =
    1)   λcoordS2i=0Bj=0Iobjij [(xix^i)2+(yiy^i)2 ] λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j   [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2   ]
    2)   + λcoordS2i=0Bj=0Iobjij [(wiw^i)2+(hih^i)2 ] +   λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j   [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2   ]
    3)   + S2i=0Bj=0Iobjij(CiC^i)2 +   ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C ^ i ) 2
    4)   + λnoobjS2i=0Bj=0Inoobjij(CiC^i)2 +   λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j ( C i − C ^ i ) 2
    5)   + S2i=0Iobjicclasses(pi(c)p^i(c))2 +   ∑ i = 0 S 2 I i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2
   i i 表示grid-cell的索引,j表示box的索引, Iobji I i o b j 表示第 i i 个grid-cell存在物体(当实际标注的物体中心在该cell里时,表示这个grid-cell存在物体),Iijobj表示the jth bounding box predictor in cell i is “responsible” for that prediction.
  其中1,2表示grid-cell存在物体时,对中心和长宽做平方差和, λcoord=5 λ c o o r d = 5 λnoobj=0.5 λ n o o b j = 0.5 ,是为了避免无物体时的置信分压制含有物体时的梯度。长宽的开方是为了减小平方差和在大小box上,对长宽偏差的敏感度。3 对含有物体的置信分值误差和则无权重的处理。概率预测的误差项是5,也是仅仅对含有物体的时候做误差的计算。
  这个loss函数集中体现了YOLO将目标检测作为回归问题的特质。
  注意,该loss仅对含有物体的部分做计算。权重 λ λ 和开方都是为对抗将目标检测作为回归问题带来的副作用。
  疑惑,怎么理解 Iobjij I i j o b j ?在当前grid-cell下,有多个box,难道不应该是 BjIobjij[(xijx^ij)2+(yijy^ij)2] ∑ j B I i j o b j [ ( x i j − x ^ i j ) 2 + ( y i j − y ^ i j ) 2 ] 这样的么?然而并不是,这里将多个box做了取最大处理,当前这个grid-cell下,最具有代表性的box,才有资格参与本次loss计算。这里就隐藏这一步操作,判断当前cell内的哪个box更具代表性, argmaxj{IOUtruthpredj} a r g m a x j { I O U p r e d j t r u t h }

网络结构与训练


  网络结构如上,先在ImageNet1000上做分类训练作为 预训练(前20层 + mean-pooling + full-connect),以便能够保证网络对物体的正确特征的提取能力。然后在PASCAL VOC上做目标检测(pre-train前20层 + 4 Conv + 2 full-connect)。Yolo-v1更多借鉴了GoogLeNet的结构(含有大量的Inception结构, 详细见)。
  实际标注的box的长宽用图像的长宽做归一化,所以预测长宽值时范围在[0,1]内;预测中心位置,也是计算偏差比例 tx t x ,从而计算位置 xpred=(txwidth)xcell x p r e d = ( t x ∗ w i d t h ) − x c e l l 。注意,所有ReLU函数都使用Leaky ReLU。
   注意:有没有发现CNN天然对grid-cell分割具有适应性,可以使用stride来调节分割,避免掉了滑动窗口类的方法所需要的多次重复操作,CNN直接一遍计算就有了所有窗口的结果。

YOLO-V2

  第二代YOLO,对Yolo-v1改进得到Yolo-v2,再继续改进得到Yolo9000。
  YOLO-v2比一代,速度更快,可以直接调整计算速度和准确率的权衡,并且能够识别检测未标注过的物体。主要简化了网络,并在训练上做了重要的改进,box的选择也做了优化。(一代有20个训练类别,YOLO9000有9000个训练类别)
1)优化了预测项
  将直接预测位置,调整为预测偏差。
  
               bx=σ(tx)+cx b x = σ ( t x ) + c x
               by=σ(ty)+cy b y = σ ( t y ) + c y
               bw=pwetw b w = p w e t w
               bh=pheth b h = p h e t h
     Pr(object)IOUtruthbox=σ(to) P r ( o b j e c t ) ∗ I O U b o x t r u t h = σ ( t o )
    
   (cx,cy) ( c x , c y ) 是grid-cell的中心相对于图像左上角的偏移位置,表示cell的
  中心坐标, (pw,ph) ( p w , p h ) 是标注的ground-truth的长宽。 {tx,ty,tw,th,to} { t x , t y , t w , t h , t o }
  是预测值,再做一次转换变为实际box的位置及边缘标注。这处调整使得
  训练时更稳定。同时将YOLO-v1使用的 S×S×(B×5+classes) S × S × ( B × 5 + c l a s s e s )
   S×S×(B×(5+classes)) ⟶ S × S × ( B × ( 5 + c l a s s e s ) )
2)更细粒度feature-map的使用
  在检测输出feature-map上,concat更靠前层的feature-map,类似于ResNet里面的Identity-mapping。
  size问题,比如更前层是26x26x512 怎么跟当前feature-size=13x13的合并到一起。
  在Inception-module里面,是精心设计Conv和Pool的尺寸从而使得concat之前各个子模块的输出尺寸大小一致的。而ResNet的直连也是在Resdual部分做了Conv和Pool的尺寸设计(哪怕不同尺寸,也有一个处理函数: wsx w s x 转换为与Resdual输出尺寸一致),从而使得输出与输入尺寸上相同。
  这里是怎么处理的呢?文中有句话“the passthrough layer concatenates the higher resolution features with the low resolution features by stacking adjacent features into different channels instead of spatial locations, similar to the identity mappinns in ResNet”。目测是加的卷积层作为passthrough layer,并且很可能是[1x1]的卷积。
3)简化了网络,使用了BN

  在网络中大量使用[3x3] followed by [1x1]-filter,计算更快。
  Batch-normalize的大量应用,使得训练更容易收敛,命名
  该网络结构为Darknet-19(共19个Conv-layer, 5个max-pooling layer)。
  分类训练时,所使用的网络结构如右图:
  检测训练时,删除最后三层,增加3层
  [3x3]x1024 + [1x1]xout_num; outnum=boxnum(5+classes) o u t n u m = b o x n u m ∗ ( 5 + c l a s s e s )
4)改进了训练方法
  在使用分类任务预训练后,继续在高清图像上训练分类任务(10 epoch;
  input_size由[224x224] 变为 [448x448]),以提高对高清图像的适应性。
  训练检测任务时,采用multi-scale训练方式。每10个epoch,随机选择
  一种输入图像尺寸。 {320,...,608} { 320 , . . . , 608 } ,以32为间隔。调整网络的输入,
  从而使得检测训练更适合于各种尺寸的输入情况,并能够在预测时很好
  地调节计算速度和计算精度的关系。
  在COCO(80分类)和VOC(20分类)上训练检测任务。
5)用聚类选择所用anchor-box
  之前选择的box都是手调的,这里使用聚类选择出效果更好的box。
  distance metrice定义为: d(box,centroid)=1IOUcentroidbox d ( b o x , c e n t r o i d ) = 1 − I O U b o x c e n t r o i d ,重合度越高距离越小。将所有标注box(长宽)抽取出来,定义不同聚类的box(长宽值),计算距离时,假设中心位置是重叠的。

  至此,YOLO-v2就训练OK。后面的是YOLO9000的设计及训练。
1)合并了大量的数据集。
  构建了一颗WordTree,描述了各个物体的隶属关系,以便能够将不同的数据集合并(对隶属关系Tree上的物体label向根label靠近)。
2)将目标检测和物体识别合并到一起联合训练。
  样本带有目标检测的标记,当是检测样本来时,则训练检测loss,当是分类样本来时,则训练分类loss。
  关键点:When it sees a classification image we only backpropagate classification loss. To do this we simply find the bounding box that predicts the highest probability for that class and we compute the loss on just its predicted tree. We also assume that the predicted box overlaps what would be the ground truth laabel by at least 0.3 IOU and we backpropagate objectness loss based on this assumption.
  这里将覆盖值IOU最大类预测(相当于先作了一步目标检测),计算分类误差作优化。从而使得目标检测能够扩大检测类的范围。

YOLO-V3

  第三代YOLO,写得很轻松随意。主要工作是将模型搞得更准确,与之同时模型复杂度更高,但是计算速度并无明显损失。
  性能对比及分类网络结构如下图,命名为Darnet-53。


  对YOLO并无卵用的改进尝试:
  1) 对长宽的预测改为线性的预测,会让模型不稳定并性能下降。
  2) focal loss 会导致性能下降。
  3) 训练时,双IOU然并卵。

最终预测结果

  怎么来做最终的判断呢?
  这么多的预测值,怎么使用呢?整体比较取最优是OK的。
1)confidence-score
  定义存在物体的置信度 confidence=Pr(object)IOUtruthpred c o n f i d e n c e = P r ( o b j e c t ) ∗ I O U p r e d t r u t h ,也就是存在物体的概率,乘以 size(predboxtruthbox)size(predboxtruthbox) s i z e ( p r e d − b o x ∩ t r u t h − b o x ) s i z e ( p r e d − b o x ∪ t r u t h − b o x ) 。该grid-cell存在物体的概率是1/0,当物体的center在该grid-cell内时,Pr(object)=1,否则=0。
  如何在某个grid-cell内,选择当前cell的某个box是预测的哪个类呢?
  考虑存在物体的置信度与类型概率= Pr(classi|object)Pr(object)IOUtruthpred P r ( c l a s s i | o b j e c t ) ∗ P r ( o b j e c t ) ∗ I O U p r e d t r u t h ,基于此值选择,当前grid-cell的cur-box的预测类就是此值最大的那个类。
2)IOU足够充分
  在当前grid-cell下,有多个box,都做预测太混乱了,怎么办呢?
  其实多个box是为了避免物体重叠时的问题。只需要保留下IOU足够大的预测即可。同时,多box可以适应目标不同的形状。
3)同目标多预测
  此时,还存在大量的对同一物体的多个预测的,怎么办?
  因为上面处理的是同grid-cell内的多预测,但是跨格的同目标多预测还是大量存在的。怎样保留局部范围内的最佳预测呢?使用Non-maximal Suppression,对每个类型的预测值保留最大的IOU的预测。为什么会有跨格的同目标多预测情况呢?因为某些较大的目标,会被多个grid-cell预测到。(虽然在loss设计上做了偏重处理,但是仍然会出现这种问题)
  疑惑:在一张图上,有多个同类型目标时,non-maximal suppression还能起作用么?可以的,NMS是局部最优去重。详见后面的基础补充。
  YOLO本身的优势:在训练时,对整个图片做了隐式地上下文信息的编码,将分类及其出现整合到了一起。
  值得注意的是:YOLO对IOU=0.5非常适配。

基础知识补充
IOU

  IOU: Intersection Over Union(交并比)
  计算两个box的交集部分占整体的比例,可以用来表示预测box对真实box的覆盖率,准确度。
   IOU=size(PredBoxTruthBox)size(PredBoxTruthBox)=size(AB)size(AB) I O U = s i z e ( P r e d − B o x ∩ T r u t h − B o x ) s i z e ( P r e d − B o x ∪ T r u t h − B o x ) = s i z e ( A ∩ B ) s i z e ( A ∪ B )

anchor-box

  anchor box是什么?做神马用的?
  anchor box是预先定义的用来拟合目标大小形状的锚箱。
  通过预先定义一些尺寸比例不同的box,当表达同一物体时,可以更从容地表示该物体的各种可能形状;当不同物体重叠时,可以依据物体的不同形状将它们区分出来。
  预定义这些box的好处,更方便地拟合实际标注ground-truth(在计算loss时),且用来区分重叠物体。
  anchor-box的最初使用是在R-CNN里面,主要用来更方便地处理多尺度目标区域抽取问题。

Non-maximal Suppression

  目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框(局部最大搜索)。上个奥黛丽·赫本的美图举作例子。


基本处理如下:
1)将所有的box按照confidence-score排序,作为集合M。
2)选择最高的分值对应的box,不放回地取出放入到保留集合S中。
3)M中剩余box,分别计算与S中的box的IOU, 高于某阈值的,则从M中删除。( 相当于局部去重操作;低于某阈值的,则可能是其他分类的,留待下轮
4)再不放回地取M中的最高分对应的box,放入到保留集合S中,重复。
5)直到集合M中没有box。
注意:此处的IOU阈值,一般在[0.3,0.5]内。

Leaky ReLU

   f(x)={x0.1xifx>0else f ( x ) = { x i f x > 0 0.1 x e l s e

mAP

  AP:average precision
  某一类别的平均精度。
  按照PASCAL VOC的定义,设定一组阈值,[0, 0.1, 0.2, …, 1],共11个,按照每个recall>阈值,都有一个最大precision,计算 AP=111Precsionrecall A P = 1 11 ∑ P r e c s i o n r e c a l l 。(recall-precision的曲线的曲线下面积)
  mAP:mean average precision
  多个分类的平均精度的均值。 mAP=1CcCAP m A P = 1 C ∑ c ∈ C A P

Reference
  1. 官方YOLO网站:https://pjreddie.com/darknet/yolo/
  2. 2016-You Only Look Once: Unified, Real-Time Object Detection
  3. 2017-YOLO9000: Better, Faster, Stronger
  4. 2018-YOLOv3: An Incremental Improvement
  5. 2017-Learning Non-maximum Suppression
yolo是目前目标检测领域比较流行的深度学习方法之一,其通过卷积神经网络实现目标的识别和定位。而yolo各map曲线可视化则是yolo这个目标检测方法常用的评价指标之一,主要是用来展示模型的性能表现和不同模型的对比。下面我们来详细介绍一下yolo各map曲线可视化。 yolo各map曲线可视化主要是通过不同的IOU交并比)阈值和不同的类别阈值来展示模型在不同条件下的表现情况。其中,IOU阈值是指检测结果框与真实目标框的重叠率,常用的IOU阈值有0.5、0.75、0.95等。类别阈值是指模型输出的各类别得分中,取值大于某一阈值的才会被认为是该类别,常用的类别阈值有0.1、0.5、0.75等。yolo各map曲线可视化常用的评价指标是平均精度(mean average precision,mAP),mAP是模型在相应条件下所有类别AP(Average Precision)的平均值,其中AP定义为:对于一个类别,以类别概率为置信度,按照置信度排序,计算在每个排名下的Precision和Recall,并计算P-R曲线下的面积(AUC),即为该类别的AP。mAP越高,说明模型在不同条件下的表现越好。 yolo各map曲线可视化图一般是以IOU阈值为横坐标,mAP为纵坐标,在同一张图中绘制不同类别阈值下的mAP与IOU的关系曲线。通过观察yolo各map曲线可视化图,可以得出以下几点结论:(1)在相同的类别阈值下,随着IOU阈值的提高,mAP一般也会有所提高;(2)在相同的IOU阈值下,随着类别阈值的提高,mAP一般会先增大后减小,这是因为当类别阈值过大时,虽然可以减少背景噪音,但同时也会忽略掉一些真正有用的目标;(3)通过yolo各map曲线可视化图,可以比较不同网络模型在不同条件下的性能表现。比如,同样在IOU阈值为0.5时,模型A的mAP明显高于模型B,说明模型A在一定条件下表现更优秀。 总之,yolo各map曲线可视化是一种比较直观的评价目标检测模型性能的方法,通过观察不同条件下的mAP变化情况,可以得出模型优劣的结论,为进一步优化模型提供指导。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值