使用K-means算法对anchors进行聚类--原理与实操

1.为何需要K-means

在基于anchors的目标检测算法中,anchors一般都是通过人工进行设计的,例如SSD,Faster-RCNN,设计了3种大小、3种宽高比的anchors。但是通过人工选定anchors会有一个很明显的弊端,那就是不能够和好的适应不同的数据集,如何anchors和目标数据集种待检测的物体尺寸差异较大,则会对模型的检测效果产生很大影响。因此通过某种算法,基于数据集中待检测物体的尺寸计算出anchors的大小,明显更加的合理。

2.K-means算法的原理

标准的K-means是一种无监督的聚类方法,且聚类的簇个数k需要事前给定,因此k的设置对于聚类的效果也至关重要,此外,初始聚类中心的选定,对于最终的聚类结果也会产生很大的影响。

2.1.标准的K-means算法流程

  • 1.选定簇个数k,以及初始化簇中心位置
  • 2.对于数据集中的每一个样本,计算其到每个簇中心的距离,将该样本归类到距离最小的簇中
  • 3.重新计算每个簇的中心位置
  • 4.重复步骤2、3直到簇中心不再发生变化,或者迭代达到指定次数

2.2.anchors K-means

选定box的宽和高作为特征,且由于图片的宽和高不唯一,因此需要先对图片的宽和高进行归一化,也就是对图片进行resize。但是直接使用resize将导致图片产生变形,这对于物体的特征提取肯定会产生影响,因此可以使用lettet box resize。

2.3. lettet box resize

基本思路是,假设原始图片的尺寸为h0和w0,目标图片的尺寸为h1和w1,则取scale=min(h0/h1, w0/w1),随后将原始图片缩放到h3=h0scale,w3=w0scale,然后将缩放后的图片填充到h1,w1的尺寸即可。

2.4.度量选择

如果直接使用K-means中的原始欧氏距离作为度量标准,那么产生的一个问题就是,大box簇产生损失将大于小box簇产生的损失,但是由于我们只关心anchors和box的IOU,不关心box的尺寸,因此使用IOU作为度量标注明显更合适。
IOU的计算:
假设anchors=(w_a, h_a),box=(w_b, h_b),则有:
在这里插入图片描述
在理解时,可先假设两个矩形框具有相同发的左上角坐标。
在这里插入图片描述
可见IOU的取值在0到1之间,连个框的重合度越高,其IOU也就越大,因此我们的评价指标可选定为:
在这里插入图片描述
总体看下来,其和标准的K-means的不同就在于度量标准的差异。

3.K-means++算法的原理

上面有提到,K-means算法中对于初始点的选择会对整个算法产生很大影响,因此K-means++致力于减小初始点的选择对算法带了的影响。总的来说,K-means++是一种优化过种子点选择的K-means算法,其种子点选择的思路是:种子点相距越远越好。
步骤:

  • 1、从输入的数据点中选择一个样本点作为第一个簇的中心点
  • 2、计算每个样本到其最近簇中心之间的距离D(x)
  • 3、随机选择一个新的样本点作为新的簇中心,选择的原则是:距离最近簇中心越远的点被选择的几率越大
  • 4、重复步骤3、4,直到选出k个簇中心
  • 5、根据K-means算法对进行优化
    第2、3步中,选择新点的具体过程解释如下:
  • 1、对于每一个点,计算其和最近的簇中心的距离D(x),并保存在一个数组中
  • 2、计算这些距离之和sum(D(x))
  • 3、在0-1之间去一个随机值w,用sum(D(x))*w=r来得到一个阈值r
  • 4、初始话currSum=0,将D(x)数组中的值按顺序逐个加到currSum中,直到currSum>r为止,则当前的样本点即是所想选的中心点
    这种做法的基本思想是,距离最近中心点越远的点被选中的几率就越大,这样被选出来的中心点就可以尽可能的分散。

4.如何确定anchors的个数

画出avg-iou随k值变化的曲线,一般来说k值越大,avg-iou越大,当k等于样本个数时,avg-iou=1
在这里插入图片描述
elbow方法时常用来选定最佳k值的方法,他的思想是:当某个k值使得avg-iou曲线的斜率发生较大变化时,选定该k值。但是,在选择k值时还应当综合考虑召回率,也就是avg-iou的大小。

参考资料: https://blog.csdn.net/hrsstudy/article/details/71173305 https://zhuanlan.zhihu.com/p/109968578 https://zhuanlan.zhihu.com/p/95291364