yolov1 - you only look once:unified,real-time object detection

你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上) - 知乎转载请务必注明出处。科技猛兽:你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上)0 前言本文目的是用尽量浅显易懂的语言让零基础小白能够理解什么是YOLO系列模型,以及他们的设计思想和改进思路分别…https://zhuanlan.zhihu.com/p/183261974【论文解读】Yolo三部曲解读——Yolov1 - 知乎打个广告,复现Yolov3之后的深度原理剖析请移步下文(含代码): 【算法实验】能检测COCO并鉴黄的SexyYolo(含Yolov3的深度原理剖析)Yolov1论文链接: You Only Look Once: Unified, Real-Time Object DetectionY…https://zhuanlan.zhihu.com/p/70387154

目标检测|YOLO原理与实现 - 知乎码字不易,欢迎给个赞! 欢迎交流与转载,文章会同步发布在公众号:机器学习算法全栈工程师(Jeemy110) 最新的YOLOv2和YOLOv3:小白将:目标检测|YOLOv2原理与实现(附YOLOv3)前言当我们谈起计算机视觉时,首先想到的…https://zhuanlan.zhihu.com/p/32525231        yolov1是yolo系列的开山之作,也是后续诸多anchor-free算法的思想起源(和centernet很相似),其在中心点grid做正样本,其余样本做负样本,yolov1特别简洁,是直接将检测问题转成一个回归问题去做的,对类别边界框用的全都是mse loss(l2 loss)。yolov1主要是奠定了grid cell的思想,现在回头看,其实这是一种非常有效的正负样本分配手段。

1.Introduction

        将目标检测问题直接定义成一个单一的回归问题,直接从图像像素到边界框坐标和类概率。yolo有几个优点,1.快,2.yolo做预测时会对图像做全局性的推理,与sliding window和region proposl-based的方法不同,yolo在训练和测试时可以看到整个图像,因此它隐式的编码关于类及其外观的的上下文信息。3.yolo可以学习对象的通用表征。

2.unified detection

        网络使用整图特征去预测每一个边界框,它同时预测整张图像上的所有边界框以及类别。这意味着网络对图像中所有的对象进行一个全局推理。

        我们将输入图像分为SxS网格,如果目标的中心落入网格单元中,则该网格就负责预测该对象。后来的anchor-free方法大多在fpn层做正样本采样,其实在原图上就是一块感受野,yolo直接将原图划分网格,让对象中心点落在这个网络中的做正样本,其余做负样本,由于没有fpn和分层预测,网格也不同于中心点,这种做法对于多个类别中心点落在同一个网格中的目标就检测不出来了,现在看,就是策略还是糙了一些。

        每一个网格单元预测B个bbox和这些bbox的置信度分数,这些置信度分数反应了模型对框是否包含对象以及它认为该框预测是否准确的置信度,有两层含义,第一框是有对象的框,第二框和gt的iou大不大,预测的准不准。因此置信度被定义为:

如果网格中没有对象,则置信度为0,有对象的话,第一项p就是1,因此置信度其实就是预测框和gt的iou。

        每个边界框由5个预测值组成,x,y,w,h和置信度,(x,y)坐标是相当于网格单元边界的中心点坐标,w和h是相对于整张图预测的,置信度是预测框和gt之间的IOU。

        每个网格单元都预测c个条件类别概率(是在有目标的条件下属于c类的概率)。我们只预测每个网格单元上一组类别概率,而不管框B的数量,前面说每个单元网格是设置了B个box来做预测的,但是在实际计算损失时,只对和真实物体最接近的框计算损失,其它框不监督。这里说的一组也指网络的输出7x7x30,30中除了2x5,还有20个类别,类别预测是one-hot的,每张图中都会输出49个目标,每个单元网络都只会输出一个目标。

        在前向输出时,将类别条件概率和单个框置信度相乘得到:       

这为我们提供了每个框特定类的置信度分数,这些分数编码了该类出现在框中的概率以及预测的框和gt的匹配程度。因此实际上两个置信度,一个是框的置信度,可以用预测框和gt的iou表征,一个是类别的条件概率是模型预测的。

 2.1 network design 

网络结构受到googlenet的启发,关注其最后两个全连接,最终输出是7x7x30,7x7是划分的网格单元,30是2x5+20,其中2是B,5是x,y,w,h,置信度,20是类别。注意这里的置信度是表征框的,其监督标签是预测框和gt的IOU,实际计算loss的时候只会选择B中预测框即(x,y,w,h)和gt的iou最大的一组去计算。yolo中所谓的grid cell怎么体现就体现在最终的输出7x7上,这里和fpn层上采样正负样本一样的。在最终输出的7x7上,每一个网格单元都代表了一块感受野,物体中心点在区域中的就安排一个框去回归物体,而其他的框就是负样本。

2.2 training

        backbone在imagenet上预训练了,backbone后面又添加了4个conv和2个具有随机初始化权重的fc,预训练还是224x224,但是做检测输入是448x448。

        网络最后一层预测类别概率和边界框坐标,通过图像的w和h对边界框的w和h做归一化,使它们落在0-1之间,我们将边界框的x和y坐标参数化为特定网格单元位置的偏移量,因此它们也被限制在0-1之间,注意这里的x,y是物体中心点坐标,这里回归的其实不是gt中心点坐标,而是物体中心点坐标相对于网格单元左上角的偏移值,w和h则是相对全图的但是也做了归一化,因为中心点坐标一定在网格单元中,包括预测的物体中心点坐标,w和h大概率是超出网格的,要在全图做归一化,其实这样应该是考虑到暴力回归比较大且不同的数值是比较困难,归一化到0-1之间减轻难度,帮助收敛。但yolov1没有anchor,对于gt的编码还是比较简单的。举个例子,一个网格中物体中心点坐标是(2.3,3.6),另一个网格中物体中心点坐标是(5.4,6.3),左上角网格坐标分别为(2,3)和(5,6),做offset的话,就只要回归(0.3,0.6)和(0.4,0.3),否则,要回归这么大的一个数值还是难的。

        对模型输出的mse做了优化,使用mse loss是因为它容易优化,但是它并不完全符合我们最大化map的目标。它将定位误差和分类误差同等加权,此外在每个图像中,很多网格单元都不包含任何对象,这会将这些网格的置信度分数变成0,通常会占据包含对象的网格单元的梯度,这会导致模型训练不稳定,在训练早期出现分歧。为了解决这个问题,我们增加了边界框坐标预测的损失,并减少了不包含对象的框的置信度预测的损失,其中λcoord=5,λnoobj=0.5.

        大框和小框的权重错误在mse中也要考虑,我们预测w和h的平方根,如果不取根号,损失更偏向于调整尺寸比较大的预测框,20个像素点的偏差,对于800*600的预测框几乎没有影响,此时的IOU数值还是很大,但是对于30*40的预测框影响就很大。取根号是为了尽可能的消除大尺寸框与小尺寸框之间的差异。

        yolo预测每个网格单元中的多个边界框,实际只有两个,在训练时,我们只希望一个边界预测框来负责每个对象,我们分配一个预测边界的原则是,该预测框和gt之间iou,This leads to specialization between the bounding box predictors. Each predictor gets better at predicting certain sizes, aspect ratios, or classes of object, improving overall recall.这样做引导了预测边界框的专业化,每个预测框在预测特定大小,纵横比或对象类别方面会更好,从而提高整体召回。这里有一点需要注意,因为每个网格单元只有一个框是负责中心点落在该网格的gt的,那么正样本自然就是这个预测框,负样本有两部分,第一个是另一个在该网格中预测的边界框,第二是剩下的不包含对象的网格中边界框。计算损失时,负责预测物体的预测框的标签是IOU,不负责预测的标签是0.

最终的损失函数如上,很简洁,全是mse的回归,第一行是包含目标的中心点回归,不包含就是0,第二行是包含误差的w和h回归,不包含就是0,第三行是包含目标的置信度回归,包含目标,带标C就是预测框和gt的IOU值,第四行是不包含目标的置信度回归,带标C是0,第五行是包含目标的类别回归,带标p是one-hot形式,对应类别位置为1,其余位置为0。这里i是指目标的单元格,j是指第几个边界框对目标负责。

        yolo在voc上训练,bs=64,lr step decay,用了dropout,数据增强。用nms有比较大的提升。

        到这里我们来看看损失函数,是不是和centernet是很相似的,centernet对中心点进行预测,是在stride=4的特征图上,物体中心点为正样本,其余为负样本进行采样,同步预测w和h,yolov1在7x7的特征图上(若输入是448,则是stride=64的特征图),若物体中心点落在7x7的某一个网格中,则其产生的边界框负责预测目标为正样本,其余预测边界框为负样本,yolov1的高强度降采样注定了他没法检测那些离的很近的样本,这些样本的中心点肯定发生重叠了,在centernet的四倍降采样中,这种现象是不明显的,在fcos上是很明显的,因此fcos要通过分层fpn预测来解决这个问题。yolov1也没有采用过多的head来做监督,统一在一个loss中,这也是比较粗糙的,后面的yolox好像就解耦了,很简洁,这么多的loss统一在一起还能这么好的work,里面肯定用了不少的技巧。其实从降采样64倍这个角度看,yolo的正样本其实还是挺多的,所以作者最后说一个网格单元预测一个目标,仍然产生了很多框,用了nms涨了不少点,在计算时只选择了iou最高的,其实保证了正样本的质量。

        论文整体看,确实很简洁,却又很多思想在里面,包括anchor-free的实践,现在很多目标检测网络的成功也往往得益于检测框架的发展,新的结构的出现,包括解耦的head,fpn等,结合之前的思想还是能取得很好的进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值