目标检测算法——YOLOV1

2021/7/1 20:22:00

本文主要是介绍目标检测算法——YOLOV1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、主要贡献(优点)

一阶段、快速、端到端训练

  • *快速,pipline简单.

  • *背景误检率低。

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

2、主要思路

    通过全卷积网络,将输入图像映射为一个7*7*30 的张量,7*7是吧整个图像划为7*7个网格,每个网格设置2个预选框(训练可以理解为进化的思路),如下左图;30是每个位置的编码如下右图。每个网格的两个预选框共享分类结果。

    20个对象分类的概率:YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等)

    2个bounding box的位置:每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height)    

    2个bounding box的置信度: 即该bounding box内存在对象的概率 * 该bounding box与该对象实际bounding box的IOU。当该格点不含有物体时,该置信度的标签为0;若含有物体时,该置信度的标签为预测框与真实物体框的IOU数值。

   推理阶段,简单的概括就是:

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

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

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

3、具体细节

1)inout

    输入就是原始图像,唯一的要求是缩放到448*448的大小。主要是因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入。

2)backbone

    Darknet(Google net 改进)

    24卷积+2全连接,交替的1*1卷积层:减少特征空间。

    在ImageNet-1000类上预训练(使用一半的分辨率224*224input),使用前20个卷积层,接平均值池化,最后接全连接,训了大约一个星期,在ImageNet 2012 val set上top-5 acc是88%;在detection阶段使用448*448(detection需要细粒度的视觉信息,因此把输入分辨率从224*224提高到448*448),增加四个卷积层和两个全连接层(随机权重)。

    激活函数:最后一层使用线性激活函数,其他层使用leaky RELU。

3)neck & head

    如上面的两个图,总共有 49*2=98 个候选区,没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个(一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个)。有点不完全算监督算法,而是像进化算法。 一张图片最多可以检测出49个对象。计算出该Object的bounding box的中心位置,这个中心位置落在哪个grid,该grid对应的输出向量中该对象的类别概率是1,负责预测该object;其他grid对该Object的预测概率设为0(不负责预测该对象)。

    位置坐标中,Center_x,Center_y 回归的是距离7*7网格中物体中心点对应的一个网格的坐上角的坐标,为归一化值。width,height,也是整图的归一化值。

    类别概率中,无论每个网格预测的bounding box数目B是多少,我们都只为一个网格预测一组类别概率。在test阶段,将条件概率和每个box的confidence相乘:

4)loss function

    面临如下问题:

    a.分类损失、位置回归损失权重:8维的localization error和20维的classification error同等重要显然是不合理的

    b.正负样本不均衡:其中49个格点,含有物体的格点往往只有3、4个,其余全是不含有物体的格点。

    c.位置回归时大小框不均衡:相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的

    解决方案:

    a.通过添加权重系数,通过观察结果,增大位置回归损失的权重,,设置为5.

    b.通过增加权重系数,降低不包含物体的网格的权重,,设置0.5.

    c.预测bounding box的h,w的平方根,而不是直接预测bbox

    这个损失函数中:

    *只有当某个网格中有object的时候才对classification error进行惩罚。

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

5)tricks(在上面有提及)

    a、不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值

    b、每个格点预测两个或多个矩形框,在损失函数计算中,只对和真实物体最接近的框计算损失,其余框不进行修正.作者发现,一个格点的两个框在尺寸、长宽比、或者某些类别上逐渐有所分工,总体的召回率有所提升。

    c、在推理时,使用物体的类别预测最大值 p乘以预测框的最大值 c,作为输出预测物体的置信度。

    d、训练阶段先使用imagenet 224*224 作为输入训练,达到top5 88%的精度,

6)训练细节相关

    VOC2007 and VOC2012

    135epoch

    batchsize=64

    momentum=0.9

    decay=0.0005

    lr:

    

    使用了droupout=0.5(在第一个全连接之后)

    数据增强:随机缩放、位移、曝光、饱和度

7)局限性

    *每个网格预测两个bbox,且只能有一个分类结果,对于成群出现的小目标,效果不好

    *对于新的/异常的长宽比或配置,效果不好。

    *使用了多个下采样,只是用粗粒度特征。

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

参考链接:

1、https://www.cnblogs.com/sddai/p/14760055.html

2、 https://zhuanlan.zhihu.com/p/70387154

3、 https://blog.csdn.net/qq_38236744/article/details/106724596

4、https://blog.csdn.net/hrsstudy/article/details/70305791



这篇关于目标检测算法——YOLOV1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程