Bounding Box
为什么要预测?
上一篇博客讲解了滑动窗口法的卷积实现,这个算法效率更高,但仍然存在问题,不能输出最精准的边界框,在滑动窗口法中,你取这些离散的位置集合,然后在它们上运行分类器,在这种情况下,这些边界框没有一个能完美匹配汽车位置。
其中一个能得到更精准边界框的算法是 YOLO 算法 ,YOLO(You only look once)意思是你只看一次,这是由 Joseph Redmon,Santosh Divvala,Ross Girshick 和 Ali Farhadi 提出的算法。 是这么做的,比如你的输入图像是 100×100 的,然后在图像上放一个网格。为了介绍起来简单一些,我用 3×3 网格,实际实现时会用更精细的网格,可能是 19×19。基本思路是使用图像分类和定位算法,将算法应用到 9 个格子上。(基本思路是,采用图像分类和定位算法,逐一应用在图像的 9 个格子中。)更具体一点,你需要这样定义训练标签,所以对于 9 个格子中的每一个指定一个标签𝑦,𝑦是 8 维的,和你之前看到的一样。 我们看看左上方格子,这里这个,里面什么也没有,所以左上格子的标签向量𝑦是[ 0???] 。然后这个格子的输出标签𝑦也是一样,这个格子(编号 3),还有其他什么也没有的格子都一样。 讲的更具体一点,这张图有两个对象,YOLO 算法做的就是,取两个对象的中点,然后将这个对象分配给包含对象中点的格子。所以即使中心格子(编号 5)同时有两辆车的一部分,我们就假装中心格子没有任何我们感兴趣的对象,所以对于中心格子,分类标签𝑦和这个向量类似,和这个没有对象的向量类似,即𝑦 = [ 0???] 。 绿色线框柱的格子和橙色先框柱的格子包含对象中点,对应的向量分别为最右边的绿色笔和蓝色笔写出的向量,𝑝𝑐 = 1,然后你写出𝑏𝑥、𝑏𝑦、𝑏?和𝑏𝑤来指定边界框位置,然后还有类别 1是行人,那么𝑐1 = 0,类别 2 是汽车,所以𝑐2 = 1,类别 3 是摩托车,则数值𝑐3 = 0。 所以对于这里 9 个格子中任何一个,你都会得到一个 8 维输出向量,因为这里是 3×3 的网格,所以有 9 个格子,总的输出尺寸是 3×3×8,所以目标输出是 3×3×8。 所以这个算法的优点在于神经网络可以输出精确的边界框,所以测试的时候,你做的是喂入输入图像𝑥,然后跑正向传播,直到你得到这个输出𝑦。
注意如何分配对象所在格子 把对象分配到一个格子的过程是,你观察对象的中点,然后将这个对象分配到其中点所在的格子,所以即使对象可以横跨多个格子,也只会被分配到 9 个格子其中之一,就是 3×3 网络的其中一个格子,或者 19×19 网络的其中一个格子。在 19×19 网格中,两个对象的中点(图中蓝色点所示)处于同一个格子的概率就会更低。
优点
- 它显式地输出边界框坐标,所以这能让神经网络输出边界框,可以具有任意宽高比,并且能
输出更精确的坐标,不会受到滑动窗口分类器的步长大小限制。 - 这是一个卷积实现,你并没有在 3×3 网格上跑 9 次算法,或者,如果你用的是 19×19 的网格,19 平方是 361 次,所以你不需要让同一个算法跑 361 次。相反,这是单次卷积实现,但你使用了一个卷积网络,有很多共享计算步骤,在处理这 3×3 计算中很多计算步骤是共享的,或者你的 19×19 的网格,所以这个算法效率很高。
- 因为这是一个卷积实现,实际上它的运行速度非常快,可以达到实时识别。
|