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   support

         cat       0.57      0.72      0.64        50
         dog       0.62      0.46      0.53        50

    accuracy                           0.59       100
   macro 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模型的最佳参数,并测量模型的准确性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用图片处理操作

静态图片文件转base64 import base64 with open(1.png, rb) as f:source f.read() base64_img base64.b64encode(source)base64转静态图片文件 imgdata base64.b64decode(base64_img)# 将图片保存为文件 with open("new.png", wb) as f:f.write(imgdata)PS:这里…

精密空气加热器负载组

小型便携式 :精密空气加热器(负载组)能够对数据中心热通道/冷通道冷却系统进行全面测试。EAK 是一款 19 英寸机架式设备(10U 高),可轻松安装到各种标准服务器机架中。通过集成可调节的热量水平(…

【计算机毕业设计】061互助学习微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Redis学习——Redisson 分布式锁集成及其简单使用

文章目录 引言1. Redisson概述1.1 Redisson的基本概念1.2 Redisson的主要功能1.3 Redisson的优点 2. 开发环境3. Redisson的安装与配置3.1 添加依赖3.2 配置Redisson 4. 使用Redisson4.1 可重入锁4.1.1 可重入锁的概念4.1.2 可重入锁的实现原理4.1.3 简单使用锁的获取和释放 4.…

无线麦克风哪个品牌音质最好,一篇看懂无线领夹麦克风怎么挑选

在数字化时代背景下,直播和个人视频日志(Vlog)已成为新的文化现象,这些趋势不仅重塑了内容创作,也促进了音频设备市场的繁荣。无线领夹麦克风,以其设计上的轻便和录音上的高效率,成为视频创作者…

手把手带你薅一台云服务器

前两篇,带着大家在自己本地搞了一台 Linux 虚拟机: 【保姆级教程】Windows上安装Linux子系统,搞台虚拟机玩玩【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH VS Code,开发必备 问题来了:本…

nacos漏洞小结

Alibaba Nacos是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理…

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 1、定时器0工作在模式0框图 2、定时器0工作在模式0举例 1、Keil C51中有一些关键字,需要牢记: interrupt 0:指定当前函数为外部中断0; interrupt 1:指定当前函数为定时器0中断…

onInterceptTouchEvent() 与 onTouch() 事件分析

前言 本文主要分析 onTouch() 与 onTouchEvent() 事件的差异 正文 先看布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <com.longzhiye.intercepttouch.MyFrameLayout xmlns:android"http://schemas.android.com/apk/res…

PointNet++论文导读

PointNet论文导读 主要改进网络结构&#xff1a;非均匀采样下的特征学习的鲁棒性利用点特征传播处理数据集分割 论文链接:https://arxiv.org/abs/1612.00593 主要改进 PointNet的基本思想是学习每个点的空间编码&#xff0c;然后将所有单个点的特征聚合成一个全局点云标签&am…

模块化编程(二)

模块的导入 经常有这样一句话&#xff1a;“不要重复造轮子”&#xff0c;知道别人已经造好了轮子&#xff0c;并且轮子也好用&#xff0c;那就直接拿别人的轮子来用&#xff0c;此处的“模块导入”就是“拿别人的轮子过来”。前文提到模块化编程的好处之一就是“代码复用性高…

【6.26更新】Win10 22H2 19045.4598镜像:免费下载!

当前微软已经发布了六月最新的KB5039299更新补丁&#xff0c;用户完成升级后&#xff0c;系统版本号将更新至19045.4598。此次更新解决了任务栏上应用跳转列表失败、可能导致系统无法从休眠状态恢复等多个问题&#xff0c;推荐大家升级。如果您不知道去哪里才能下载到该版本&am…

mac|tableau public 仪表盘使用

对华东地区的利润进行仪表盘可视化 选择下面的功能表的新建仪表盘,把上面的表1表2放入其中 通过下图操作将两个表联合起来&#xff0c;即上图使用筛选器时下面的表随之改变 将上图设置为筛选器&#xff0c;可以通过点击地区查看数据

防护用品穿戴自动监测摄像机

随着技术的不断发展&#xff0c;防护用品穿戴自动监测摄像机作为现代安全监控领域的创新应用&#xff0c;正逐渐成为各类工作场所和特定环境中的重要设备。这种摄像机不仅能够实时记录和监控员工的工作状态和安全情况&#xff0c;还能提供数据支持和预警功能&#xff0c;显著提…

第四十篇——系统论:如何让整体效用大于部分之和?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 系统论&#xff0c;又从一个大的生态的角度去考虑&#xff0c;我们应该如…

贪心问题(POJ1700/1017/1065)(C++)

一、贪心问题 贪心算法 贪心算法&#xff08;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪&#xff0c;每一步行动总是按某种指标选取最优的操作。而且他目光短浅&#xff0c;总是只看眼前&#xff0c;并不考虑…

CSS 背景添加白色小圆点样式

css也是开发过程中不可忽视的技巧 此专栏用来纪录不常见优化页面样式的css代码 效果图: 未添加之前: 代码: background: radial-gradient(circle at 1px 1px, #3d3c3c 2px, transparent 0);background-size: 20px 25px;

在AvaotaA1全志T527开发板上烧录AvaotaOS固件

烧写到 TF 卡上 材料准备 首先需要准备的材料有: SD-Card Formatter&#xff1a;balenaEtcherAvaota Pi - A1开发板 x1TF-Card ( 不小于4Gb ) x112V-DC电源适配器 x1TF读卡器 x1USBTTL Splitter x1&#xff08;可选&#xff09;HDMI 采集卡 x1 &#xff08;可选&#xff09;…

体验升级:扫描全能王智能高清滤镜2.0全面测评

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

MSPM0G3507——串口

配置&#xff1a; 主函数: #include "ti_msp_dl_config.h"volatile uint8_t gEchoData 0; int main(void) {SYSCFG_DL_init();NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN); //先清除中断&#xff0c;防止直接进中断NVIC_EnableIRQ(…