目标检测之深入理解YOLOv1

参考:

https://blog.csdn.net/c20081052/article/details/80236015

论文下载:http://arxiv.org/abs/1506.02640 
darknet版的代码下载:https://github.com/pjreddie/darknet

tensorflow版本的代码下载:https://github.com/hizhangp/yolo_tensorflow

源码分析可参考:https://zhuanlan.zhihu.com/p/25053311

YOLOv1是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名的又一大作,起了一个很娱乐化的名字:YOLO(You Only Look Once)。  YOLOV1将物体检测作为回归问题求解,基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。虽然目前版本还有一些硬伤,但是解决了目前基于DeepLearning检测中一个大痛点,就是速度问题。 其增强版本GPU中能跑45fps,简化版本155fps。

YOLO主要特点是:

  • 速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
  • 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
  • 泛化能力强。

一、YOLOv1的核心思想 

  •  YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
  • YOLO将物体检测作为一个回归问题进行求解,输入图像经过一次inference(推理),便能得到图像中所有物体的位置和其所属类别及相应的置信概率。而rcnn/fast rcnn/faster rcnn将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。

二、YOLOv1的网络结构

YOLOv1检测网络包含24个卷积层(用来提取特征)和2个全联接层(用来预测图像位置和类类别置信度),并且使用了大量的1x1的卷积用来降低上一层的layer到下一层的特征空间。并且在paper中,作者还给出了fast-YOLO的构架,即:9个卷积层和2个全连接层。使用titan x GPU,fast YOLO可以达到155fps的检测速度,但是mAP值也从YOLO的63.4%降到了52.7%,但却仍然远高于以往的实时物体检测方法(DPM)的mAP值。 

  •  YOLOv1将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。如下图所示,图中物体狗的中心点(红色原点)落入第5行、第2列的格子内,所以这个格子负责预测图像中的物体狗。

     
  •  每个网格要预测B个bounding box,每个bounding box包含五个数据,分别为:x,y,w,h,confidence。其中x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。w,h是bounding box的宽度和高度(注意:训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1])。同时还要预测一个confidence值,这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的: 

      其中如果有object落在一个网格(grid cell)里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。 

  • 每个网格还要预测一个类别信息,记为C类,则一张图片共分为SxS个网格,每个网格要预测B个bounding box,同时还要预测C个类别,于是输出就是S x S x (5*B+C)的一个tensor。 对于paper中,作者选取的S=7,B=2,C=20,所以输出的维度为7 * 7 *(20+2 * 5)=1470,所以这也解释了为什么在网络代码中fc26的channel为1470维度。
    注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。

  • 在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:

 等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。

三、YOLOv1的实现细节

  1. 每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。 其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。

448的图片经过google的inception的思想后加几层卷积(有更好的效果)。如上图所示物体的中心落在红色的grid里面,所以Pr=1。那么,为什么作者这个地方的confidence加了Pr呢?原因是为了后面计算的条件概率时候的需要。
在yolo的paper里面作者提到了预测的不是w和h,而是w平方和h平方。
对上面的(x,y,w,h)参数解释如下:
(x,y)coordinates represent the center of the box relative to the bounds of the grid cell.
(w,h)The width and height are predicted relative to the whole image.
在这里xywh我看网上都是千篇一律的解释,互相抄袭,这个地方比较难理解,我详细的讲一下bbox的预测的xywh的四个值的含义:
xy表示bbox的中心点相对于cell的左上角坐标的偏移值,宽高是相对于整张图的宽高进行归一化的,偏移的计算方式如下所示:

经过这样的表达后,xywh的值都经过归一化到了0-1之间,不会导致太难收敛。
注意这个yolo v1里面没有任何anchor的概念,所以训练的时候没有初始化anchor的东西,需要初始化的只有网络的权值,然后这个权值输出的7 * 7 * 30的结果,里面的值才是xywh的值。 

  2. 损失函数的设计

     在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。 这种做法存在以下几个问题: 
          第一,8维的localization error和20维的classification error同等重要显然是不合理的; 
          第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。 
     解决办法:

  • 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为在pascal VOC训练中取5。
  • 对没有object的box的confidence loss,赋予小的loss weight,记为在pascal VOC训练中取0.5。
  • 有object的box的confidence loss和类别的loss的loss weight正常取1。
  • 一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。
  • 对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。

       对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。  

         一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。

         最后整个的损失函数如下所示:

 这个损失函数中: 

  • 只有当某个网格中有object的时候才对classification error进行惩罚。
  • 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。

 四、YOLOv1训练和测试

1、训练阶段

  • 预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是Figure3中的前20个卷机网络+average-pooling layer+ fully connected layer (此时网络输入是224*224)。
  • 训练检测网络:转换模型去执行检测任务,《Object detection networks on convolutional feature maps》提到说在预训练网络中增加卷积和全链接层可以改善性能。在他们例子基础上添加4个卷积层和2个全链接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入也又224*224变成448*448。见Figure3。
  • 一幅图片分成7x7个网格(grid cell),某个物体的中心落在这个网格中此网格就负责预测这个物体。

  • 最后一层输出为 (7*7)*30的维度。每个 1*1*30的维度对应原图7*7个cell中的一个,1*1*30中含有类别预测和bbox坐标预测。总得来讲就是让网格负责类别信息,bounding box主要负责坐标信息(部分负责类别信息:confidence也算类别信息)
  • 每个网格(1*1*30维度对应原图中的cell)要预测2个bounding box (图中黄色实线框)的坐标(x,y,w,h),其中:中心坐标的x,y 相对于对应的网格归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。 每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:confidence =

其中如果有object落在一个网格(grid cell)里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。 

  • 每个网格还要预测类别信息,论文中有20类。7x7的网格,每个网格要预测2个 bounding box 和 20个类别概率,输出就是 7x7x(5x2 + 20)  。 (通用公式: SxS个网格,每个网格要预测B个bounding box还要预测C个categories,输出就是S x S x (5*B+C)的一个tensor。 注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的)

 2、测试阶段

Test的时候,每个网格预测的class信息相乘,就得到每个bounding box的class-specific confidence score。

等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。

  •  对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)

  • 得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。

  •  在得到Bounding Box,Confidence, Class probability后利用非极大值抑制算法保留目标框。

 五、YOLOv1的缺点

  • YOLO对相互靠的很近的物体,还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。

  • 对测试图像中,同一类物体中新的不常见的长宽比和其他情况时泛化能力偏弱。

  • 由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。

猜你喜欢

转载自blog.csdn.net/qq_40716944/article/details/104908692
今日推荐