获得更精确的边界框——YOLO algorithm
如果输入是一个100*100的图像,在图像上放一个网格(演示时使用3*3的网格,实际应用中使用更细致的网格)
算法思路:使用图像分类和定位算法,将算法应用到网格中。
具体用法:定义训练标签,对于9个格子中的每一个指定一个标签y,y是0706笔记中提到的8维向量,pc指是否有目标,bx,by,bh,bw指目标的位置,c1,c2,c3指目标的类别。将图片分为9个网格后,那么每个网格都有这么一个向量。
对于一个图片有两个对象的情况。YOLO算法是:取两个对象的中点然后将这个对象分配给包含对象中点的格子。用向量表示格子:左边的车就归属到(0,1)中,右边的车在(2,1)在设置标签中,除了上面两个格子中标签pc=1,其余格子中pc=0.其余格子x表示不在意。(0,1)和(2,1)的格子中
所以目标输出是3*3*8
如果现在要训练一个输入为100*100*3的神经网络,通过一个普通的卷积网络,最后得到一个3*3*8的输出。所以训练集就是有一个输入x,3*3*8的目标标签y,当使用反向传播训练神经网络时,将任意输入x映射到这类输出向量y。
算法的优点:神经网络可以输出精确的边界框,所以在测试时,只需要输入图像x,然后跑正向传播,直到可以都得到输出y。在y中就可以知道9个网格中哪个格子有目标以及目标的具体位置,当网格足够细致的情况下,不会出现一个网格中包含多个目标的情况,此时算法是有效的。把对象分配到一个格子的过程是,观察对象的中点,然后把这个对象分配到其中点所在的格子,即使对象在多个格子中,也只会被分配到其中一个格子中。
在边框的定义中,以目标所在的格子为标准,左上角为(0,0),右下角为(1,1)。bx,by,bw,bh则在其中进行定义,它们的单位是相对格子尺度的比例。**bx,by要求在0到1之间。但是bw,bh是可以大于1的。**对于参数还有其他更好的定义在研究论文中。
注意:首先,这个算法和图像分类和定位算法很像,可以显式输出边界框坐标,所以可以让神经网络输出边界框,有任意的宽高比,并且可以输出更精确的坐标,不会受到滑动窗法分类器的步长大小限制。其次,这是卷积实现,使用一个卷积网络,共享计算步骤,直接得到所需的所有结果。运行速度非常快,可以达到实时识别