目标检测ssd和yolov1的简单理解

单发多框检测(SSD)

    输入图像之后,首先进入一个基础网络来抽取特征,抽取完特征之后对每个像素生成大量的锚框(每个锚框就是一个样本,然后预测锚框的类别以及到真实边界框的偏移)
        SSD 在给定锚框之后直接对锚框进行预测,而不需要做两阶段(为什么 Faster RCNN 需要做两次,而 SSD 只需要做一次?SSD 通过做不同分辨率下的预测来提升最终的效果,越到底层的 feature map,就越大,越往上,feature map 越少,因此底层更加有利于小物体的检测,而上层更有利于大物体的检测)
        SSD 不再使用 RPN 网络,而是直接在生成的大量样本(锚框)上做预测,看是否包含目标物体;如果包含目标物体,再预测该样本到真实边缘框的偏移 

 

      
 

你只需看一次(YOLO)

YOLOv1

将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object

每个网络需要预测B个BBox的位置信息和confidence(置信度)信息,一个BBox对应着四个位置信息和一个confidence信息。confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:(两个信息相乘,结果是一个是否预测正确的概率

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

  • 每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。(注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。)
  • 举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。

 stride是2,所以图像缩小一倍

(最后那步没有池化层应该),再FC层全连接。

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

    等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。

  • 这个乘积即预测的box属于某一类的概率,也有该box准确度的信息。

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

简单的概括就是:

(1) 给个一个输入图像,首先将图像划分成7*7的网格

(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)

(3) 根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可

损失函数

在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。

这种做法存在以下几个问题:

第一,8维的localization error和20维的classification error同等重要显然是不合理的;

我感觉就是每一维度的误差累加起来

第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。

(这种处理方式在目标稀疏的情况下可能会导致不稳定性和收敛问题。因为网络可能更容易过拟合那些包含目标的网格,而无法充分学习到没有目标的网格。)

解决办法:

  • 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight。.

(8维的坐标预测更重要,如果有上千种类别的话,坐标的损失就稀释的快没了。)

  • 对没有object的box的confidence loss,赋予小的loss weight。

(少学一点,让无物体的生成框发挥作用变小,否则很容易过拟合,感觉像多层感知机drop的原因)

  • 有object的box的confidence loss和类别的loss的loss weight正常取1。

对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。

为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。

大预测框(1000)的中心的x坐标差了20,和小锚框(10)的中心差了20,结果是截然不同的

但是如果开根号后,大预测框差0.3,小预测框差2.3。这就比较好的表示出来真实情况了) 

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

(这就是sum-squared error loss吧 )

这个损失函数中:

  • 只有当某个网格中有object的时候才对classification error进行惩罚。(最后一个类别预测)

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

其他细节,例如使用激活函数使用leak RELU,模型用ImageNet预训练等等

缺点

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

  • 虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。

  • YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了小物体检测的定位准确性。(这个平方根应该是是对iou的吧?)

  • (感觉就像小的物体,IOU误差更容易受到像素级别的偏差影响,变化就比较大,所以对模型有很大影响,降低了小物体检测的定位准确性)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值