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

news2024/11/16 21:48:41

支持向量机(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模型的最佳参数,并测量模型的准确性。

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

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

相关文章

Java项目:基于SSM框架实现的游戏攻略网站系统分前后台【ssm+B/S架构+源码+数据库+毕业论文+任务书】

一、项目简介 本项目是一套基于SSM框架实现的游戏攻略网站系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能…

网络基础:OSPF 协议

OSPF(Open Shortest Path First)是一种广泛使用的链路状态路由协议,用于IP网络中的内部网关协议(IGP)。OSPF通过在网络中的所有路由器之间交换路由信息,选择从源到目的地的最优路径。OSPF工作在OSI模型的第…

HTTP入门

入门HTTP协议 1. 原理介绍 爬虫就是用程序模拟浏览器的行为,发送请求给服务器,获取网页的内容,解析网页数据。 要学会爬虫,先要了解浏览器是如何和服务器交流的。浏览器通过HTTP协议和服务器交流。 2. HTTP协议简介 2.1…

js三元图的画法图标是圆点

<div id"Plot" style"width:80%; margin-left:14%; height: calc(100% - 80px);"></div>var data {title: [甲苯, 乙苯, 苯],data: [{name: 工业过程/溶剂使用,mode: markers,a: [0.1, 0.2, 0.4, 0.6, 0.8],b: [0.6, 0.3, 0.4, 0.2, 0.1],c: …

线程池概念的详解

前言&#x1f440;~ 上一章我们介绍了什么是定时器以及如何去实现一个定时器&#xff0c;今天我们来讲解在多线程中同样很重要的一个内容线程池 线程池的出现 线程池概念 标准库中的线程池 工厂模式 newCacheThreadPool方法 newFixedThreadPool方法 ThreadPoolExecutor…

中俄汽车产业链合作前景广阔,东方经济论坛助力双边合作与创新

随着中国汽车零部件企业的竞争力和创新能力不断增强&#xff0c;中国汽车及零部件行业在俄罗斯的市场份额和品牌影响力显著提升&#xff0c;中俄两国在汽车产业链上的合作展现出巨大的潜力和广阔的前景。2024年5月&#xff0c;俄罗斯乘用车新车销量达到12.8万辆&#xff0c;同比…

pwn 基础环境搭建

pwn 基础环境搭建 基础环境搭建 24.04个人感觉相比较22.04有很多改变 安装中文输入法 选择区域与语言 增加输入法 ok 安装zsh 通过oh-my-zsh管理zsh sudo apt install curl sudo apt install zsh sudo apt install git gcc g make build-essential wget gedit sh -c &qu…

<Linux> 多线程

文章目录 线程线程互斥锁死锁 线程同步生产者消费者模型POSIX信号量基于环形队列的生产消费模型 线程池 线程 线程是进程内部可以独立运行的最小单位 进程是资源分配的基本单位&#xff0c;线程是调度器调度的基本单位 线程在进程的地址空间内运行 进程内的大部分资源线程是…

C++ | Leetcode C++题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:string shortestPalindrome(string s) {int n s.size();vector<int> fail(n, -1);for (int i 1; i < n; i) {int j fail[i - 1];while (j ! -1 && s[j 1] ! s[i]) {j fail[j];}if (s[j 1] …

SpringBoot 集成Swagger在线接口文档 接口注解

介绍 Swagger接口文档是一种自动生成、描述、调用和可视化的RESTful风格Web服务接口文档的工具。它通过一系列的规范和自动化工具&#xff0c;极大地简化了后端开发人员与前端开发人员之间的协作。 依赖 <!--swagger--> <dependency><groupId>io.springfo…

24年河南特岗教师招聘流程+报名流程

河南特岗教师报名流程如下 1.登录河南省特岗招聘网 登录河南省特岗招聘网注册账号和密码&#xff0c;账号可以是手机号或者身份证号&#xff0c;密码自己设置 2.注册登录账号 注册完账号重新登录账号&#xff0c;输入身份证号、手机号、密码、验证码 3.浏览考试须知 填写个人信…

基于惯性加权PSO优化的目标函数最小值求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于惯性加权PSO优化的目标函数最小值求解matlab仿真。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09;…

机器学习原理之 -- 最近邻算法分类:由来及原理详解

最近邻算法&#xff08;k-Nearest Neighbors&#xff0c;k-NN&#xff09;是一种简单且直观的分类算法&#xff0c;广泛应用于分类和回归问题。由于其易于理解和实现&#xff0c;k-NN在数据挖掘、模式识别和机器学习领域中占据重要地位。本文将详细介绍最近邻算法的由来、基本原…

使用 bend-ingest-kafka 将数据流实时导入到 Databend

作者&#xff1a;韩山杰 Databend Cloud 研发工程师 https://github.com/hantmac Databend是一个开源、高性能、低成本易于扩展的新一代云数据仓库。bend-ingest-kafka 是一个专为 Databend 设计的实时数据导入工具&#xff0c;它允许用户从 Apache Kafka 直接将数据流导入到 D…

【UML用户指南】-27-对体系结构建模-制品

目录 1、组成结构 2、制品的种类 2.1、部署制品 &#xff08;deployment artifact&#xff09; 2.2、工作产品制品 &#xff08;work product artifact&#xff09; 2.3、执行制品 &#xff08;execution artifact&#xff09; 3、标准元素 4、常用建模技术 4.1、对可执…

CGLib动态代理技术

基于CGLib的动态代理机制&#xff0c;ProxyFactoryy无需再像JDK动态代理那样实现一个interface&#xff0c;实际情况下可能这个interface并不存在&#xff0c;只需要实现另外一个接口MethodInterceptor即可 package com.hmdp.service.尚硅谷的代理模式3; //CGlib代理import …

UE5 03-物体碰撞检测

在你需要碰撞的物体上添加一个碰撞检测组件 碰撞预设 设置为NoCollision,这样移动过程中就不会有物理碰撞阻挡效果,只负责检测是否碰撞,比较难解释,如果学过Unity的话,可以把它理解成 Collision 为 Trigger

INFINI Console 使用介绍

上次在《INFINI Easysearch尝鲜Hands on》中我们部署了两个节点的Easysearch&#xff0c;并且也设置了Console对集群进行监控。那么今天我们再来介绍下INFINI Console的使用。 INFINI Console 仪表盘功能介绍 INFINI Console 是一个功能强大的数据管理和分析平台&#xff0c;…

conda env pip install error:No space left on device

conda 环境 pip install error&#xff1a;No space left on device 文章目录 conda 环境 pip install error&#xff1a;No space left on device现象1 实验2 分析和解决办法 现象 非root用户的服务器&#xff0c;需要安装环境&#xff0c;安装的环境超过2GB sudo pip insta…

Roboflow自动标定数据集

最近需要自己打数据集&#xff0c;记录一下用Roboflow来打标签。 https://roboflow.com/&#xff08;官网&#xff09; 进入官网先注册&#xff0c;注册完成后进入这个界面。 我先讲如果不想让数据集公开怎么办&#xff0c;因为这里每个新建的都是公开的。新账号进去应该进去…