anchor box

一、思路

        我们建立 anchor box 这个概念, 是为了处理两个对象出现在同一个格子的情况, 实践中这种情况很少发生, 特别是如果你用的是 19×19 网格而不是3×3 的网格, 两个对象中点处于 361 个格子中同一个格子的概率很低, 确实会出现, 但出现频率不高。 也许设立 anchor box 的好处在于 anchor box 能让你的学习算法能够更有征对性,特别是如果你的数据集有一些很高很瘦的对象, 比如说行人, 还有像汽车这样很宽的对象,这样你的算法就能更有针对性的处理, 这样有一些输出单元可以针对检测很宽很胖的对象,比如说车子, 然后输出一些单元, 可以针对检测很高很瘦的对象, 比如说行人。

      你应该怎么选择 anchor box 呢? 人们一般手工指定 anchor box 形状, 你可以选择 5 到 10 个 anchor box 形状, 覆盖到多种不同的形状, 可以涵盖你想要检测的对象的各种形状。 还有一个更高级的版本, 我就简单说一句, 你们如果接触过一些机器学习, 可能知道后期 YOLO 论文中有更好的做法, 就是所谓的 k-平均算法, 可以将两类对象形状聚类, 如果我们用它来选择一组 anchor box, 选择最具有代表性的一组 anchor box, 可以代表你试图检测的十几个对象类别, 但这其实是自动选择 anchor box 的高级方法。 如果你就人工选择一些形状, 合理的考虑到所有对象的形状, 你预计会检测的很高很瘦或者很宽很胖的对象, 这应该也不难做。

一、目标检测网络之 YOLOv3

       https://www.cnblogs.com/makefile/p/YOLOv3.html

            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
 

猜你喜欢

转载自blog.csdn.net/as472780551/article/details/81169090
Box