YOLO利用kmeans聚类算法计算anchors box(原理介绍及代码)
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(原理介绍及代码)相关推荐
- java iris_利用K-Means聚类算法实现对iris.data.ulab
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用K-Means聚类算法实现对iris.data.ulabel数据的聚类,这是在网上找到如果要换成我的iris.date iris.date.ulabl ...
- 『ML』利用K-Means聚类算法对未标注数据分组——《机器学习实战》学习笔记(Ch10)
本节用Python实现K-Means算法,对未标注的数据进行聚类. 在做完聚类后,如何对于聚类结果进行评估?请看 用Python实现聚类效果的评估(轮廓系数.互信息) 导航 K-Means简介 代码实 ...
- K-means 聚类算法的应用案例实战(含代码和图示)
1.算法优缺点 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 2.算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相 近关系 ...
- K-Means聚类算法及其python实现(已附上代码至本博客)
目录 一.算法公式讲解 二.算法流程 三.算法实现代码 四.代码结果分析 五.K-Means库函数 六.K-Means算法时间复杂度 一.算法公式讲解 对于 n代表了x有n维,x上标j表示第j维的特征 ...
- 利用K-Means聚类进行航空公司客户价值分析
1.背景与挖掘目标 1.1背景 航空公司业务竞争激烈,从产品中心转化为客户中心. 针对不同类型客户,进行精准营销,实现利润最大化. 建立客户价值评估模型,进行客户分类,是解决问题的办法 1.2挖掘目标 ...
- 基于聚类的“图像分割”案例——K-means聚类算法
图像分割:利用图像的灰度.颜色.纹理.形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性.然后就可以将分割的图像中具有独特性质的区域提取出 ...
- python音频聚类_用K-means聚类算法实现音调的分类与可视化
本文由 伯乐在线 - ggspeed 翻译,耶鲁怕冷 校稿.未经许可,禁止转载! 英文出处:jared polivka.欢迎加入翻译组. 利用 K-means 聚类算法来聚类和可视化音调 Galvan ...
- k-means聚类算法从入门到精通
k-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 . 目录 1. k-means聚类算法原理 2. k ...
- 【白话机器学习】算法理论+实战之K-Means聚类算法
1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...
最新文章
- 兼容IE低版本的文件上传解决方案
- python用哪个软件好-写 Python 哪个编辑器 / IDE 最好用?
- 对kubernetes的认识
- Java并发基础02. 传统线程技术中的定时器技术
- 如何查看Linux版本号(内核版本号和发行版本号)
- STL_set/vector/deque
- bgp状态idle什么原因_当bgp的邻居状态机处于什么状态是,标志着与邻居的tcp连接已经正常建立...
- 解决applet覆盖遮罩层div的问题
- python数据生成可视化_Python数据分析:手把手教你用Pandas生成可视化图表
- 从0到60%:中国在环球指数当中的崛起
- 疯狂Java讲义笔记
- HDU 5745 La Vie en rose 字符串匹配(暴力)
- 暗色调Xshell配色方案
- Python 无监督学习实用指南:1~5
- Java实现短链接URL生成
- tablepc是什么平板电脑_给大家介绍一下,这是我新朋友三星Galaxy Tab S3
- 汽车行业如何借助微信小程序引流
- 投资 - 出口 - 消费
- 设备驱动程序是什么?为什么要有设备驱动程序?用户进程怎样使用驱动程序?
- Android多渠道打包方案
热门文章
- Apache Hudi 是Uber 大数据存储系统
- backbone, AngularJS, EmberJS 简单比较
- django 获取环境变量_django 环境变量配置过程详解
- 米奇emoji_一些常用的 Emoji 符号(可直接复制)
- 如何将zipoutputstream返回_嫦娥五号返回器要“跳”一下再回地球!这一“跳”大有讲究...
- html 网络请求 json数据,写一个json格式API,http请求接收json数据
- 如何将3dmax结合前端_如何将阅读与写作结合
- 笔记本电脑投屏到电视_电脑怎么投屏到电视?掌握这3个方法就够了
- JScript.NET(JScript 8.0)编程简介
- js+svg实现的一个环图