传统机器学习聚类的方法有很多种,并且很多都能够应用在点云上。这是由于聚类方法一般是针对于通用样本,只是样本的维度有所不同。对于三维点云来说,其样本的维度为3。这里主要介绍几种典型的方法及其实现方式,包括DBSCAN、KMeans等聚类方法,采用python open3d和skit-learn来实现。上一节主要介绍了DBSCAN聚类五种点云聚类方法(一)— DBSCAN_Coding的叶子的博客-CSDN博客,本节简要介绍KMeans点云聚类。
KMeans聚类方法是机器学习中最常见的聚类方法之一。其主要思想是确定k个分类中心,使得各个分类中的点到分类中心的距离总和最小。最直观的效果是将距离相近的点聚为同一类。Kmeans聚类的总数需要提前设置,即假定K个类别,也就是聚类后的类别是确定的。而DBSCAN方法聚类的类别是不确定的。
KMeans通常第一步是随机选择K个点作为初始化的类别中心,然后通过不断迭代进行中心坐标更新直到中心点更新距离变化小于阈值或者迭代次数达到上限。KMeans++是在第一步上进行了改进,在初始化过程中尽可能选择距离相隔较远的点作为初始化中心。Skit-learn的Kmeans默认采用的初始化方式为KMeans++。
Skit-learn的Kmeans函数为sklearn.cluster.KMeans,共有11个参数。这里仅介绍其中三个参数,其他的采用默认值。n_clusters定义类别数量。max_iter定义最大迭代次数。
result= KMeans(n_clusters=8,init='k-means++',n_init=10,max_iter=300,tol=0.0001,
precompute_distances='auto',verbose=0,random_state=None,
copy_x=True,n_jobs=1,algorithm='auto').fit(points)
函数返回值这里也仅介绍三个。假设聚类返回的结果用result表示,可以用result.__dict__查看其包含的结果数据。n_iter_为算法实际迭代的次数,cluster_centers_为类别中心,labels_返回各个点的类别标签,从0开始。
#返回结果的属性
dict_keys(['n_clusters', 'init', 'max_iter', 'tol', 'precompute_distances', 'n_init', 'verbose', 'random_state', 'copy_x', 'n_jobs', 'algorithm', '_n_threads', 'n_features_in_', 'cluster_centers_', 'labels_', 'inertia_', 'n_iter_'])
pcd文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下载。
# -*- coding: utf-8 -*-
"""
@author: https://blog.csdn.net/suiyingy
"""
import open3d as o3d
import numpy as np
from sklearn.cluster import KMeans
if __name__ == '__main__':
file_path = 'rabbit.pcd'
pcd = o3d.io.read_point_cloud(file_path)
# pcd = pcd.uniform_down_sample(50)#每50个点采样一次
pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
print(pcd)
points = np.array(pcd.points)
result = KMeans(n_clusters=8).fit(points)
#各个类别中心
center = result.cluster_centers_
# labels返回聚类成功的类别,从0开始,每个数据表示一个类别
labels = result.labels_
#最大值相当于共有多少个类别
max_label = np.max(labels) + 1 #从0开始计算标签
print(max(labels))
#生成k个类别的颜色,k表示聚类成功的类别
colors = np.random.randint(255, size=(max_label, 3))/255.
colors = colors[labels]
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
# 点云显示
o3d.visualization.draw_geometries([pcd], #点云列表
window_name="Kmeans点云聚类",
point_show_normal=False,
width=800, # 窗口宽度
height=600) # 窗口高度
labels返回聚类成功的类别,从0开始计算,最大值加一相当于共有多少个类别。
python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716