• YOLO V1学习笔记


    为什么要学YOLOV1_哔哩哔哩_bilibili

    这个视频讲解的很好,建议在看这个之前看看卷积神经网络,会对卷积后的结果理解更加深刻一点。

    一 背景

    目标检测分为单阶段和两阶段模型。

    之前的目标检测DPM、R-CNN、Fast-RCNN、Faster-RCNN都是双阶段模型,也就是说需要先提取候选框,然后对各个候选框进行分类、甄别。双阶段模型没有全图信息,容易丢失很多信息。识别精度高,但是识别速度始终是技术瓶颈。

    YOLO V1开启了单阶段模型的大潮流。

    最开始对密集的、小物体的检测不很友好,但是随着技术的发展,现在在密集和小物体的检测方面已经相当友好。

    map指标:

    machine learning - How to calculate mAP for detection task for the PASCAL VOC Challenge? - Data Science Stack Exchange

    二 优点

    实时识别,yolo的识别非常快;

    端到端;

    它输入是一张完整的图片,前后文联系会比较紧密。

    三 原理

    1 预测阶段网络结构:

     把它当成黑盒模型就可以啦,只要明确输入和输出。

    也可以把这整个过程当作对图像全局信息的编码,从人眼可得到的各种信息转变为方便网络学习的各种特征。

    1.1 编码:得到boungding box

    输入:一张图片(448*448*3) 

    输出:7*7*30的信息张量(其中包含所有预测框的坐标、置信度和类别结果),其实就是boundingbox的信息。

    接下来的工作就是对7*7*30的信息张量进行解码。(获取其中的分类+回归的信息)

    1.2 解码:表示boungding box的7*7*30

    1.3 为什么是7*7?

    首先要将输入图片划分为S*S个grid cell。

    这里的S=7,所以是7*7,一共是49个grid cell。

    1.4 为什么是30?

    30=20+(2*5)

    每个gridcell包含两个bounding box,通过bounding box来拟合图片中的已标注目标。(yolo将这个任务视为一个监督学习任务,图片中的目标(ground truth)已经人工标注好了。)

    也就是一共会有49*2=96个bounding box。

    每个bounding box的中心点都在它所属于的grid cell里面。

    bounding box的信息表示为(x,y,h,w,c)

    (x,y)表示其中心点位置

    (h,w)表示其高度和宽度

    这四个值唯一确定bounding box

    (c)表示置信度

    已经标注好的数据集中分类目标有20类,所以20指的是每个grid cell分别对20个类别的概率。

    5是bounding box的信息,如上所述,每个grid cell有两个bounding box。

    所以每一个grid cell需要30=20+(2*5)个数字来描述。

    其实7*7*30最后的表示就是上图。

     2 对bounding box 进行后处理

    低置信度过滤、非极大值抑制NMS、去掉重复框(IOU),得到以下预测结果。

    3 训练阶段的反向传播

    yolo的损失函数:

    YOLO1是什么_SiMoNe10010的博客-CSDN博客 

    当grid cell有物体的时候,计算损失函数第1,2,3,5项,当grid里没有物体的时候计算第4项。

    损失函数一共有5项:

    1.中心点定位误差   

    2.宽高定位误差  

    3.confidence误差

    4.不负责检测Bbox confidence误差   

    5.负责grid cell 检测误差

    首先的是中心坐标的损失函数,用了我们最熟悉的均方误差MSE,这个很好理解。(中心点定位误差)

    然后是高和宽,没有简单的用MSE,而是用平方根的MSE,这是为什么呢?(宽高定位误差)

    第一个原因是更容易优化,但是还有更重要的原因:

    看下面的表格:

    首先,我们只考虑var1和var2在0和1之间。当var1和var2都很小的时候,也即是w和h都很小,意味着这个物体很小,那么我们应该尽量放大一些损失函数,让模型在识别小物体的时候准确一点。当var1和var2都很大,意味着这个物体也很大,甚至可能已经布满整张图片了,这时我么可以减小一些损失函数,毕竟很大的物体不需要很高的精度。

    一句话,使用平方根的MSE而不是MSE其实就是像让模型对小尺度的物体更敏感。或者说,对大的和小的物体同样敏感。

    接下来的三项都使用了MSE,其实用交叉熵可能会更好

    其中第4项是用来判断一个bounding box中究竟有没有物体的。

     

  • 相关阅读:
    【计算机视觉】尺度不变特征变换(SIFT)
    Docker学习资料集(从入门到实践)
    vue3 的组件通信以及ref的使用
    监督学习,无监督学习常用算法集合总结,引用scikit-learn库(监督篇)
    NC17383 A Simple Problem with Integers
    如何快速从Oracle迁移到Mysql?
    如何编辑图片合成图片?让我们来看看这些合成方法
    每天5分钟复习OpenStack(十二)Ceph FileStore 和 BlueSotre
    小程序开发:接入腾讯云的人像动漫化api接口
    【考研英语词汇训练营】Day 16 —— bankrupt,remain,regulate,construct,reflect
  • 原文地址:https://blog.csdn.net/qq_46012097/article/details/134207472