目标检测之解读YOLOv1论文、源码及背后逻辑

YOLO实现目标检测的步骤

  1. 将一幅图像分成 7x7 个单元格(grid cell),如果某个物体( object )的中心落在这个单元格中,则这个单元格就负责预测这个物体。如图所示:

    在这里插入图片描述

  2. 每个单元格用2 个 bounding box去预测这个物体的真实框(ground truth)

  3. yolo 通过CNN去预测7x7 个单元格的2 个 bounding box的中心点坐标(x,y)、宽高(w,h)、物体分类、confidence(这个值代表了所预测的bounding box中是否含有object和若有object,这个object预测得有多准的两重信息),如图所示:
    在这里插入图片描述

    注:该网络用leaky ReLU,代替ReLU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒定),保留负数输出,但衰减负数输出。

  4. 上面是结构图yolo_v1结构图,通过结构图可以轻易知道前向传播的计算过程,是很便于读者理解的。v1的输出是一个7x7x30的张量,7x7表示把输入图片划分位7x7的网格,每一个小单元的另一个维度等于30。30=(2*5+20)。代表能预测2个框的5个参数(x,y,w,h,confidence)和20个种类。每个单元格预测一个属于类别 c l a s s i class_{i} classi的条件概率 P r ( C l a s s i ∣ O b j e c t ) P r ( C l a s s i ∣ O b j e c t ) Pr(Classi∣Object)Pr(Class_{i} | Object) Pr(ClassiObject)Pr(ClassiObject)。要注意的是,属于一个网格的2个bboxs共享一套条件概率值,因为这两个box都是为了一个单元格服务,最终预测出一个物体类别。

  5. 每个bounding box的confidence和各个类别预测概率相乘,得到每一个bounding box关于所有类别的class-specific confidence scores(其形状为20 x 1),其中的一个bounding box计算过程如下:
    在这里插入图片描述

  6. 将所有bounding boxes中class-specific confidence scores低于阈值的设为0(最后所有scores为0的将不会画出该bounding box)

  7. 对每一个类别的scores从大到小排序

  8. 对每一个类别根据scores进行非极大值抑制:拿到score最大的bounding box与score比它小的bounding boxes计算iou,如果大于阈值,则将他们设置该类别的scores为0,之后对不为0的bounding box执行这一操作。6~8步如下所示:

在这里插入图片描述

  1. 对每一个bounding box只要有一个class-specific confidence score不为0,就画出这个框,并标出scores最大的类别名。

损失函数

论文中的公式如下:

在这里插入图片描述

S 2 S^2 S2表示网格数,在这里是7x7。B表示每个单元格预测框的个数,这里是2。

l i j o b j l^{obj}_{ij} lijobj取值为0和1,即单元格内是否有目标的中心。

λ c o o r d = 5 λ_{coord} = 5 λcoord=5

λ n o o b j = 0.5 λ_{noobj} = 0.5 λnoobj=0.5

结合网络输出,理解损失函数,如下所示:

在这里插入图片描述

损失函数设计细节:

  • YOLOv1对位置误差,confidence误差,分类误差均使用了均方差作为损失函数。
  • 三部分误差损失(位置误差,confidence误差,分类误差),在损失函数中所占权重不一样,位置误差权重系数最大,为5。
  • 大部分bounding box中都没有物体,积少成多,造成loss的第2部分与第3部分的不平衡,因此,损失函数中对没有物体中心的单元格中预测的bounding box的confidence误差给予小的权重系数,为0.5。
  • 有目标的单元格中预测的bbox的confidence损失和分类损失,权重系数正常为1。
  • confidence损失,分为obj和no_obj两种情况计算,对于no_obj(该单元格不包含物体中心)并且当检测框和所有真实框的iou都低于0.5。
  • 对于不包含某个物体的中心点的单元格,confidence的真实值则为0,如果包含,confidence的真实值则等于 bounding box与真实框的IOU。
  • 计算confidence损失的目的,想惩罚那些附近没有物体(和所有真实框的iou都低于0.5)而confidence很高的bounding box和那些包含物体中心,confidence却很小的bounding box。
  • 由于相同的位置误差对大目标和小目标的影响是不同的,相同的偏差对于小目标来说影响要比大目标大,故作者选择将预测的bounding box的w,h先取其平方根,再求均方差损失。
  • 一个网格预测2个bounding box,在计算损失函数的时候,只取与ground truth box中IoU大的那个预测框来计算损失。
  • 分类误差,只有当单元格中含有目标时才计算,没有目标的单元格的分类误差不计算在内。

优点:

端到端训练,损失函数的反向传播可以贯穿整个网络,这也是one-stage检测算法的优势,适合工程化。

速度快,YOLO将物体检测作为回归问题进行求解,整个检测网络通道简单

背景误检率低,YOLO在训练过程中可利用整张图像的整体(context)信息,而Faster-Rcnn是局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。

通用性强,对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。

局限性:

漏检,每个单元格只预测一个 类别的Bounding Boxes,而且最后只取置信度最大的那个 Box。这就导致如果多个不同物体(或者同类物体的不同实体)的中心落在同一个网格中,会造成漏检。

小目标检测效果不好,yolov1网络到后面感受野较大,小目标的特征无法在后面7*7的单元格中体现。

只支持一种分辨率图片,由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率的图片。

召回率低,召回率就是检测出的物体数除以总物体数,YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。

参考

https://blog.csdn.net/mrjkzhangma/article/details/100128257

https://zhuanlan.zhihu.com/p/46691043

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值