Index 目录索引

  • 写在前面
  • 谱聚类简介
  • 数据集
  • 代码实现步骤详述
    • 图像预处理
    • 谱聚类操作
    • 聚类后的图像对应还原操作

写在前面

最近要做一个基于无监督学习的传统图像分类,需要使用到聚类分析方法,但看到网上大多数都是关于点集的案例分析,基于自然图像的聚类分析实在是难觅,于是乎花了将近一周时间,参照着 Programming Computer Vision with Python 这本书以及相关文章进行了研究1,并实现了MNIST图像的谱聚类小案例(代码已在GitHub开源2),以记录之。

谱聚类简介

谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的3。谱聚类的聚类效果通常优于传统的聚类算法(如K-Means算法)。

数据集

本案例使用MNIST手写数字图像数据集,首先选取合适的图像,并整理如下图所示:

代码实现步骤详述

图像预处理

由于谱聚类对图像尺寸和文件名有要求,所以首先对图像进行灰度化resize操作,分别对应项目中的grayscale_processing.pypicture_resize.py这两个代码文件。

谱聚类操作

在项目中的spectral_clustering.py代码文件中,进行图像的谱聚类。代码如下:

# -*- coding: utf-8 -*-
from PCV.tools import imtools, pca
from PIL import Image, ImageDraw
from pylab import *
from scipy.cluster.vq import *
import os
import random# imlist = imtools.get_imlist('./dir_my')
imlist = imtools.get_imlist('./dir_my_gray_rescale')
imnbr = len(imlist)# Load images, run PCA.
immatrix = array([array(Image.open(im)).flatten() for im in imlist], 'f')
V, S, immean = pca.pca(immatrix)# Project on 2 PCs.
projected = array([dot(V[[0, 1]], immatrix[i] - immean)for i in range(imnbr)])  # P131 Fig6-3左图
#projected = array([dot(V[[1, 2]], immatrix[i] - immean) for i in range(imnbr)])  # P131 Fig6-3右图n = len(projected)
# compute distance matrix
S = array([[sqrt(sum((projected[i]-projected[j])**2))for i in range(n)] for j in range(n)], 'f')
# create Laplacian matrix
rowsum = sum(S, axis=0)
D = diag(1/sqrt(rowsum))
I = identity(n)
L = I - dot(D, dot(S,D))
# compute eigenvectors of L
U, sigma, V = linalg.svd(L)
k = 3
# create feature vector from k first eigenvectors
# by stacking eigenvectors as columns
features = array(V[:k]).T
# k-means
features = whiten(features)
centroids, distortion = kmeans(features,k)
code, distance = vq(features, centroids)# plot clusters 绘制聚类簇
for c in range(k):ind = where(code == c)[0]   # where函数返回数组的索引值figure()   # 创建figure实例gray()for i in range(minimum(len(ind), 39)):# print(imlist[ind[i]])   # ./dir_my_gray_rescale\5.jpgim = Image.open(imlist[ind[i]])# print("im:%s" % im)  # im:<PIL.JpegImagePlugin.JpegImageFile image mode=L size=28x28 at 0x241B9DD2EF0>image_name = imlist[ind[i]].split("\\")[1]  # image_name: 5.jpgimage_name_real = image_name.split(".")[0]  # image_name_real: 1_1image_name_new = image_name_real + ".png"# print(image_name_new)   # image_name_new: 1_1.png# print("image_name: %s" % image_name)# print("image_name_real: %s" % image_name_real)subplot(4, 10, i+1)imshow(array(im))   # 绘图# print("array(im)的值为%s" % array(im))# 使用imsave()函数保存图像pre_savename = "./dir_classfied_my/%02d/" % c   # "./dir/00"# savename = os.path.join(pre_savename, str(random.randint(0, 10000000)))savename = os.path.join(pre_savename, image_name_new)imsave(savename, array(im))axis('equal')axis('off')
show()

聚类后的MNIST图像数据如下图所示:


在实现了聚类之后,编写代码实现聚类后图像的分门别类,效果图如下:



通过观察可以发现,基于无监督的谱聚类进行图像分类还是有一定的效果的,而且通过对比实验发现,待分类的图像数据越多,分类越精确

聚类后的图像对应还原操作

由于在聚类操作前对数据进行了图像预处理操作,所以如果要保持原来的图像,需要对其进行还原操作,还原的方法有很多种,这里依据图像名来进行,于是乎编写代码如下(对应项目中的returned.py代码文件):

import os
import glob
import shutilPATH_0 = './dir_my/'  # 存放原始图像的文件夹路径
PATH_1 = './dir_classfied_my/'  # 存放根据聚类效果来对原始图像重新排布的原始图像文件夹路径
# 1、先遍历图像处理前总文件夹的图像文件
for filename_0 in os.listdir(r"./dir_my"):      # listdir的参数是文件夹的路径# print(filename_0)        #此时的filename是文件夹中文件的名称for filename_1 in os.listdir(r"./dir_classfied_my"):# print(filename_1)  #  filename_1: 00 01 02for filename_2 in os.listdir(r"./dir_classfied_my/%s" % filename_1):# print(filename_2)    # filename_2: '1_2.jpg'paths = PATH_0 + filename_1 + '/' + filename_2# print(paths)if filename_2 == filename_0:shutil.copy(os.path.join(PATH_0, filename_0), os.path.join(PATH_1, filename_1, filename_0))

这里一心想实现最终效果,所以并没有过多考虑时间复杂度的问题 [手动狗头],代码还有很大的优化空间。

这篇文章写出来,希望能帮助到有需要的人们,同时也是为了日后需要时的查阅方便。文章中项目的代码已开源,点击这里即可查看,如果有帮助到你,请动动你的小手在GitHub上点亮☆ Star

写到这里,差不多本文就要结束了。如果有问题可以在下方留言区留言交流,错误之处也欢迎小伙伴们的批评指正。如果我的这篇文章帮助到了你,那我也会感到很高兴,一个人能走多远,在于与谁同行


  1. Python计算机视觉编程 - 第六章 图像聚类 ↩︎

  2. 本文案例的GitHub代码 ↩︎

  3. 谱聚类(spectral clustering)原理总结 ↩︎

MNIST图像谱聚类的案例实现相关推荐

  1. 机器学习算法之 K-means、层次聚类,谱聚类

    k-means 和层次聚类都属于划分聚类,实际中最常用的是k-means,k-means效果不好的情况下才会采用其他聚类 K-means算法 K-means算法,也称为K-平均或者K-均值,是一种使用 ...

  2. Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)

    Python计算机视觉编程 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 1.1 在主成分上可视化图像 1.1 像素聚类 (二)层次聚类 (三)谱聚类 图像聚类 ...

  3. python谱聚类算法_谱聚类Spectral clustering(SC)

    在之前的文章里,介绍了比较传统的K-Means聚类.Affinity Propagation(AP)聚类.比K-Means更快的Mini Batch K-Means聚类以及混合高斯模型Gaussian ...

  4. matlab实现谱聚类法图像分割代码,一种基于谱聚类的图像分割方法与系统与流程...

    本发明是一种基于谱聚类的图像分割方法与系统,涉及聚类.机器学习和人工智能领域.特别涉及通过相关性将已经学习到的知识运用到图像分割中,并在此基础上构造性地改造谱聚类方法,从而达到快速精确地分割彩色图像的 ...

  5. 利用谱聚类和随机分块(SBM)来做网络模型中的社区发现

    项目如下: [1]项目背景 在过去的几十年里, 网络数据的数量和对相关统计推断工具的需求在快速增长. 网络数据分析的主要研究课题之一是从单一的观察网络中找出隐藏的社区. 简单地讲, 网络社区指的是相互 ...

  6. 小样本学习下的Transformer:基于谱聚类层和标签代理学习

    ©作者 | 知乎用户Alicia 研究方向 | 小样本学习 论文标题: Attribute Surrogates Learning and Spectral Tokens Pooling in Tra ...

  7. 【图像分割】基于萤火虫优化的半监督谱聚类彩色图像分割方法(Matlab代码实现)

    目录 0 概述 1 萤火虫算法 1.1 思想来源 1.2 数学模型 1.2.1 萤火虫相对荧光亮度 1.2.2 萤火虫吸引度 1.2.3 位置更新 1.3 算法步骤 2 基于萤火虫优化的半监督谱聚类彩 ...

  8. 【图像分割】基于谱聚类算法实现图像分割matlab源码

    一. 前言 本来想写关于聚类系列算法的介绍,但是聚类系列的其它几个算法原理比较简单,网上有大量的教程可以查阅.这里主要是介绍一下谱聚类算法,做一个学习笔记,同时也希望对想要了解该算法的朋友有一个帮助. ...

  9. 【机器学习】5:谱聚类算法原理介绍

    前言:学习谱聚类,最好有一些图论.矩阵分解(SVD)方面的知识,这样会更加有利于谱聚类的学习.当然,谱聚类理解起来并不困难,实际操作也大多是谱聚类+K-means聚类联合使用的. –--------- ...

最新文章

  1. Ubuntu 16.04 安装Django
  2. 频繁项集挖掘之Aprior和FPGrowth算法
  3. json带斜杠java,带斜杠的json解析
  4. 黄开宁:搞多媒体开发要掌握好信号处理、统计和数理分析
  5. linux+显卡+停止运行,Linux secure boot(安全启动)时添加Nvidia显卡驱动
  6. react 生命挂钩_如何在GraphQL API中使用React挂钩来管理状态
  7. wordcount java分析_JavaWordCount
  8. PS发光眩光效果插件:BBTools Glow Glare for Mac
  9. oracle 中的参数 optimizer_mod的各个参数的意义
  10. Git常用命令的使用方法
  11. html5 播放加密视频播放器,.NET MVC对接POLYV——HTML5播放器播放加密视频
  12. 【NDK】Android NDK下载安装教程
  13. java 毫秒转分钟和秒_毫秒转换为天、小时、分、秒
  14. 量子计算进阶:量子计算机的组建和量子计算原理(包含相关论文推荐60篇)
  15. 实现Android手机之间在局域网下传输任意文件
  16. magisk安装失败_crDroid OS 安装刷入教程
  17. 软文和广告的区别在哪里?软文是广告吗?
  18. Golang编码规范
  19. 关于扁平化界面风格的设计美学讨论
  20. case when then else end 语句遇上sum或count等统计函数的注意事项(列转行)

热门文章

  1. office Excel 加载加载项时出错 解决办法
  2. 李居明风水人人都懂版之(1)家居风水大发现
  3. 格林耐特交换机配置命令参考
  4. python接口自动化项目_Python+requests接口自动化完整项目框架整理笔记
  5. 华为HCNA实验操作之常用操作命令11-20
  6. 我国计算机科学的发展源头,计算机科学与技术概论论文正稿.doc
  7. iOS 人脸识别拾遗一 坐标转换 截取
  8. SOLIDWORKS Manage 2022 版本集成插件
  9. Android 使用Socket(TCP协议)实现监控(类似于及时通讯)服务器端使用Walkman
  10. 直播电商源码使用缓存,将面临什么问题