1.Kmeans介绍

kmeans聚类属于无监督学习算法,目的是将一组数据分成k组,称之为k个簇,计算出这k组中每组的中心。

从百度图片上找了一张图片,大概就是这样,分成下图中的三组,并且找出每一组的中心。

算法思想:

(1)从数据集中随机选取k个点,作为初始化的簇中心

(2)计算每个点到簇中心的距离,并将该点分配到最近的簇中(与那一簇中心的距离最近)

(3)对于2步中重新分配好的簇,重新计算这个簇的中心(大概就是求横纵坐标的均值做为新的中心)

(4)重复2, 3步,直到新计算的簇中心不再变化为止

2.kmeans应用于anchors box计算

anchors box用于预测bounding box,当anchors box更接近真实的宽高时,模型的性能也就越好。

kmeans应用在anchors box的计算就是为了计算出更接近真实宽高的k对值。

与上边的kmeans不同的是不能用欧式几何距离进行分簇,而是采用IOU交并比来作为衡量每队值应该划分进那一簇。

不知道IOU的看这篇:https://blog.csdn.net/weixin_39025871/article/details/105209726

 IOU可以很好的表示出两对宽高的接近情况,IOU取值为[0,1]之间,IOU越大就表示这两对宽高比越贴近,反之越小表示这两对宽高比差别越远。(放进上边介绍中,就代表,IOU越大,就是两个点离得越近,越小就是两个点离得越远)

在kmeans里,"距离" 就用 1 - IOU表示,划分时选择值较小的,也就代表了介绍里的距离近。

算法流程和介绍里的基本类似,就是将距离换成 1-IOU

3.kmeans求解anchors代码:

代码来源:GitHub - qqwweee/keras-yolo3: A Keras implementation of YOLOv3 (Tensorflow backend)    我加上了一些注释

import numpy as npclass YOLO_Kmeans:def __init__(self, cluster_number, filename):self.cluster_number = cluster_numberself.filename = filenamedef iou(self, boxes, clusters):  # 1 box -> k clusters  计算IOUn = boxes.shape[0]k = self.cluster_numberbox_area = boxes[:, 0] * boxes[:, 1]box_area = box_area.repeat(k)box_area = np.reshape(box_area, (n, k))cluster_area = clusters[:, 0] * clusters[:, 1]cluster_area = np.tile(cluster_area, [1, n])cluster_area = np.reshape(cluster_area, (n, k))box_w_matrix = np.reshape(boxes[:, 0].repeat(k), (n, k))cluster_w_matrix = np.reshape(np.tile(clusters[:, 0], (1, n)), (n, k))min_w_matrix = np.minimum(cluster_w_matrix, box_w_matrix)box_h_matrix = np.reshape(boxes[:, 1].repeat(k), (n, k))cluster_h_matrix = np.reshape(np.tile(clusters[:, 1], (1, n)), (n, k))min_h_matrix = np.minimum(cluster_h_matrix, box_h_matrix)inter_area = np.multiply(min_w_matrix, min_h_matrix)       # 交集result = inter_area / (box_area + cluster_area - inter_area)  #交并比IOUreturn resultdef avg_iou(self, boxes, clusters):          #计算 求完anchors后的准确率accuracy = np.mean([np.max(self.iou(boxes, clusters), axis=1)])return accuracydef kmeans(self, boxes, k, dist=np.median):box_number = boxes.shape[0]distances = np.empty((box_number, k))last_nearest = np.zeros((box_number,))np.random.seed()clusters = boxes[np.random.choice(                    #初始化簇中心,随机选取k个宽高作为簇中心box_number, k, replace=False)]  # init k clusterswhile True:distances = 1 - self.iou(boxes, clusters)          #距离 用 1-IOUcurrent_nearest = np.argmin(distances, axis=1)if (last_nearest == current_nearest).all():        #比较本次与上一次的k个簇中心是否变化break  # clusters won't change                 #没有变化则停止迭代更新for cluster in range(k):clusters[cluster] = dist(  # update clustersboxes[current_nearest == cluster], axis=0)last_nearest = current_nearestreturn clustersdef result2txt(self, data):         #将计算结果写进yolo_anchors.txtf = open("yolo_anchors.txt", 'w')row = np.shape(data)[0]for i in range(row):if i == 0:x_y = "%d,%d" % (data[i][0], data[i][1])else:x_y = ", %d,%d" % (data[i][0], data[i][1])f.write(x_y)f.close()def txt2boxes(self):               #从训练集文件中读取并计算实际的宽 高f = open(self.filename, 'r')dataSet = []for line in f:infos = line.split(" ")length = len(infos)for i in range(1, length):width = int(infos[i].split(",")[2]) - \int(infos[i].split(",")[0])height = int(infos[i].split(",")[3]) - \int(infos[i].split(",")[1])dataSet.append([width, height])result = np.array(dataSet)f.close()return resultdef txt2clusters(self):                 # 计算 anchorsall_boxes = self.txt2boxes()        # 加载实际数据 宽高result = self.kmeans(all_boxes, k=self.cluster_number)result = result[np.lexsort(result.T[0, None])]self.result2txt(result)print("K anchors:\n {}".format(result))print("Accuracy: {:.2f}%".format(self.avg_iou(all_boxes, result) * 100))if __name__ == "__main__":cluster_number = 9                  # 分成k组,根据需要自己设定filename = "2012_train.txt"         #训练集文件,格式为: 路径 [左上 右下 类别](5个值) ...kmeans = YOLO_Kmeans(cluster_number, filename)kmeans.txt2clusters()

YOLO利用kmeans聚类算法计算anchors box(原理介绍及代码)相关推荐

  1. java iris_利用K-Means聚类算法实现对iris.data.ulab

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用K-Means聚类算法实现对iris.data.ulabel数据的聚类,这是在网上找到如果要换成我的iris.date iris.date.ulabl ...

  2. 『ML』利用K-Means聚类算法对未标注数据分组——《机器学习实战》学习笔记(Ch10)

    本节用Python实现K-Means算法,对未标注的数据进行聚类. 在做完聚类后,如何对于聚类结果进行评估?请看 用Python实现聚类效果的评估(轮廓系数.互信息) 导航 K-Means简介 代码实 ...

  3. K-means 聚类算法的应用案例实战(含代码和图示)

    1.算法优缺点 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 2.算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相 近关系 ...

  4. K-Means聚类算法及其python实现(已附上代码至本博客)

    目录 一.算法公式讲解 二.算法流程 三.算法实现代码 四.代码结果分析 五.K-Means库函数 六.K-Means算法时间复杂度 一.算法公式讲解 对于 n代表了x有n维,x上标j表示第j维的特征 ...

  5. 利用K-Means聚类进行航空公司客户价值分析

    1.背景与挖掘目标 1.1背景 航空公司业务竞争激烈,从产品中心转化为客户中心. 针对不同类型客户,进行精准营销,实现利润最大化. 建立客户价值评估模型,进行客户分类,是解决问题的办法 1.2挖掘目标 ...

  6. 基于聚类的“图像分割”案例——K-means聚类算法

    图像分割:利用图像的灰度.颜色.纹理.形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性.然后就可以将分割的图像中具有独特性质的区域提取出 ...

  7. python音频聚类_用K-means聚类算法实现音调的分类与可视化

    本文由 伯乐在线 - ggspeed 翻译,耶鲁怕冷 校稿.未经许可,禁止转载! 英文出处:jared polivka.欢迎加入翻译组. 利用 K-means 聚类算法来聚类和可视化音调 Galvan ...

  8. k-means聚类算法从入门到精通

    k-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 . 目录 1. k-means聚类算法原理 2. k ...

  9. 【白话机器学习】算法理论+实战之K-Means聚类算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

最新文章

  1. 兼容IE低版本的文件上传解决方案
  2. python用哪个软件好-写 Python 哪个编辑器 / IDE 最好用?
  3. 对kubernetes的认识
  4. Java并发基础02. 传统线程技术中的定时器技术
  5. 如何查看Linux版本号(内核版本号和发行版本号)
  6. STL_set/vector/deque
  7. bgp状态idle什么原因_当bgp的邻居状态机处于什么状态是,标志着与邻居的tcp连接已经正常建立...
  8. 解决applet覆盖遮罩层div的问题
  9. python数据生成可视化_Python数据分析:手把手教你用Pandas生成可视化图表
  10. 从0到60%:中国在环球指数当中的崛起
  11. 疯狂Java讲义笔记
  12. HDU 5745 La Vie en rose 字符串匹配(暴力)
  13. 暗色调Xshell配色方案
  14. Python 无监督学习实用指南:1~5
  15. Java实现短链接URL生成
  16. tablepc是什么平板电脑_给大家介绍一下,这是我新朋友三星Galaxy Tab S3
  17. 汽车行业如何借助微信小程序引流
  18. 投资 - 出口 - 消费
  19. 设备驱动程序是什么?为什么要有设备驱动程序?用户进程怎样使用驱动程序?
  20. Android多渠道打包方案

热门文章

  1. Apache Hudi 是Uber 大数据存储系统
  2. backbone, AngularJS, EmberJS 简单比较
  3. django 获取环境变量_django 环境变量配置过程详解
  4. 米奇emoji_一些常用的 Emoji 符号(可直接复制)
  5. 如何将zipoutputstream返回_嫦娥五号返回器要“跳”一下再回地球!这一“跳”大有讲究...
  6. html 网络请求 json数据,写一个json格式API,http请求接收json数据
  7. 如何将3dmax结合前端_如何将阅读与写作结合
  8. 笔记本电脑投屏到电视_电脑怎么投屏到电视?掌握这3个方法就够了
  9. JScript.NET(JScript 8.0)编程简介
  10. js+svg实现的一个环图