Python | 基于支持向量机(SVM)的图像分类案例

支持向量机(SVM)是一种监督机器学习算法,可用于分类和回归任务。在本文中,我们将重点关注使用SVM进行图像分类。

当计算机处理图像时,它将其视为二维像素阵列。数组的大小对应于图像的分辨率,例如,如果图像是200像素宽和200像素高,则数组的尺寸为200 x 200 x 3。前两个维度分别表示图像的宽度和高度,而第三个维度表示RGB颜色通道。数组中的值范围为0到255,表示每个点处像素的强度。

为了使用SVM对图像进行分类,我们首先需要从图像中提取特征。这些特征可以是像素的颜色值、边缘检测,甚至是图像中存在的纹理。一旦提取了特征,我们就可以将它们用作SVM算法的输入。

SVM算法通过寻找在特征空间中分离不同类的超平面来工作。支持向量机背后的关键思想是找到最大化边缘的超平面,边缘是不同类的最近点之间的距离。最接近超平面的点称为支持向量。

使用SVM进行图像分类的主要优点之一是它们可以有效地处理高维数据,例如图像。此外,SVM比其他算法(如神经网络)更不容易过拟合。

在机器学习中,模型由输入数据和预期输出数据训练。

步骤1:导入所需的库

import pandas as pd 
import os 
from skimage.transform import resize 
from skimage.io import imread 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn import svm 
from sklearn.model_selection import GridSearchCV 
from sklearn.model_selection import train_test_split 
from sklearn.metrics import accuracy_score 
from sklearn.metrics import classification_report

步骤2:加载图像并将其转换为数据帧

Categories=['cats','dogs'] 
flat_data_arr=[] #input array 
target_arr=[] #output array 
datadir='IMAGES/'
#path which contains all the categories of images 
for i in Categories: print(f'loading... category : {i}') path=os.path.join(datadir,i) for img in os.listdir(path): img_array=imread(os.path.join(path,img)) img_resized=resize(img_array,(150,150,3)) flat_data_arr.append(img_resized.flatten()) target_arr.append(Categories.index(i)) print(f'loaded category:{i} successfully') 
flat_data=np.array(flat_data_arr) 
target=np.array(target_arr)

输出

loading... category : cats
loaded category:Cats successfully
loading... category : dogs
loaded category:Dogs successfully

上面提供的代码执行了一系列必要的步骤来读取,预处理和组织机器学习的图像数据。首先,导入必要的包,包括用于图像处理的scikit-image,用于数据操作的pandas和用于数学计算的numpy。定义“类别”列表以表示将用于训练机器学习模型的图像类别。创建两个空数组来存储图像数据及其对应的标签。然后从指定的路径加载图像,读取并调整大小为150×150像素的固定大小,具有3个颜色通道,并展平为1D阵列。将展平的图像数据及其对应的标签(0表示“猫”,1表示“狗”)添加到数组中。数组被转换为pandas DataFrame,然后将其拆分为输入数据’x’(除最后一列外的所有列)和输出数据’y’(最后一列)。然后,可以使用得到的“x”和“y”数据来训练机器学习模型。使用的变量名是不言自明的,使代码易于理解和理解。总的来说,这段代码为机器学习提供了一种加载、处理和组织图像数据的清晰简洁的方式。

#dataframe 
df=pd.DataFrame(flat_data) 
df['Target']=target 
df.shape

输出

(500, 67501)

步骤3:分离输入特征和目标

#input data 
x=df.iloc[:,:-1] 
#output data 
y=df.iloc[:,-1]

步骤4:划分训练集和测试集


# Splitting the data into training and testing sets 
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.20, random_state=77, stratify=y) 

步骤5:构建和训练模型

这里的模型是支持向量机,它看起来像这样


# Defining the parameters grid for GridSearchCV 
param_grid={'C':[0.1,1,10,100], 'gamma':[0.0001,0.001,0.1,1], 'kernel':['rbf','poly']} # Creating a support vector classifier 
svc=svm.SVC(probability=True) # Creating a model using GridSearchCV with the parameters grid 
model=GridSearchCV(svc,param_grid)

在上面提供的代码片段中,我们为GridSearchCV定义了参数grid。参数网格指定了我们想要调优的超参数,包括C、gamma和kernel。C是误差项的惩罚参数,gamma是核系数,并且核是核类型。我们为每个超参数提供一系列值,GridSearchCV将对所有可能的超参数组合进行穷举搜索,以找到最佳值。

接下来,我们创建一个SVM分类器的实例,并将“probability”参数设置为True。这是因为我们稍后将使用分类器的“predict_proba()”方法来获取类概率。然后将SVM分类器和参数网格传递给GridSearchCV,以创建一个模型,该模型将为SVM算法找到最佳超参数。

通过使用GridSearchCV,我们可以找到超参数的最佳组合,这将导致模型的最高精度。这将有助于我们从SVM模型中获得最佳性能。

我们将数据分为训练集和测试集,然后使用训练数据训练模型。

# Training the model using the training data 
model.fit(x_train,y_train)

在预处理数据集并使用GridSearchCV创建SVM模型之后,我们可以使用scikit-learn库中的train_test_split函数将数据集分为训练集和测试集。此函数根据指定的测试大小和随机状态将数据随机拆分为训练集和测试集。在这种情况下,我们将测试大小设置为0.20,这意味着20%的数据将用于测试,随机状态设置为77以获得再现性。

分割数据后,我们可以使用训练数据来训练模型,方法是在我们使用GridSearchCV创建的模型对象上调用fit方法。这将使用从GridSearchCV获得的超参数的最佳组合来训练模型。

我们可以打印一条消息,表明模型已经使用给定的图像成功训练。

我们还可以使用模型对象的best_params_属性打印从GridSearchCV获得的最佳参数。这将显示我们在参数网格中定义的C、gamma和内核参数的最佳值。

我们可以评估SVM模型对未知数据的性能。这有助于我们确保模型能够很好地泛化,并且不会过度拟合训练数据。

步骤6:模型评估

现在使用测试数据以这种方式对模型进行测试,模型的准确性可以使用sklearn.metrics中的accuracy_score()方法计算。

# Testing the model using the testing data 
y_pred = model.predict(x_test) # Calculating the accuracy of the model 
accuracy = accuracy_score(y_pred, y_test) # Print the accuracy of the model 
print(f"The model is {accuracy*100}% accurate")

输出

The model is 59.0% accurate

在训练SVM模型之后,我们需要测试模型,看看它在新的、看不见的数据上的表现如何。为了测试模型,我们将使用之前使用scikit-learn库中的train_test_split函数分割的测试数据。

我们使用训练模型的预测方法来预测测试数据的类标签。预测的标签存储在y_pred变量中。

为了评估模型的性能,我们使用scikit-learn metrics模块中的accuracy_score方法计算模型的准确度。准确性分数测量所有数据点中正确分类的数据点的百分比。准确性分数的计算方法是将预测的标签与实际标签进行比较,然后将正确预测的数量除以数据点的总数。

我们打印测试数据的预测和实际标签,然后是模型对测试数据的准确性。

现在我们可以使用scikit-learn的classification_report函数为SVM模型生成分类报告。下面是一个示例代码片段:

print(classification_report(y_test, y_pred, target_names=['cat', 'dog']))

输出

              precision    recall  f1-score   supportcat       0.57      0.72      0.64        50dog       0.62      0.46      0.53        50accuracy                           0.59       100macro avg       0.60      0.59      0.58       100
weighted avg       0.60      0.59      0.58       100

步骤7:预测

path='dataset/test_set/dogs/dog.4001.jpg'
img=imread(path) 
plt.imshow(img) 
plt.show() 
img_resize=resize(img,(150,150,3)) 
l=[img_resize.flatten()] 
probability=model.predict_proba(l) 
for ind,val in enumerate(Categories): print(f'{val} = {probability[0][ind]*100}%') 
print("The predicted image is : "+Categories[model.predict(l)[0]])

在这里插入图片描述
我们的模型的准确率为0.59,这意味着它正确地分类了测试集中59%的图像。这两个类的F1分数在0.5和0.7之间,这表明模型的性能是中等的。

总结

本文的目标是创建和训练支持向量机(SVM)模型,以准确地分类猫和狗的图像。使用GridSearchCV确定SVM模型的最佳参数,并测量模型的准确性。

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

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

相关文章

三菱PLC标签使用(I/O的映射)与内容

今天,小编继续开始三菱PLC的学习,今天的内容是标签及其标签的内容说明,如果对你有帮助,欢迎评论收藏。 标签的种类,等级,定义 种类 三菱3U的PLC的种类分别为二种:全局标签与局部标签 全局标签…

RabbitMQ-交换机的类型以及流程图练习-01

自己的飞书文档:‌‍‬‍‬‍​‍‬​⁠‍​​​‌⁠​​‬‍​​​‬‬‌​‌‌​​​​​​‍​‍​‌⁠‬​RabbitMQ的流程图和作业 - 飞书云文档 (feishu.cn) 作业 图片一张 画rabbit-mq 消息发…

【HDC.2024】探索无限可能:华为云区块链+X,创新融合新篇章

6月23日,华为开发者大会2024(HDC 2024)期间, “「区块链X」多元行业场景下的创新应用”分论坛在东莞松山湖举行,区块链技术再次成为焦点。本次论坛以"区块链X"为主题,集结了行业专家、技术领袖、…

深入解读:如何解决微调扩散模型时微调数据集和训练数据集之间的差距过大问题?

Diffusion Models专栏文章汇总:入门与实战 前言:在微调扩散模型的时候经常会遇到微调数据集和训练数据集之间的差距过大,导致训练效果很差。在图像生成任务中并不明显,但是在视频生成任务中这个问题非常突出。这篇博客深入解读如何…

android应用的持续构建CI(一)-- 总体设计

一、背景 接下里我希望通过一系列的文章,把android应用的构建梳理一遍,从总体设计到逐个环节的实现。 总体设计jenkins集成手动签名依赖环境应用管理 二、构建流程图 三、技术组件 jenkinsjdkgradle360加固 既然是android应用的持续构建&#xff0c…

实验七 SQL数据更新和视图

题目 (1)向商品类别表category中插入一条记录(801,‘座椅套’,‘各种品牌的汽车座套’) (2)向商品表product中插入一条记录:商品编号80101,商品名称“四季通…

64.函数参数和指针变量

目录 一.函数参数 二.函数参数和指针变量 三.视频教程 一.函数参数 函数定义格式: 类型名 函数名(函数参数1,函数参数2...) {代码段 } 如: int sum(int x,int y) {return xy; } 函数参数的类型可以是普通类型,也可以是指针类…

文心一言 VS 讯飞星火 VS chatgpt (295)-- 算法导论21.4 4题

四、利用练习 21.4-2 ,请给出一个简单的证明,证明在一个不相交集合森林上使用按秩合并策略而不使用路径压缩策略的运行时间为 O(m lgn) 。21.4-2 的内容是:“证明:每个结点的秩最多为 ⌊lgn⌋ 。”。如果要写代码,请用…

【C语言】auto 关键字

在C语言中,auto关键字用于声明局部变量,但它的使用已经变得很少见。事实上,从C99标准开始,auto关键字的默认行为就是隐含的,因此在大多数情况下无需显式使用它。 基本用法 在C语言中,auto关键字用于指定变…

CVPR 2024最佳论文:“神兵”的组合器 Generative Image Dynamics

CVPR 2024的最佳论文来自谷歌、美国加州大学圣迭戈分校。两篇都来至于视频生成领域,可见今年外界对视频生成领域关注度很高。今天的这篇是“Generative Image Dynamics”,Google Research发布的。它的研究成果令人震惊,从单张RGB图像生成连续…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程,包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式,结合Mermaid流程图和代码示例,帮助读者深入理解智能音箱的工作原理,并提供实际操作指导。…

一分钟教你设置代理服务器的IP地址

许多人购买完代理IP却不会使用,我们来学习一下如何手把手地设置代理服务器的IP地址。无论是为了访问受限网站还是保护隐私,设置代理IP都是一个非常实用的技能。让我们一起来看看怎么做吧! 设置代理服务器的IP地址步骤 1. 选择代理服务提供商…

PyCharm左侧项目区域出现淡黄色背景如何解决

PyCharm左侧项目区域出现淡黄色背景如何解决 解决方法: 1、打开pycharm 文件 - > Setting-> 项目 -> 项目结构 2、添加内容根 为 你的项目根目录即可恢复

sql server启动、连接 与 navicat连接sql server

一、sql server 启动 1.搜索cmd->以管理员身份运行 2.输入以下命令 net start mssqlserver 3.服务器启动成功 二、sql server连接 1.打开ssms,输入,连接 2.右键,属性 3.连接,勾选允许远程连接到此服务器 三、navicat连接sq…

自然语言处理领域介绍及其发展历史

自然语言处理领域介绍及其发展历史 1 NLP2 主要任务3 主要的方法1 基于规则的方法(1950-1980)2 基于统计的方法(传统的机器学习的方法)3 Connectionist approach(Neural networks) 1 NLP 自动的理解人类语…

Labview_Occurrencel(事件发生)

PS:这里遇到 一个很Low的事情: 在停止第二个while循环的时候出现了停止不了的情况。因为等待事件发生设置的超时时间为:-1。所以等事件发生后出现了条件接线端已经执行的情况,所以当下次事件发生时未能及时停止。初版的停止设置如下图&#x…

暑假学习DevEco Studio第2天

学习目标: 掌握页面跳转 学习内容: 跳转页面 创建页面: 在“project”窗口。打开“entry>src>main>ets”,右击“pages”,选择“New>ArkTS File”,命名“Second”,点击回车键。 在页面的路由&#xff0…

详解flink sql, calcite logical转flink logical

文章目录 背景示例FlinkLogicalCalcConverterBatchPhysicalCalcRuleStreamPhysicalCalcRule其它算子FlinkLogicalAggregateFlinkLogicalCorrelateFlinkLogicalDataStreamTableScanFlinkLogicalDistributionFlinkLogicalExpandFlinkLogicalIntermediateTableScanFlinkLogicalInt…

2024年Nano编辑器最新使用教程

Nano在大多数Linux发行版中找到,易于使用,其最常用的命令显示在其屏幕底部。 作为编辑配置和其他文件是Linux中的一种普遍的任务,知道如何使用该程序是否可以非常有用。Nano编辑器以及如何使用Nano编辑器在服务器上编辑文件是我们将在本指南中…

第1章 信息系统综合知识

第1章 信息系统综合知识 本章主要介绍信息系统综合知识,介绍信息、信息系统的基本概念,概述两化融合和国家信息化战略,讲解电子政务、电子商务的典型应用,描述信息化整体总体规划以及IT战略的主要内容。 1.1 信息的定义和属性 …