基于K-Means的图片聚类算法实战

一. 场景说明

我们通常遇到一个问题,当很多图片放在一个文件夹中,要把这些文件夹中的图片按规律分为几类。当图片比较少时,我们可以手动完成,但是当图片的数量是几千甚至几万时,手动挑选图片的工作量就太大了。
因此,需要一个算法对图片进行自动化分类并保存,也就是本文的《基于K-Means的图片聚类算法实战》。

二. 算法步骤

  1. 基于深度学习模型提取图片特征;
  2. 基于K-Means聚类算法对图片特征进行聚类;
  3. 根据不同的类别,把相应的图片保存在不同的文件夹中。

下面是一个例子,./imgs中保存了很多猫和狗的图片,运行脚本后,就把猫和狗的图片分开,分别保存在./0 和 ./1 两个文件夹中。
代码如下:

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image
import torch.nn.functional as F
import glob
import numpy as np
from tqdm import tqdm
from sklearn.cluster import KMeansclass FeatureExtract(object):def __init__(self):# 加载预训练的ResNet18模型self.resnet = models.resnet18(pretrained=True)# 移除最后一层全连接层self.resnet = torch.nn.Sequential(*list(self.resnet.children())[:-1])# 设置模型为评估模式self.resnet.eval()self.preprocess = transforms.Compose([transforms.Resize(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])def feature_extract(self, image_path):# 加载和预处理图像image = Image.open(image_path)input_tensor = self.preprocess(image)input_batch = input_tensor.unsqueeze(0)# 使用模型提取特征with torch.no_grad():features = self.resnet(input_batch)# 输出特征向量return features.squeeze()def k_means(data, n_clusters=2):# 定义聚类器, 设置迭代次数和终止条件kmeans = KMeans(n_clusters=2, max_iter=1000, tol=1e-4)kmeans.fit(data)# 获取每个数据点的簇标签labels = kmeans.labels_return labelsif __name__ == "__main__":import shutilimport osextract = FeatureExtract()features = []images = glob.glob("./imgs/*.jpg")print("开始抽取图片特征...")for img_path in tqdm(images):feature = extract.feature_extract(img_path)features.append(feature.tolist())data = np.array(features)print("开始特征聚类...")n_clusters = 2labels = k_means(data, n_clusters)print("开始保存图片")for i in range(n_clusters):os.mkdir(str(i))for label, img_path in zip(labels, images):shutil.copy(img_path, os.path.join(str(label), os.path.basename(img_path)))

理论基础可学习:K-Means(K-均值)聚类算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git关于ssh我遇到的问题解决链接

新手,第一次用gitee上传程序,花了好几天(有空就弄)才搞定,刚开始弄https,但我的用户名和密码都不知道,网上找的办法都重置不了。下面是我弄ssh时遇到的问题 在gitee设置ssh公钥: G…

GaussDB如何创建和管理视图

GaussDB如何创建和管理视图 一、什么是视图 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 视图与基本表不同,不是物理上实际存在的&#x…

基于ssm的“游侠”旅游信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本“游侠”旅游信息管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的…

自动灭火贴哪个牌子好?看懂灭火贴原理应该这么选!

随着大家安全意识的增强,无论是日常生活还是工业生产,都可以看到灭火器的踪影。但是往往在火情中,人们很难第一时间发现危险并及时扑灭,或多或少会造成财产损失,甚至影响到生命安全。近几年,自动灭火贴应运…

第十五章 React使用UI(Ant Design)框架

一、专栏介绍 😆😆 欢迎加入本专栏!本专栏将引领您快速上手React,让我们一起放弃放弃的念头,开始学习之旅吧!我们将从搭建React项目开始,逐步深入讲解最核心的hooks,以及React路由、…

SQL Server判断数据库、表、列、视图、存储过程、函数是否存在

一、前言概述 在写一些业务逻辑相对复杂点的存储过程的时候,经常会用到临时表或者数据表作为临时结果的保存。但每次在作表是否存在的判断时,往往想不起完整的SQL写法。因此,记录一些常用的数据库对象是否存在的判断方法,可以达到…

【论文翻译】Learning Deep Features for Discriminative Localization

原文:Learning Deep Features for Discriminative Localization 摘要 在这项工作中,我们重新审视了文献[13]中提出的全局平均池化层,并阐明了它如何明确地使卷积神经网络具有出色的定位能力,尽管该网络是在图像级标签上进行训练的…

Qt/QML编程学习之心得:信号+槽(十三)

Qt设计GUI界面应用程序,类似于Windows的Visual Studio设计界面,最主要的就是消息机制,如果vs下叫MFC机制,那么Qt就叫信号槽机制。MFC采用消息映射机制,每个类都有一个消息映射,与该类有关的消息都出现在该类的消息映射中。类的消息映射把一组消息映射宏组成一个消息映射表…

排序算法:【冒泡排序】、逻辑运算符not用法、解释if not tag:

注意: 1、排序:将一组无序序列,调整为有序的序列。所谓有序,就是说,要么升序要么降序。 2、列表排序:将无序列表变成有序列表。 3、列表这个类里,内置排序方法:sort( )&#xff0…

Python实现图形的几何变换

一、能够提供对话框窗口,输入三角形的顶点坐标;或者,采用鼠标左键单击方式输入三角形的顶点坐标。 二、对输入的三角形顶点坐标进行五种基本几何变换: 对于平移变换,能够提供对话框窗口,输入平移向量&…

HashMap:理解Hash、底层实现与扩容机制

一、简单叙述 HashMap是Java中常用的一种数据结构,它以键值对的形式存储数据,具有高效的查找、插入和删除操作。本文将详细介绍HashMap的底层实现原理,包括哈希技术、底层数据结构和扩容机制,帮助读者深入理解HashMap的工作原理。…

Java IO 模型之 BIO、NIO、AIO 详解

目录 一. 前言 二. IO 模型 2.1. IO 模型分类 2.2. BIO、NIO、AIO 使用场景分析 2.3. NIO 和 BIO 的比较 三. BIO(同步阻塞) 3.1. BIO 编程流程 3.2. BIO 应用实例 3.3. 问题分析 四. NIO(同步非阻塞) 4.1. 基本介绍 …

Dubbo 3.x源码(13)—Dubbo服务发布导出源码(2)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(12)—Dubbo服务发布导出源码(1),也就是Dubbo服务发布导出的入口源码,现在我们继续学习,服务导出的核心方法doExportUrls的源码。 Dubbo 3.x…

一文读懂Java中的设计模式——单例模式!默认情况下,Spring的Bean就是单例的

单例模式概念 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式只应在有真正的“单一实例”的需求时才可使用。总结起来单例模式有三个优点: 全局访问共享资源:当需要在应用程序的多个地方共享和使用相…

跑代码中遇到的错误合集(持续更新)

1.TypeError: dropout(): argument ‘input‘ (position 1) must be Tensor, not str 原因:dropout函数接收到的参数是一个字典类型(需手动设置其不要返回字典类型) 解决步骤: 1.根据代码定位到dropout函数 2.定位到函数中的参数 3.对给dropout函数参数赋值的函数的…

[渗透测试学习] Sau - HackTheBox

首先是信息搜集,nmap扫一下 nmap -sV -sC -p- -v 10.10.11.224 发现存在两个端口,55555端口有http服务,访问一下 获得线索request-baskets版本为1.2.1,搜索发现存在漏洞 那么我们试试构造ssrf,create的时候bp抓包 构…

定时器TIM HAL库+cubeMX(上)

定时器时钟源APB1 36MHz 一.基本定时器 1.基本框图 2.溢出时间计算 3.配置定时器步骤 TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) {g_timx_handle.Instance TIM6;g_timx_handle.Init.Prescaler p…

【数据安全】金融行业数据安全保障措施汇总

数字化的今天,数据的价值不可估量,尤其是金融行业,数据不仅代表着企业的核心资产,还涉及到客户的隐私和信任。因此对于金融行业而言,保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…

web界面请求过程

一、计算机获取IP(DHCP协议): 计算机生成DHCP报文,并将此报文放入UDP报文段中(源端口68,目的端口67),此UDP报文段被放入IP数据报中(广播IP目的地址:255.255.255.255,源I…

Idea执行bat使用maven打包springboot项目成docker镜像并push到Harbor

如果执行以下命令失败,先把mvn的-q参数去掉,让错误输出到控制台。 《idea配置优化、Maven配置镜像、并行构建加速打包、解决maven打包时偶尔几个文件没权限的问题》下面的使用company-repo私有仓库和阿里云镜像仓库同时使用的配置参考。 bat echo off …