机器人小学期(1):YOLOv1

原文链接:You Only Look Once: Unified, Real-Time Object Detection

机器人小学期做了一个奇怪的项目,大概是用v-rep这个平台仿真了一个简化版植物大战僵尸(当然,除了有植物有僵尸并且植物会打僵尸,僵尸试图吃点植物外没有什么相同之处)。事实证明使用一个机器人仿真平台来搞游戏虚拟器还是非常灾难的。

我在项目里负责目标检测部分,简单来说,就是给植物装了一个视觉传感器,我要使用视觉传感器传回来的图像,检测出图像中每个僵尸的bounding box。由于对检测速度要求比较高,因此就使用了YOLO这个网络。

YOLO已经有了三版(v1、v2、v3)。每一个版本在上一版本的基础上做出了一些修改,使得速度更快,效果更好。本文只包括YOLOv1,也就是最早的一版,和最新的YOLOv3相比,还是有不少差异的。

YOLOv1

回忆R-CNN的做法,R-CNN首先使用regional proposal方法选出一些可能的bounding box,然后对这些bounding box做分类,最后再对这些bounding box做筛选、微调。R-CNN把object detection这个任务分成了几个部分,包括选择bounding box和分类等,每部分都由一个专门的网络负责。这样带来的问题是,速度慢并且很难优化。因此YOLO针对这个问题作出了改进:在YOLO里,我们将整张图片作为输入,获得bounding box和分类都在同一个网络中完成(look once),也就是说我们把一整个detection部分看成了一个回归问题。这个做法带来的好处包括:

  • 速度快:Titan X上可以做到45fps,fast version可以做到150fps。
  • 直接使用整张图片使得我们可以获得更多的全局信息,相比于Fast R-CNN,YOLO的背景识别错误更少。
  • 泛化能力更强。

网络

结构

YOLOv1有两种网络,一个是24个卷积层的YOLO,还有一个简化版的只有9个卷积层的Fast YOLO。下面以24个卷积层的版本为例。

Network

网络包含24个卷积层和2个全连接层,通过卷积层提取特征,然后用全连接层预测概率和坐标。

在具体实现中,除了最后一层的激活函数为ReLU外,其他各层的激活函数均为leaky ReLU,定义如下:

$$\phi(x)=
\begin{cases}
x, &\text{if $x>0$} \\
0.1x, &\text{otherwise} \
\end{cases}$$

输入和输出

网络将整个图片作为输入,最后输出一个大小为\(S*S*(B*5+C)\)(注意Tensor大小与v3有所不同)的Tensor。

我们对于这个输出Tensor做一点解释。我们将输入图像划分成\(S*S\)的网格,对于网格中的每个格子,我们要预测\(B\)个中心落在这个格子里的bounding box。每个bounding box有5个参数,分别是中点的\(x\)、\(y\)坐标以及宽度\(w\)和高度\(h\),此外,还包含一个置信值\(Pr(Object)*IOU_{pred}^{truth}\)表示这个bounding box里包含一个物体的概率乘上它和真实值的IOU。最后,对于每个格子,我们还要预测\(C\)个参数,其中第\(i\)个参数\(Pr(C_i|Object)\)表示在格子里有物体的情况下,这个物体属于第\(i\)类的概率。

根据置信值和属于各类别的概率,我们可以求出各类别的置信值:

$$Pr(Class_i|Object)*Pr(Object)*IOU_{pred}^{truth}$$

额外说明一点,\(x\)、\(y\)是相对这个格子的坐标,并且归一化到了\([0,1]\)区间;宽度\(w\)和高度\(h\)是相对于正常图片的,也归一化到了\([0,1]\)区间。


输出

损失函数

最后,我们还需要定义损失函数。

为了便于优化,我们使用误差的平方和作为损失函数,但是这会带来两方面的问题:

  • 定位错误和分类错误同等对待。
  • 在一张图片中往往有很多格子是不包含物体的,这写格子的置信值会逐渐趋于0,这会淹没那些包含物体的格子的误差。(置信值confidence score为为\(Pr(Object)*IOU_{pred}^{truth}\)。)
  • 不同尺寸的物体在计算错误时也被平等对待了。但是很明显,相同的bounding box的误差出现在预测尺寸较大的物体可能并不显眼,但是如果出现在预测尺寸较小的物体上时就会很严重。

为了解决前两个问题,我们赋予定位错误和预测是否包含物体的错误不同的权重,其中定位错误的权重\(\lambda_{coord}=5\),预测是否包含物体的错误的权重\(\lambda_{noobj}\)。

为了解决第三个问题,我们不直接使用bounding box的高度\(w\)和宽度\(h\)计算,而是使用它们开根号后计算误差。

最后,我们得到一个形如下式的损失函数,

$$\begin{align} &\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=1}^{B}\mathbb{1}_{ij}^{obj}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] \\ +&\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=1}^{B}\mathbb{1}_{ij}^{obj}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2] \\ +&\sum_{i=0}^{S^2}\sum_{j=1}^{B}\mathbb{1}_{ij}^{obj}(C_i-\hat{C}_i)^2+\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=1}^{B}\mathbb{1}_{ij}^{obj}(C_i-\hat{C}_i)^2 \\ +&\sum_{i=1}^{S^2}\mathbb{1}_{i}^{obj}\sum_{c\in classes}(p_i(c)-\hat{p}_i(c))^2 \end{align}$$

\(\mathbb{1}_{ij}^{obj}\)表示第\(i\)个格子里的第\(j\)个预测“负责”预测这个物体,\(\mathbb{1}_i^{obj}\)表示物体\(obj\)出现在第\(i\)个格子里。(“负责”预测这个物体是指这个预测的bounding box和某个真实值的IOU是所有预测中最大的,IOU为Intersection of Units,即两个bounding box面积的交/并。)

机器人小学期(2):YOLOv2 2018-7-22

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×