anchor box聚类
fast rcnn和rfcn中使用的都是默认的anchor box设置,都是9种,比例为0.5 、1、 2,大小为128、256、512。但我的数据集的gt框更小,需要找到适合我的数据集的anchor box尺寸。
yolo9000提出了用kmeans聚类算法来找到合适的anchor box尺寸。
这篇博客介绍了yolo9000是怎么实现的:http://blog.csdn.net/hrsstudy/article/details/71173305?utm_source=itdadao&utm_medium=referral。
源代码:https://github.com/PaulChongPeng/darknet/blob/master/tools/k_means_yolo.py,这个代码库里还有整个yolo9000的代码中文解释,很好,可以拿来学习。
label_path = "/raid/pengchong_data/Data/Lists/paul_train.txt"将这个改成你自己数据的地址,就可以跑这个脚本。
跑这个脚本,需要把gt框从左上右下坐标转换成中心点、宽度、高度的格式,实际上也只用到了宽度和高度。
我使用的是将原始宽度高度除以了图片的宽度高度,因为我觉得这样可以保证他们在同一个分布
如果宽度高度直接是原始的宽度高度,grid_size就设置为1;如果是相对于原图像的大小,grid_size就设置为相应比例,两个比例:960、600。
实际上,跑的过程中发现,loss只在前几个迭代期减小,后面loss就一直增大了。无论是用原始的宽高度,还是用的相对于原图像的宽高度,都出现了这种现象。最后我选择了让loss降最低的那几个坐标为最后的结果。
跑的过程中还发现,随着k值的增加,loss是在减少的,但对于单个k值,loss还是先降低后升高。
最终我选择了k为9,这与rfcn中9个anchor是对应的。
得到9个坐标分别是:(18,17)、(26,25)、(42,27)、(49,40)、(67,66)、(86,39)、(119,80)、(182,155)、(323,281)
这9个坐标表示的是9种长宽,不是中心点。因为scale,ratio最终求的就是w和h
采用了两种方式进行anchor box的改变:
1.将scals从(8,16,32)改成(1,2,4,8,16),这种得到的ap为0.8435
2.
anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales) for i in xrange(ratio_anchors.shape[0])])
直接在这段代码后面添加anchors = 得到的那9个坐标,当然需要将9个坐标相应变换
比如(18,17)就改成(-1.5,-1,16.5,16)
这种得到的ap为0.8442
当然,修改anchor box还要改一些代码,需要修改哪些文件,直接搜索整个工程文件哪些引用了generate_anchors这个函数的就可以了
除此之外,还需要修改train、test的porotxt
可以参考这个博客:http://www.cnblogs.com/whu-zeng/p/7517480.html