Object Detection 学习笔记 (4) YOLO

《You Only Look Once: Unified,Real-Time Object Detection》

YOLO(You Only Look Once)属于 one-stage 方法。相比于 two-stage 的 RCNN系列,YOLO 的优势在于速度快,并且,与其他实时(real time)检测方法相比,YOLO的准确率更高。

YOLO 只有一个神经网络,输入一张图片可以直接输出目标位置以及相应的置信度。

YOLO 把目标检测作为回归问题处理。

YOLO的整体框架如下图:

图1  YOLO整体框架

YOLO借鉴了 GoogLeNet 用作图像分类的网络,但把最后的 inception modules (初始模块) 替换成了 1×1的 reduction layer(还原层) 以及紧随其后的一个 3×3 卷积层。YOLO的网络一共有 24 个卷积层和 2 个全连接层。

模型原理

YOLO把每张图片划分成 S×S 的网格,对于每个小格子(grid),如果一个目标的中心落在它里面,它就负责检测这个目标。例如这张图片,坐标(4,1)的格子(蓝色框)就负责检测红色框代表的狗,因为它的中心点(Xc,Yc)在这个格子里。

 

图2

bounding box 的置信度

每个格子负责预测 B 个 bbox 以及每个 bbox 的置信度(confidence)。置信度的计算公式为

confidence = Pr(Object)*IoU^{truth}_{pred}

如果这个格子内预测的结果是有物体存在,则

Pr(Object)=1confidence=IoU^{truth}_{pred},

否则

confidence=0

同时,每个格子还预测了“当格子中存在物体时,此物体为各种目标的可能性”,使用了条件概率的知识:

Pr(Class_i\left|Object)(当格子中存在物体时,此物体为第i种目标的可能性大小)

需要注意,Pr(Class_i\left|Object)与 bbox 的数量以及置信度无关。

对每个bbox,

Pr(Class_i\left|Object)* Pr(Object)*IoU^{truth}_{pred}=Pr(Class_i)*IoU^{truth}_{pred}

代表这个bbox中出现第 i 种目标的可能性(class-specific probability)以及bbox在多大程度上准确定位了目标。

 

输出

从图1可以看出最后的输出是 7×7×30=7×7×(2×5+20)。下面解释输出格式的涵义。

论文中设置 S=7,B=2,C=20(分别是格子行列数、bbox数/格,目标类别数)。

而每个bbox预测五个值(x,y,w,h)以及 置信度(confidence)。

所以最后的输出是

S×S×(B×5+C)

训练

输出参数格式

如图2所示,输出的(x,y,w,h)经过正则化后都在0-1范围内。

激活函数

模型在最后一层使用的是线性激活函数(linear activation function),其他层都使用的是下面这个函数

\phi=\left\{ \begin{aligned} x & \ \ \ \ if \ \ x>0 \\ 0.1x&\ \ \ \ otherwise \\ \end{aligned} \right. $$

损失函数

  • 作者认为平方和的方法对 定位损失和分类损失同等看待效果不好,另外,如果一个格子里没有目标,它的confidence=0,相比有目标的格子,它对梯度的影响过大,会导致训练过早发散。(不是很懂这个细节的原理)所以作者设置了权重来平衡

\lambda_{coord}=5 \ \ \ \ \ \lambda_{noobj}=0.5

 

损失函数: 

  • 此外,对大框和小框来讲,位置偏差的影响程度大小是不同的。比如同样是3mm的误差,对100mm×100mm来说,大部分内容还是在原有的框里,但5mm×5mm的框内容就会发生很大变化。所以作者对 w和h 的损失计算使用开方函数,如下图,在相同改变量下,w和h 越大,带来的损失越小。
    图3

     

  • YOLO限制每个格子只能预测一个目标。每个格子预测B个bbox,其中有最大IoU的bbox负责对此目标的检测。这样可以使bbox专门化(specialization),比如,某种纵横比和大小的bbox往往能在类似纵横比和大小的目标上取得最大IoU,看起来也就像是“专门”负责这类目标的检测器。
  • 图4  损失函数

     

 

其中(这个符号不知道怎么输入… …)应该是 0-1变量,如果第 i 个格子中有 object 且第 j 个负责这个 object 的话就取1,否则取0;没有下标 j 的符号也是 0-1变量,如果单元格内有 object 就取1,否则取 0。

 

YOLO为了防止过拟合使用了dropout(貌似刚被谷歌申请了专利 - -)和数据增强的办法。

限制

由于YOLO对bounding box 的空间限制,每一个格子只能预测 B 个bbox,并且每个格子只能有一种目标类别(原文写的是“can only have one class”,但只能有一种类别是什么意思?如果一个grid预测两个bbox,这俩bbox分别定位这个grid里的两只小鸟,那是不是就不存在鸟群的问题了?所以这里是不是写成“can only have one object”比较合适?我不确定,所以上面的文字加了绿色)。所以如果在一个格子中出现多个小物体,比如鸟群,YOLO就没有办法全部预测出来。

 

看YOLO的论文,总感觉很多细节没有写上去,可能需要分析代码才能深入理解。

 

参考:

        https://blog.csdn.net/liuxiaoheng1992/article/details/81983280

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值