anchor boxs
在一个格子中可以检测多个对象
example:
在上面的图片中,行人和汽车中点在同一个格子中。按照之前的8个向量输出,c1,c2,c3只能有一个为1,即只能判定这个格子中一个类别。那么对于有两个类别和对象的情况,就需要引入anchor boxs。
思路:预先预定两个不同形状的anchor box,把预测结果和这两个anchor box关联起来。一般来说可能用到更多的anchor box,这里只举例两个。定义类别标签时,需要将输出变量重复两次,第一组为anchor box的参数,这里box1的形状和行人的检测框相似,那么第一组的8个数据就为行人的标签数据。第二组的8个数据为汽车的标签数据
总结:
原本:对于训练集图像中的每个对象,都根据那个对象中点位置,分配到对应的格子中,输出为3*3*8
.
anchor boxs 算法:每个对象都和之前一样分配到同一格子中,分配到对象中点所在的格子中,但是它还被分配到一个和对象形状交并比最高的anchor box中。主要是一个对象不是分配给了一个格子中,而是一对格子中,所以这时候输出y就是3*3*16
.anchor box的数量和y的维度大小是由对象类别决定的。
具体例子:对于上面的例子,如果在一个格子中有行人和汽车,那么
Y
=
[
1
b
x
b
y
b
h
b
w
1
0
0
1
b
x
b
y
b
h
b
w
0
1
0
]
Y=\left[\begin{array}{l} 1 \\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ 1 \\ 0 \\ 0 \\ 1\\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ 0\\ 1 \\ 0 \end{array}\right]
Y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1bxbybhbw1001bxbybhbw010⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤,如果在一个格子中只有汽车,那么
Y
=
[
0
x
x
x
x
x
x
x
1
b
x
b
y
b
h
b
w
0
1
0
]
Y=\left[\begin{array}{l} 0\\ x \\ x\\ x\\ x \\ x \\ x\\ x\\ 1\\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ 0\\ 1 \\ 0 \end{array}\right]
Y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0xxxxxxx1bxbybhbw010⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤,需要注意车的形状和box2的形状相似,所以在标签中在第二组中填入汽车相关数据,对于第一组数据,pc为0,其他数据为don‘t care。
正常情况下,在同一格子中出现两个或两个以上对象的情况较少,尤其是在使用更加细致的网格进行划分的时候。使用anchor boxs 算法的好处在于,它可以让你的算法更具有针对性,特别是在数据集有一些很高很瘦的对象(行人)和很宽的对象(汽车)。这样算法可以更有针对性的处理。部分输出单元就可以针对检测有一类特征的对象。
一般anchor box的形状由人工设定,5到10个形状就可以包含所检测对象的所有形状。但是在后面yolo算法中,一般使用K-means算法,可以将两类形状聚类,选择最具代表性的一组anchor boxs