要训练一个目标检测网络,必然需要准备数据集的标签。每个目标的标签向量如下所示。 y = [ p c b x b y b h b w c 1 c 2 c 3 ] (1) y =\begin{bmatrix} pc \\ bx \\ by \\ bh \\ bw \\ c1 \\ c2 \\ c3 \\ \end{bmatrix} \tag{1} y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡pcbxbybhbwc1c2c3⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤(1)
其中pc表示是否存在目标(1:存在;0:反之)。bx,by表示目标中心点坐标,bw,bh表示目标宽高。c1,c2,c3表示是否属于对应类别。
L ( y ^ , y ) = ( y 1 ^ , y 1 ) 2 + ( y 2 ^ , y 2 ) 2 + . . . + ( y 4 ^ , y 4 ) 2 + . . . + ( y 8 ^ , y 8 ) 2 L(\hat{y}, y) = (\hat{y_1}, y_1)^2 + (\hat{y_2}, y_2)^2 + ... + (\hat{y_4}, y_4)^2 + ... + (\hat{y_8}, y_8)^2 L(y^,y)=(y1^,y1)2+(y2^,y2)2+...+(y4^,y4)2+...+(y8^,y8)2 y1即pc,可以使用逻辑回归计算损失
y2~y4,坐标bx, by, bh, bw的损失,可以使用平方差
y5~y8,每个类别损失,可以转换softmax
y = [ p c l 1 x l 1 y l 2 x l 2 y . . . l n x l n y ] (1) y =\begin{bmatrix} pc \\ l_1x \\ l_1y \\ l_2x \\ l_2y \\ ... \\ l_nx \\ l_ny \\ \end{bmatrix} \tag{1} y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡pcl1xl1yl2xl2y...lnxlny⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤(1) 人脸landmark为例,即是64个特征点,共有64*2+1=129维。
通过不同大小的window,滑动遍历整幅图片,每次滑动都将窗口内区域内送入网络中,预测是否存在目标(0/1)。
第一层FC层,使用5516的卷积,最终可以得到11400的特征图(此处卷积实际为 40055*16)
如上图,假设,输入的图片是16 * 16的3通道RGB图片,采用的滑动窗口是14 * 14,步长为2。也就是从图片中抠出了4个14 * 14的区域,分别送入到网络中,经过5 * 5的卷积核最终得到12 * 12的特征图,逐层运算,最终得到是一个2 * 2 * 4的特征向量。分别对应了四个滑动窗口的预测结果,也就实现了滑动窗口检测效果。
这种卷积的方式,相当于一次对所有的窗口划分区域继进性预测,如果将每块区域分别输入到网络中进性预测,计算次数增加,而且会有很多重叠区域的计算是重复的。所以能在很大程度上提升算法的效率。 但是,其预测的物体边界,也就是bounding-box不会很精确。
Bounding box代表性算法就是YOLO(you only look once)。 和滑动窗口的方式不同,YOLO将图片分为3*3,9个网格区域,只有物体的中点所在的网格区域,才认为是有效的。如上图只有绿色和黄色的区域是有效的,其标签则如图右侧对应所示。
对每个网格应用卷积方式实现的目标定位和检测算法,最终得到输出是3 * 3 * 8的向量,即每个网格,都得到一个8维的预测结果(实际应用中可能使用19 * 19,更为精细)。
实际上,和滑动窗口一样,并不是每个区域都输入到网络中进行多次计算的,而是将整幅图像喂到卷积网络中,一次计算得到每个区域的结果,所以叫You only look once。
在YOLO中,bounding box位置信息的编码方式是以物体所在区域左上角为原点(0, 0),右下角为(1, 1)。
以上图中右侧汽车为例,bounding box(bx, by, bh, bw): (0.4, 0. 3, 0.9, 0.5),即中心点位置,以及宽高在所在区域的位置比例。
其中bh,bw可能大于1,也就意味着该物体超出了所在的ROI区域。
上述YOLO的只能解决一个区域只包含一个目标的情况,为了解决一个区域内包含多个目标的情况,提出了Anchor Box算法。即根据数据集中所有目标尺寸的大小,预先定义好一系列大小不同的anchor box。可以人工选取,或者使用K-Means对所有的目标框进行聚类,得到K类不同尺寸的Anchor box。一般取5~10个。 假设只选取两类Anchor box,跟别对应于高瘦的人Anchor box1,和矮胖的车Anchor box2。此时每个目标除了需要分配一个中点所在的网格区域外,还需要一个IOU最大的Anchor box。此时网络的输出就是2 * 8维(n个anchor box则结果就是n*8维)。如图中中下区域,可以得到右侧中间列所示结果。如果某个网格只有一个目标,且该目标和anchor box2的IOU最大,则得到最后一列的结果。