基于svm图像分类C语言,基于SVM的图像分类

今天在星巴克呆了一天,复习了一下学习的内容,翻到了研一期间旁听人工智能的课程设计,第一个完全写的一个基于SVM的图像分类任务,记得当时我是实验室第一个独立完成课程设计的,其他小伙伴还是参考我的代码,现在工业界,已经被漫天的深度学习覆盖,难道忘记了曾经万能的SVM了吗?

还是写一遍小文,整理一下笔记,万一有初学者想要参考一下呢,也督促自己熟悉曾经做过的工作。

当时还在CSDN上写过一篇文章,原因是用matlab配置libsvm总是配置不好(当时Win8.1是最新版的系统,libsvm还是最流行的svm工具包,当时是2013年),博客地址在http://www.voidcn.com/article/p-rvsjheqy-zx.html ,只是写了个草稿,没想到,却成了评论最多的文章。

那就先把这个草稿整理完。

Windows64位 MATLAB使用LibSVM

在LibSVM的网站上下载压缩包,然后解压。会发现有一些文件夹还有一些代码文件,其中一个MATLAB的的文件夹,里面就是提供的matlab接口(这些都在根目录的README文件里面介绍了,还有其他接口的安装与使用说明)。

在MATLAB这个目录下也有一个README文件,这个文件详细的描述了如何使用LibSVM的MATLAB接口,其中介绍了64位系统提供了 预编译好的二进制可执行文件。

On Windows systems, pre-built binary files are already in the

directory '..\windows', so no need to conduct installation. Now we

provide binary files only for 64bit MATLAB on Windows. If you would

like to re-build the package, please rely on the following steps.

至于为什么编译不好,先不浪费时间在这上面了,应该是编译器版本的原因,现在Win10要比Win8.1稳定了,应该就没有这个问题了。

将根目录中的windows目录拷贝到MATLAB的安装目录中的toolboxs中,里面全是各种包,不用自己在维护一个文件夹了,然后在MATLAB中Set Path,把这Windows目录添加进去,在MATLAB中就可以使用了。

输入 svmtrain 测试一下,会输出基本的用法:

>> svmtrain

Usage: model = svmtrain(training_label_vector, training_instance_matrix, 'libsvm_options');

libsvm_options:

-s svm_type : set type of SVM (default 0)

0 -- C-SVC (multi-class classification)

1 -- nu-SVC (multi-class classification)

2 -- one-class SVM

3 -- epsilon-SVR (regression)

4 -- nu-SVR (regression)

-t kernel_type : set type of kernel function (default 2)

基于SVM的图像分类

这是一个课程设计,给定数据,设计分类器,建议使用SVM和kmeans。

问题描述

两类图像(一种是动物,也就是恐龙,另外一种是公共汽车)每种图像95张,总共190张图片,为了方便操作,已经使用sift工具包提取了sift特征描述子,设计了个分类器,可采用直接分割的方法用来训练和测试,也可用交叉验证法训练和测试。

基本思路

每个图像都被提取了SIFT特征,每个SIFT特征向量的维度是固定的,128维,但是每个图片会有多个sift描述子,数量不固定。

参考Bag of Visual Word模型,先用KMeans将将所有的SIFT描述子分类,比如分为10类,那么统计每个图像sift描述子的直方图分布描述子,这个直方图分布描述子就是10维的,这个类似于词袋模型,计算出每个图像的描述特征,然后用SVM训练一个监督学习分类器。

问题的关键点是用词袋模型来描述每张图片。

代码实现

用matlab 实现,下面是两个代码文件。

Main文件

%%######################################################################### % 名称:作业一

% 时间:2013.12.01

% 学院:计算机学院

%##########################################################################

%% %利用Bag of visual Word模型,使用Kmeans聚类,形成字典

%分类,采用监督学习方法,SVM,每种特征训练集于测试集的比例大约为2:1

%% %清空工作空间,清屏

clear all;

clc;

%% %文件夹'k_f'中存放恐龙图片的特征向量

%存放每个恐龙图片特征的文件名

file_name_k = dir('k_f');

%获取特征文件的个数

n_k = length(file_name_k);

%初始化一个矩阵,存放恐龙图片的所有的特征

d_k =zeros(1,128);

%初始化一个矩阵,存放每个恐龙图片的特征的个数

num = zeros(1,2);

%按照文件名读这些特征及其个数,分别存放在矩阵d_k和矩阵中num

for i=3:n_k

%组合文件名

name = strcat('./k_f/',file_name_k(i).name);

%没个特征文件第一行为特征的维数个个数,跳过第一行,读取特征矩阵,并用d临时存储

d = textread(name,'','headerlines',1);

%采用textread读取数据时,默认是以空格为间隔标志,没恶感特征向量都在结尾多了一个0 ,去除最后一维数据

d =d(:,1:128);

%将所有恐龙图片的特征向量存储在一个矩阵d_k中

d_k = [d_k ; d];

%eval(['data_k_' num2str(i-2) '=d']);

%从每个文件中读出每个图片特征的个数个维数

t = textread(['./k_f/' file_name_k(i).name],'',1);

%将每个图片的特征和维数都存放在矩阵num中

num = [num;t];

end

%end of loop

%获取此时矩阵num的维数,去除初始化时的第一行的无用数据

[m,n] =size(num);

num = num(2:m,:);

%获取恐龙图片的特征的矩阵的维数,去除初始化时第一行的无用数据

[m,n] = size(d_k);

d_k = d_k(2:m,:);

%% %文件夹'_f'中存放汽车图片的特征向量

%存放每个汽车图片特征的文件名

file_name_q = dir('q_f');

%获取特征文件的个数

n_q = length(file_name_q);

%初始化一个矩阵,存放汽车图片的所有的特征

d_q = zeros(1,128);

%按照文件名读这些特征及其个数,分别存放在矩阵d_q和矩阵中num

for i=3:n_q

%组合文件名

name = strcat('./q_f/',file_name_q(i).name);

%没个特征文件第一行为特征的维数个个数,跳过第一行,读取特征矩阵,并用d临时存储

d = textread(name,'','headerlines',1);

%采用textread读取数据时,默认是以空格为间隔标志,没恶感特征向量都在结尾多了一个0 ,去除最后一维数据

d =d(:,1:128);

%将所有汽车图片的特征向量存储在一个矩阵d_q中

d_q = [d_q ; d];

%eval(['data_q_' num2str(i-2) '=d']);

%从每个文件中读出每个图片特征的个数个维数

t = textread(['./q_f/' file_name_q(i).name],'',1);

%将每个图片的特征和维数都存放在矩阵num中

num= [num;t];

end

%end of loop

%获取汽车图片的特征的矩阵的维数,去除初始化时第一行的无用数据

[m,n] = size(d_q);

d_q = d_q(2:m,:);

%将恐龙和汽车的特征向量放在一个矩阵d中

d = [d_k;d_q];

%% %使用matlab内置的K-均值函数将所有的特征聚类

%idx = kmeans(d,10);

%使用K-中心点将所有的特征的聚类

idx = KMeans(d,10,2);

%% %初始化一个矩阵,用来记录每个图片特征给文件的由字典中的词的个数组成的向量

dema = zeros(190,10);

%设定每个图片特征在总的特征矩阵中的标志

last = 0;

%两重循环,构建每个特征文件的向量,组成一个新的矩阵

for i = 1:190

for j =1:num(i,1)

dema(i,idx(j+last)) = dema(i,idx(j+last)) +1;

end

last = num(i,1);

end

%分别提取出训练数据和测试数据,比例是2:1

train_data = dema(1:60,:);

train_data = [train_data;dema(96:155,:)];

test_data = dema(61:95,:);

test_data= [test_data;dema(156:190,:)];

%存储类别标志,对应训练数据和测试数据

label_train = zeros(1,60);

label_train = [label_train,ones(1,60)];

label_train = label_train'; label_test = zeros(1,35); label_test = [label_test,ones(1,35)]; label_test = label_test';

%% %使用svmtrain函数训练

model = svmtrain(label_train,train_data);

%用训练的数据预测待测试的数据

[predice_label,accuracy,dec_values] = svmpredict(label_test,test_data,model);

%end

KMeans是参考了网络资源:

function label = KMeans( data,K,mode)

% -data

% -K: number of clusters

% -mode:

% 1: use kmeans cluster algorithm in matlab

% 2: k_medroid algorithm: use data points as k centers

N_samples = 91024;

N_features = 128;

switch (mode)

%call system function KMeans

case 1

label = kmeans(data,K);

%use kmedroid method

case 2

for testcase = 1:10% do 10 times to get rid of the influence from Initial_center

K_center = Initial_center(data,K); %select initial points randomly

changed_label = N_samples;

label = zeros(1,N_samples);

iteration_times = 0;

while changed_label~=0

cls_label = cell(1,K);

for i = 1: N_samples

for j = 1 : K

D(j) = dis(data(i,:),K_center(j,:));

end

[~,label(i)] = min(D);

cls_label{label(i)} = [cls_label{label(i)} i];

end

changed_label = 0;

cls_center = zeros(K,N_features);

for i = 1 : K

cls_center(i,:) = mean(data(cls_label{i},:));

D1 = [];

for j = 1:size(cls_label{i},2)%number of samples clsutered in i-th class

D1(j) = dis(cls_center(i,:),data(cls_label{i}(j),:));

end

[~,min_ind] = min(D1);

if ~isequal(K_center(i,:),data(cls_label{i}(min_ind),:))

K_center(i,:) = data(cls_label{i}(min_ind),:);

changed_label = changed_label+1;

end

end

iteration_times = iteration_times+1;

end

end

end

function center = Initial_center(X,K)

rnd_Idx = randperm(N_samples,K);

center = X(rnd_Idx,:);

end

function res = dis(X1,X2)

res = norm(X1-X2);

end

end

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SVM(Support Vector Machine,支持向量机)是一种常用的分类算法,使用C语言可以进行其实现。SVM的目标是寻找一个最优的超平面,将不同类别的数据分隔开来。 下面是一个简单的使用C语言实现SVM的伪代码: 1. 导入所需的头文件和函数库。 2. 定义需要的全局变量,如数据集、特征向量和相应的类别标签。 3. 实现数据的预处理,包括数据读取、标准化等。 4. 实现SVM的训练过程: a. 初始化超平面的参数向量和偏置项。 b. 遍历样本数据集,计算每个样本点到超平面的距离,并根据分类准则进行分类。 c. 更新超平面的参数向量和偏置项,使分类准确率最高。 d. 迭代以上过程,直到满足停止条件。 5. 实现SVM的预测过程: a. 计算测试样本点到超平面的距离,根据分类准则进行分类。 b. 返回预测的类别标签。 6. 编写主函数,调用训练函数和预测函数,输出结果。 需要注意的是,SVM算法的实现较为复杂,需要考虑到许多因素,如核函数的选择、拉格朗日乘子的计算等。除了手动实现,也可以使用机器学习库如LIBSVM、scikit-learn等进行SVM算法的实现。 ### 回答2: 支持向量机(Support Vector Machine,SVM)是一种常用的分类算法,能够进行线性和非线性的分类任务。它的核心思想是通过构建最优的超平面,将不同类别的样本分开。 SVMC语言实现主要包括以下几个步骤: 1. 数据预处理:首先需要加载数据集,并对数据进行预处理,如归一化或标准化,使得数据在同一尺度上。 2. 计算核函数:对于非线性问题,SVM需要通过核函数将数据映射到高维特征空间。常用的核函数有线性核、多项式核和高斯核等。 3. 计算损失函数:SVM通过最小化损失函数来训练模型。常用的损失函数是hinge损失,可以使用梯度下降等优化算法进行求解。 4. 模型训练:利用训练数据集,通过求解最优化问题,得到模型的参数和支持向量。 5. 模型预测:根据得到的模型参数和支持向量,对新的样本进行预测,判断其属于哪个类别。 在C语言中,可以使用矩阵运算库(如BLAS、LAPACK)来加速运算过程,以提高算法的效率。 总结起来,SVM分类算法的C语言实现由数据预处理、计算核函数、计算损失函数、模型训练和模型预测等步骤组成。在实际应用中,可以根据具体需求选择不同的核函数和优化算法,来构建和训练SVM模型。SVM在文本分类、图像识别、生物信息学等领域有着广泛的应用。 ### 回答3: 支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,主要用于数据分类和回归分析。SVM通过寻找一个最优超平面将数据集划分成不同的类别。 在C语言中实现SVM分类算法,首先需要理解SVM的原理和算法步骤。使用C语言可以通过结构体和数组来表示数据集和向量等对象,也可以利用循环和条件判断等语句实现算法的各个步骤。 一种常见的SVM分类算法实现步骤如下: 1. 数据预处理:读取训练数据集,分离出特征向量和标签,对数据进行归一化处理。 2. 定义和初始化模型参数:包括权重向量w、偏置b和学习率等。 3. 计算目标函数:根据SVM的目标函数和约束条件,计算损失函数和正则化项。 4. 参数更新:使用梯度下降法或其他优化算法,更新模型参数w和b。 5. 训练模型:迭代地重复步骤3和步骤4,直到达到收敛条件。 6. 预测分类:使用训练得到的模型对新的数据进行分类预测。 在C语言中实现SVM分类算法,可以按照上述步骤编写相应的函数和代码。具体实现中,可能需要用到矩阵计算库、数值计算库或者线性代数库等工具,来方便地处理向量运算、矩阵运算和优化算法等。 总之,SVM算法的C语言实现主要涉及数据预处理、模型参数更新和分类预测等步骤,通过合理的数据表示和算法实现,可以有效地实现SVM分类算法并应用于实际问题中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值