怎么用Python K-means实现简单图像聚类
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍"怎么用Python K-means实现简单图像聚类",在日常操作中,相信很多人在怎么用Python K-means实现简单图像聚类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的
千家信息网最后更新 2025年01月20日怎么用Python K-means实现简单图像聚类
这篇文章主要介绍"怎么用Python K-means实现简单图像聚类",在日常操作中,相信很多人在怎么用Python K-means实现简单图像聚类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用Python K-means实现简单图像聚类"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
这里直接给出第一个版本的直接实现:
import osimport numpy as npfrom sklearn.cluster import KMeansimport cv2from imutils import build_montagesimport matplotlib.image as imgpltimage_path = []all_images = []images = os.listdir('./images')for image_name in images: image_path.append('./images/' + image_name)for path in image_path: image = imgplt.imread(path) image = image.reshape(-1, ) all_images.append(image)clt = KMeans(n_clusters=2)clt.fit(all_images)labelIDs = np.unique(clt.labels_)for labelID in labelIDs: idxs = np.where(clt.labels_ == labelID)[0] idxs = np.random.choice(idxs, size=min(25, len(idxs)), replace=False) show_box = [] for i in idxs: image = cv2.imread(image_path[i]) image = cv2.resize(image, (96, 96)) show_box.append(image) montage = build_montages(show_box, (96, 96), (5, 5))[0] title = "Type {}".format(labelID) cv2.imshow(title, montage) cv2.waitKey(0)
主要需要注意的问题是对K-Means原理的理解。K-means做的是对向量的聚类,也就是说,假设要处理的是224×224×3的RGB图像,那么就得先将其转为1维的向量。在上面的做法里,我们是直接对其展平:
image = image.reshape(-1, )
那么这么做的缺陷也是十分明显的。例如,对于两张一模一样的图像,我们将前者向左平移一个像素。这么做下来后两张图像在感官上几乎没有任何区别,但由于整体平移会导致两者的图像矩阵逐像素比较的结果差异巨大。以橘子汽车聚类为例,实验结果如下:
可以看到结果是比较差的。因此,我们进行改进,利用ResNet-50进行图像特征的提取(embedding),在特征的基础上聚类而非直接在像素上聚类,代码如下:
import osimport numpy as npfrom sklearn.cluster import KMeansimport cv2from imutils import build_montagesimport torch.nn as nnimport torchvision.models as modelsfrom PIL import Imagefrom torchvision import transformsclass Net(nn.Module): def __init__(self): super(Net, self).__init__() resnet50 = models.resnet50(pretrained=True) self.resnet = nn.Sequential(resnet50.conv1, resnet50.bn1, resnet50.relu, resnet50.maxpool, resnet50.layer1, resnet50.layer2, resnet50.layer3, resnet50.layer4) def forward(self, x): x = self.resnet(x) return xnet = Net().eval()image_path = []all_images = []images = os.listdir('./images')for image_name in images: image_path.append('./images/' + image_name)for path in image_path: image = Image.open(path).convert('RGB') image = transforms.Resize([224,244])(image) image = transforms.ToTensor()(image) image = image.unsqueeze(0) image = net(image) image = image.reshape(-1, ) all_images.append(image.detach().numpy())clt = KMeans(n_clusters=2)clt.fit(all_images)labelIDs = np.unique(clt.labels_)for labelID in labelIDs: idxs = np.where(clt.labels_ == labelID)[0] idxs = np.random.choice(idxs, size=min(25, len(idxs)), replace=False) show_box = [] for i in idxs: image = cv2.imread(image_path[i]) image = cv2.resize(image, (96, 96)) show_box.append(image) montage = build_montages(show_box, (96, 96), (5, 5))[0] title = "Type {}".format(labelID) cv2.imshow(title, montage) cv2.waitKey(0)
可以发现结果明显改善:
到此,关于"怎么用Python K-means实现简单图像聚类"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
图像
结果
学习
像素
明显
向量
更多
特征
问题
帮助
平移
实用
巨大
一模一样
接下来
也就是
也就是说
代码
做法
原理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
长沙软件开发容易找工作吗
软件开发方向考研哪个学校好
浦东新区常规软件开发服务报价表
山东大学软件开发实训
ftp服务器的端口
软件开发技术存在的问题
什么是web服务器程序
网络服务器租赁从哪一年开始
加强 网络安全
益盟网络技术服务工作室
腾讯云怎么加数据库
国内外常用数据库
关于宣传网络安全教育的漫画
网络安全文字素材20个字
所有网络安全元素里面
数码宝贝其实是网络安全
芯片基础软件开发工具
数据库辅助审计
商洛行业专业软件开发
新华三防火墙数据库
软件开发方向考研哪个学校好
邮箱链接服务器失败怎么办
软件开发过程常见风险
东莞酷吧网络技术有限公司
雷霆游戏服务器奔溃
手机数据库查询次数
农民导航软件开发
创建科技软件开发公司
部队防范手机网络安全问题
安装数据库密码不正确