滑动窗口目标检测的缺点
在滑动窗法中,取这些离散的位置的集合,然后在它们上面跑分类器。在这种情况下,这些边界框没有一个能完美匹配汽车位置。
还有,最完美的边界框甚至不是方形,而是稍微有点长方形。
得到更精准的边界框——YOLO算法
YOLO算法和图像分类+定位算法非常像(显式地输出边界框坐标),所以这能让神经网络输出边界框,可以具有任意宽高比,并且能输出更精确的坐标,而不会受到滑动窗法分类器的步长大小限制。
其次,这是一个卷积实现,我们并没有在3×3网格上跑9次算法,相反这是单次卷积实现。我们使用了一个卷积网络,有很多共享计算步骤,所以YOLO算法效率很高。
示例:
比如你的输入图像是100×100的,然后在图像上放一个网格( 实际会用更精细的网格,可能19×19)。
这样情况下,多个对象分配到同一个格子的概率就小得多。
把对象分配到一个格子的过程是:观察对象的中点,然后将这个对象分配到其中点所在的格子。所以即使对象横跨多个格子,也只会被分配到9个格子其中之一。
YOLO算法的基本思路:
使用图像分类和定位算法,然后将算法应用到9个格子上。
更具体一点是:
你需要这样定义训练标签,所以对于9个格子中的每一个指定一个标签y,y是8维向量(和定位算法一样)
YOLO算法的做法:
取两个对象的中点,然后将这个对象分配给包含对象中点的格子,所以左边的汽车就分配到第二行第一个格子上;这辆Condor中点在第二行第三个格子,分配给这个格子。
最后整张图片的输出尺寸是3×3×8
训练过程
有一个输入x就是这样的输入图像,然后有这些3×3×8的目标标签y。
用反向传播训练神经网络时,将任意输入x映射到这类输出向量y。
算法优点
- 神经网络可以输出精确的边界框。
- 这是一个卷积实现。实际上它的运行速度非常快,可以达到实时识别。
所以测试的时候,你做的是喂入输入图像x,然后跑正向传播,直到你得到这个输出y。
只要每个格子中对象数目没有超过1个,这个算法应该是没问题的。
编码边界框 b_x b_y b_h b_w
b_x、b_y、b_h、b_w单位是相对格子尺度的比例。
b_x和b_y必须在0和1之间(中点位于对象分配到的格子的范围内,否则这个对象就应该分配到另一个格子上)。
b_h和b_w可以大于1(取决于车在图片的大小)。
吴恩达老师这里就只给出一个合理的约定 用起来应该没问题。