使用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

### K-means聚类算法在目标检测中的应用 K-means聚类算法可以用于目标检测中的框(anchor box)生成过程。通过分析训练集图像中标注的目标尺寸分布,利用K-means聚类找到最具代表性的几种形状作为预定义的边界框模板。 #### 框生成原理 为了提高模型预测精度并加快收敛速度,在设计网络结构时通常会预先设定一组不同比例和大小的基础矩形区域——即框。这些框会在特征图上滑动形成密集采样点位,进而参后续回归操作以精确定位物体位置[^1]。 ```python import numpy as np from sklearn.cluster import KMeans def iou(box, clusters): """ 计算单个box所有cluster之间的iou值 参数: box (array): 单个真实框 [width, height] clusters (numpy array): 所有簇中心 [[w,h],...,[wn,hn]] 返回: float: 平均IOU得分 """ x = np.minimum(clusters[:, 0], box[0]) y = np.minimum(clusters[:, 1], box[1]) intersection = x * y box_area = box[0] * box[1] cluster_area = clusters[:, 0] * clusters[:, 1] iou_ = intersection / (box_area + cluster_area - intersection) return iou_ class YOLO_Kmeans: def __init__(self, num_clusters): self.num_clusters = num_clusters self.k_means_model = None def fit(self, boxes): k_mean = KMeans(n_clusters=self.num_clusters).fit(boxes) self.k_means_model=k_mean avg_iou=np.mean([np.max(iou(x,self.k_means_model.cluster_centers_)) for x in boxes ]) print(f"Avg IOU:{avg_iou:.2f}") def get_anchor_boxes(self): anchor_boxes=sorted(self.k_means_model.cluster_centers_.tolist()) formatted_anchors=[round(w), round(h)]for w,h in anchor_boxes ] return formatted_anchors ``` 此代码片段展示了如何基于给定的真实标注框集合`boxes`来计算最优数量的框,并输出平均交并比(Average IOU),以及最终得到的一系列整数形式表示的标准框尺寸列表。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值