安装

1. 在http://www.csie.ntu.edu.tw/~cjlin/ 中下载libsvm

2. 按照http://zjhello123.blog.163.com/blog/static/25495143201251792625811/ 中的安装方法安装libsvm

3. 设置路径。 如果不设置的话会报错:Error using svmtrain (line 233) Y must be a vector or a character array.

我开始设置了也报错,后来重新make了一下,就好了。不知道为什么。

使用

用libsvm对人和车分类

1. 先分别在两个文件夹下放入若干张人和车的图片,做训练样本。再用两个文件夹中放若干图片做测试样本。

2. 读入图片,保存成mat数据。具体代码如下:

clc;clear;
pathname=uigetdir(cd,'请选择文件夹');
if pathname==0
msgbox('您没有正确选择文件夹');
return;
end % pathnamesub=uigetdir(cd,'请选择文件夹');
% if pathname==0
% msgbox('您没有正确选择文件夹');
% return;
% end % 可以打开几乎所有的图像类型
filesbmp=ls(strcat(pathname,'\*.bmp'));
filesjpg=ls(strcat(pathname,'\*.jpg'));
filesjpeg=ls(strcat(pathname,'\*.jpeg'));
filesgif=ls(strcat(pathname,'\*.gif'));
filestif=ls(strcat(pathname,'\*.tif'));
filespng=ls(strcat(pathname,'\*.png'));
files=[cellstr(filesbmp);cellstr(filesjpg);...
cellstr(filesjpeg);cellstr(filesgif);...
cellstr(filestif);cellstr(filespng)];
len=length(files);
flag=[]; % 开始批量处理图像,转换格式
num=0;
for ii=1:len
if strcmp(cell2mat(files(ii)),'')
continue;
end
num=num+1;
Filesname{num}=strcat(pathname,'\',files(ii));
page{num}=imread(cell2mat(Filesname{num})); end filename=input('outputfilename:','s');
save (['C:\Documents\MATLAB\svm数据\',filename],'page');

对训练和测试的四个文件夹分别调用上面代码,会把每个文件夹中的图片都存在 page里面 自己再改名字 我分别命名为

3.

将上面的数据转换成svmtrain调用时需要的数据: 包括灰度化、统一大小、提取特征(这里用的hog特征)、生成label数据等

%获取训练数据
load('C:\Users\Documents\MATLAB\svm数据\car_train_svm_rgb.mat');
load('C:\Users\Documents\MATLAB\svm数据\person_train_svm_rgb.mat'); num_train_car = size(car_train_svm_rgb);
num_train_person = size(person_train_svm_rgb);
train_num = num_train_car(1, 2) + num_train_person(1, 2); %总训练样本数目
train_data = zeros(train_num, 1);
train_label = zeros(train_num, 1); for i = 1 : 1 : num_train_car(1, 2)
data_gray=rgb2gray(car_train_svm_rgb{1,i});
data_resize=double(imresize(data_gray,[64 64])); %把数据都转为64 * 64大小的灰度图
feature_of_one = hog(data_resize); %获取hog特征
[m1, n1] = size(feature_of_one);
for j = 1 : 1 : n1
oneline = feature_of_one{1, j};
[m, n] = size(oneline);
colb = (j - 1) * n + 1;
cole = j * n;
train_data(i, colb : cole) = oneline;
train_label(i, 1) = 1; %car的标签为1
end
end for i = 1 : 1 : num_train_person(1, 2)
data_gray=rgb2gray(person_train_svm_rgb{1,i});
data_resize=double(imresize(data_gray,[64 64])); %把数据都转为64 * 64大小的灰度图
feature_of_one = hog(data_resize); %获取hog特征
[m1, n1] = size(feature_of_one);
for j = 1 : 1 : n1
oneline = feature_of_one{1, j};
[m, n] = size(oneline);
colb = (j - 1) * n + 1;
cole = j * n;
train_data(i + num_train_car(1, 2), colb : cole) = oneline;
train_label(i + num_train_car(1, 2), 1) = 2; %person的标签为2
end
end %获取测试数据
load('C:\Users\Documents\MATLAB\svm数据\car_test_svm_rgb.mat');
load('C:\Users\Documents\MATLAB\svm数据\person_test_svm_rgb.mat'); num_test_car = size(car_test_svm_rgb);
num_test_person = size(person_test_svm_rgb);
test_num = num_test_car(1, 2) + num_test_person(1, 2); %总训练样本数目
test_data = zeros(test_num, 1);
test_label = zeros(test_num, 1); for i = 1 : 1 : num_test_car(1, 2)
data_gray=rgb2gray(car_test_svm_rgb{1,i});
data_resize=double(imresize(data_gray,[64 64])); %把数据都转为64 * 64大小的灰度图
feature_of_one = hog(data_resize); %获取hog特征
[m1, n1] = size(feature_of_one);
for j = 1 : 1 : n1
oneline = feature_of_one{1, j};
[m, n] = size(oneline);
colb = (j - 1) * n + 1;
cole = j * n;
test_data(i, colb : cole) = oneline;
test_label(i, 1) = 1; %car的标签为1
end
end for i = 1 : 1 : num_test_person(1, 2)
data_gray=rgb2gray(person_test_svm_rgb{1,i});
data_resize=double(imresize(data_gray,[64 64])); %把数据都转为64 * 64大小的灰度图
feature_of_one = hog(data_resize); %获取hog特征
[m1, n1] = size(feature_of_one);
for j = 1 : 1 : n1
oneline = feature_of_one{1, j};
[m, n] = size(oneline);
colb = (j - 1) * n + 1;
cole = j * n;
test_data(i + num_test_car(1, 2), colb : cole) = oneline;
test_label(i + num_test_car(1, 2), 1) = 2; %person的标签为2
end
end

hog特征提取代码: 网上找的,可以用。抱歉不记得来源了。

function feature = hog(img)

[m n]=size(img);

img=sqrt(img);      %伽马校正

%下面是求边缘
fy=[-1 0 1]; %定义竖直模板
fx=fy'; %定义水平模板
Iy=imfilter(img,fy,'replicate'); %竖直边缘
Ix=imfilter(img,fx,'replicate'); %水平边缘
Ied=sqrt(Ix.^2+Iy.^2); %边缘强度
Iphase=Iy./Ix; %边缘斜率,有些为inf,-inf,nan,其中nan需要再处理一下 %下面是求cell
step=16; %step*step个像素作为一个单元
orient=9; %方向直方图的方向个数
jiao=360/orient; %每个方向包含的角度数
Cell=cell(1,1); %所有的角度直方图,cell是可以动态增加的,所以先设了一个
ii=1;
jj=1;
for i=1:step:m - step %如果处理的m/step不是整数,最好是i=1:step:m-step
ii=1;
for j=1:step:n - step %注释同上
tmpx=Ix(i:i+step-1,j:j+step-1);
tmped=Ied(i:i+step-1,j:j+step-1);
tmped=tmped/sum(sum(tmped)); %局部边缘强度归一化
tmpphase=Iphase(i:i+step-1,j:j+step-1);
Hist=zeros(1,orient); %当前step*step像素块统计角度直方图,就是cell
for p=1:step
for q=1:step
if isnan(tmpphase(p,q))==1 %0/0会得到nan,如果像素是nan,重设为0
tmpphase(p,q)=0;
end
ang=atan(tmpphase(p,q)); %atan求的是[-90 90]度之间
ang=mod(ang*180/pi,360); %全部变正,-90变270
if tmpx(p,q)<0 %根据x方向确定真正的角度
if ang<90 %如果是第一象限
ang=ang+180; %移到第三象限
end
if ang>270 %如果是第四象限
ang=ang-180; %移到第二象限
end
end
ang=ang+0.0000001; %防止ang为0
Hist(ceil(ang/jiao))=Hist(ceil(ang/jiao))+tmped(p,q); %ceil向上取整,使用边缘强度加权
end
end
Hist=Hist/sum(Hist); %方向直方图归一化
Cell{ii,jj}=Hist; %放入Cell中
ii=ii+1; %针对Cell的y坐标循环变量
end
jj=jj+1; %针对Cell的x坐标循环变量
end %下面是求feature,2*2个cell合成一个block,没有显式的求block
[m n]=size(Cell);
feature=cell(1,(m-1)*(n-1));
for i=1:m-1
for j=1:n-1
f=[];
f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];
feature{(i-1)*(n-1)+j}=f;
end
end %到此结束,feature即为所求
%下面是为了显示而写的
% l=length(feature);
% f=[];
% for i=1:l
% f=[f;feature{i}(:)'];
% end
% figure
% mesh(f)
end

4.训练预测

model = svmtrain(train_label, train_data, '-s 0 -t 2 -c 1 -g 0.1');
[predicted_label, accuracy, decision_values] = svmpredict(test_label, test_data, model);

结果如下:

【matlab】libsvm-3.18安装与使用的更多相关文章

  1. Apache2.4.23+PHP5.6.30+MySQL5.7.18安装教程

    最近在工作中常常接触到PHP,自己也写过一些简单的PHP页面.我们知道PHP是在服务器端运行的脚本语言,因此我们需要配置服务器环境.之前为了省事直接使用的是wamp集成环境,但是突然某一天领导要求我们 ...

  2. matlab怎么查看已安装哪些工具箱和…

    问题描述:matlab怎么查看已安装哪些工具箱和它们相应的版本 解决方法:在命令行里敲击der,回车 效果:

  3. Centos7.3下mysql5.7.18安装并修改初始密码的方法

    Centos7.3下mysql5.7.18安装并修改初始密码的方法 原文链接:http://www.jb51.net/article/116032.htm 作者:Javen205 字体:[增加 减小] ...

  4. windows版mysql5.7.18安装

    windows版mysql5.7.18安装 初始化命令:C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe --defaults-file=& ...

  5. CentOS 6.9上安装Mysql 5.7.18 安装

    CentOS 6.9上安装Mysql 5.7.18 安装 下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-g ...

  6. Ubuntu 18 安装搜狗输入法

    Ubuntu 18 安装搜狗输入法: 1. 搜狗输入法官网下载对应的Linux输入法 2. 双击 刚刚下载好的 deb 文件 3. 点击 install(安装) 4. 在 settings(系统设置) ...

  7. libSVM在matlab下的使用安装

    1) 从LIBSVM的官网http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载最新版本的LIBSVM,当前版本为libsvm-3.18.zip 2) 解压压缩包到电 ...

  8. Matlab2012a下配置LibSVM—3.18

    1.下载最新版LibSVM 点击此处打开网页,点击zip file下载最新版的文件并解压放在任何目录下,建议放在安装目录便于查找.如我的文件解压在路径C:\ProgramFiles\MATLAB\R2 ...

  9. CentOS x64上Matlab R2015b的镜像安装方法与卸载

    0. 原料 (1). CentOS_x64系统 CentOS 2.6.32-573.el6.x86_64 (2). Matlab  R2015b_glnxa64.iso,可以从百度网盘下载到:链接: ...

随机推荐

  1. 详解CSS中clear属性both、left、right值的含义

    前几天一朋友在群里问clear:left的意思,我以为是简单的清除浮动问题,就让他百度"清除浮动",导致中间有点小误会.后来我按照他写的DEMO,发现我自己也没完全理解clear: ...

  2. ggplot2 上篇

    title: "ggplot2 上篇" author: "li_volleyball" date: "2016年4月16日" output: ...

  3. nyoj 252 01串 动态规划( java)

    当n=2时, 输出 3:当n=3时, 输出 5:当n=4时, 输出 8: #### 分析: 当n=4时,如 0101 符合条件, 当第一个位置是0时,还剩3个位置 ,与n=3时个数相等: 符合条件的为 ...

  4. 关于外部引用JS,中文乱码的问题

    asp.net 页面默认编码为UTF-8, 如果js嵌套写在asp.net中,不会导致中文乱码,因为他们具有相同的编码 外部引用js由于编码格式与asp.net的编码不同,javascript编码默认 ...

  5. Linux/CentOS 同步网络时间

    由于硬件的原因,机器或多或少的跟标准时间对不上,一个月的误差几秒到几分钟不等.对于服务器来说时间不准,会有很多麻烦.例如,支付的时候,无法下单,游戏无法登录等. 方法一:用 ntpdate从时间服务器 ...

  6. Google Java编程风格指南中文版

    作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...

  7. DEV控件GridControl常用属性设置

    1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...

  8. header()相关

    header("Content-type: text/html; charset=utf-8"); header("refresh:3;url=biaodan.php?n ...

  9. Java BigDecimal详解

    借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 较为精确的快速近 ...

  10. word20161205

    cluster-aware application / 支持群集的应用程序 cluster-unaware application / 不支持群集的应用程序 Cluster.exe CNAME (ca ...