yolo中anchor值的解释
anchor
意味着先验思想,是为了给神经网络拟合box
减轻负担。下面就来讲解一下anchor
的计算。
公式
首先我们得先理解yolo
输出boundary box
的计算过程:
\[
\begin{aligned}
b_x&=\sigma(t_x)+c_x \\
b_y&=\sigma(t_y)+c_y \\
b_w&=p_w e^{t_w} \\
b_h&=p_h e^{t_h}
\end{aligned}
\] 解释: \(t_x,t_y,t_w,t_h\)为yolo
预测输出结果。
\(c_x,c_y\)为当前cell
右上角的坐标。
\(p_w,p_h\)是当前anchor
的宽高。
\(b_x,b_y,b_w,b_h\)则是最终yolo
预测出的boundary box
。
分析
通过上图我们知道,实际上anchor
存在的意义就在于调节网络输出与真实box
的比例关系.
制作label
的过程: \[
\begin{aligned}
Label_w&= \frac{True_w}{p_w} \\
Label_h&= \frac{True_h}{p_h} \\
\end{aligned} \]
然后我们训练的时候就是拟合\(e^{t_w}\)到\(Label_w\) \[\begin{aligned} \because b_w&=p_w e^{t_w} \\ b_h&=p_h e^{t_h} \\ \therefore e^{t_w} &\rightarrow Label_w \\ e^{t_h} &\rightarrow Label_h \\ \end{aligned} \]
所以通过设置合适的\(p_w,p_h\)值,我们可以把\(Label_w,Label_h\)控制在\(1\)左右.这样使得神经网络只需要在预测\(w,h\)时只需要接近\(1\)就可以取得较好的效果.
制作anchor
知道了原理,我们就可以来选取合适的anchor
,我这里是自己写了个kmeans
,然后将其中的距离计算改成了iou
的函数:
现在我们加载了自己的anchor list
,然后测试一下:
def test_label_wh(): |
输出:
w_max: 1.159 ,w_min: 1.159 ,h_max: 0.906 ,h_min: 0.906 |
我们的label
中\(w,h\)值都在\(1\)左右了,说明这个anchor list
是合适的~