anchor box的生成:yolo网络中使用k-means算法在训练集中所有样本的真实框(ground truth)中聚类,得到具有代表性形状的宽高(维度聚类)。但是具体几个anchor才是最合适的,作者采用实验的方式,分别用不同数量的anchor应用到模型,然后在模型的复杂度和高召回率之间折中找到最优的那组anchor box,最终得出N个anchor box最佳。
// # 模型训练时设置的anchor_box比例
// BIAS_W = [26, 67, 72, 189, 137, 265]
// BIAS_H = [48, 84, 175, 126, 236, 259]
float VOC[12]={26, 67, 72, 189, 137 , 265, 48, 84, 175, 126, 236, 259};
对于yolo-fast模型,其输出有两个,维度分别对应为1*10*10*75和1*20*20*75,很容易看出这两个输出应该是后者比前者更适合检测小目标物体,那么在应用anchor值的时候,应该是两个输出分别对应三组anchor box的值,那么根据yolov3模型感受野与anchor box的对应情况上来分析,此处yolo-fast模型1*10*10*75是输出应该对应后面三组,即[189,126],[137,236],[265,259],更适合检测大目标,同理1*20*20*75是输出应该对应前面三组,即[26,48],[67,84],[72,175],更适合检测小目标,下面是我写的针对yolo-fast模型get_region_box函数的调用形式和函数原型:
float get_region_box(float *output, int offsetx , int offsety , float *box , float biasw , float biash)
{
int w = 320, h = 320;
int iw = 10, ih = 10;
box[0] = ((float)offsetx + logistic(output[0])) / (float)iw * w;
box[1] = ((float)offsety + logistic(output[1])) / (float)ih * h;
box[2] = (std::exp(output[2]) * biasw / img_size_w) * (float)w;
box[3] = (std::exp(output[3]) * biash / img_size_h) * (float)h;
}
get_region_box(output + i * 25, offset_x, offset_y, boxes + i * 4, VOC[l+3], VOC[l+9]);
下面是我测试的用同一张图片测两个输出的绘制检测框的对比情况,20*20的输出好像画框的精确度更精准一点,其实他的优势在于小目标检测,我使用的图片可能不是很合适,像使用鸟群图片应该更直观。