基于libsvm的手写字体识别

 

基于libsvm的手写字体识别

——30cases与40cases&25cases“联谊”第三弹

By faruto

2010/6/2

         “联谊”案例:30cases第12、13章(libsvm分类相关),25cases案例18——9.3.5(用matlab自带的svm实现手写字体识别),40cases案例39(用贝叶斯判别实现手写字体识别)

         现用libsvm来实现手写字体识别,测试图片用的亦是25cases和40cases中的那手写字体的训练样本和测试样本。主体程序思想为25cases中的代码过程,改进之处为利用libsvm加强工具箱利用GA(或者gridsearch)来实现参数寻优,采用的核函数为RBF核函数。O(∩_∩)O~

最终测试集合的分类效果是:

Accuracy = 93.3333% (28/30) (classification) 即只有两个被错分

Rocwoods测试集合的效果是90%(27/30) 即只有三个被错分

谢老师测试集合的效果是93.3333% (28/30) (classification) 即只有两个被错分

由于训练集和测试集数目都比较小,以上的结果都是可以接受的。

我尝试调整参数将准确率再提高一些,最终作罢,估计在前期的图片预处理上下功夫,才能达到完全的测试集识别。O(∩_∩)O~

 

         附: MATLAB自带的svm实现函数与libsvm差别小议:

1 MATLAB自带的svm实现函数仅有的模型是C-SVC(C-support vector classification);而libsvm工具箱有C-SVC(C-support vector classification),nu-SVC(nu-support vector classification),one-class SVM(distribution estimation),epsilon-SVR(epsilon-support vector regression),nu-SVR(nu-support vector regression)等多种模型可供使用。

2 MATLAB自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题。

3 MATLAB自带的svm实现函数仅支持二分类问题,多分类问题需按照多分类的相应算法编程实现;而libsvm采用1v1算法支持多分类。

4 MATLAB自带的svm实现函数采用RBF核函数时无法调节核函数的参数gamma,貌似仅能用默认的;而libsvm可以进行该参数的调节。

5 libsvm中的二次规划问题的解决算法是SMO;而MATLAB自带的svm实现函数中二次规划问题的解法有三种可以选择:经典二次方法;SMO;最小二乘。(这个是我目前发现的MATLAB自带的svm实现函数唯一的优点~)

         在以上的一些对比下,我个人建议目前svm的实现还是使用libsvm(这个应该是目前最好用的svm工具箱),当然MATLAB自带的svm实现函数对于简单问题也可使用,MATLAB自带的svm实现函数可能会在更加新的版本里面进行完善,我也曾尝试用MATLAB自带的svm实现函数来进行重新封装实现libsvm中的所有功能但工作量有些大~

         测试代码:

[code]

function CharacterRecognitionLibsvm

% Character Recognition based on libsvm

% by faruto

% Email:patrick.lee@foxmail.com

% QQ:516667408

% http://blog.sina.com.cn/faruto

% last modified 2010.06.02

% Super Moderator @ www.ilovematlab.cn

%%

tic;

close all;

clear;

clc;

format compact;

%% 载入训练数据

[FileName,PathName,FilterIndex] = uigetfile( ...

    {'*.jpg';'*.bmp'},'请导入训练图片','*.jpg','MultiSelect','on');

if ~FilterIndex

    return;

end

num_train = length(FileName);

TrainData = zeros(num_train,16*16);

TrainLabel = zeros(num_train,1);

for k = 1:num_train

    pic = imread([PathName,FileName{k}]);

    pic = pic_preprocess(pic);

   

    TrainData(k,:) = double(pic(:)');

    TrainLabel(k) = str2double(FileName{k}(4));

end

%% 建立支持向量机

% [bestCVaccuracy,bestc,bestg] = ...

    SVMcgForClass(TrainLabel,TrainData,-8,8,-8,8,10,0.8,0.8,4.5)

 

    ga_option.maxgen = 100;

    ga_option.sizepop = 20;

    ga_option.cbound = [0,100];

    ga_option.gbound = [0,100];

    ga_option.v = 10;

    ga_option.ggap = 0.9;

    [bestCVaccuracy,bestc,bestg] = ...

    gaSVMcgForClass(TrainLabel,TrainData,ga_option)

 

cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];

model = svmtrain(TrainLabel, TrainData, cmd);

 

preTrainLabel = svmpredict(TrainLabel, TrainData, model);

%% 载入测试样本

[FileName,PathName,FilterIndex] = uigetfile( ...

    {'*.jpg';'*.bmp'},'请导入测试图片','*.bmp','MultiSelect','on');

if ~FilterIndex

    return;

end

num_train = length(FileName);

TestData = zeros(num_train,16*16);

TestLabel = zeros(num_train,1);

for k = 1:num_train

    pic = imread([PathName,FileName{k}]);

    pic = pic_preprocess(pic);

   

    TestData(k,:) = double(pic(:)');

    TestLabel(k) = str2double(FileName{k}(4));

end

%% 对测试样本进行分类

preTestLabel = svmpredict(TestLabel, TestData, model);

%% sub function of pre-processing pic

function pic_preprocess = pic_preprocess(pic)

pic = 255-pic;

pic = im2bw(pic,0.4);

[y,x] = find(pic == 1);

pic_preprocess = pic(min(y):max(y), min(x):max(x));

pic_preprocess = imresize(pic_preprocess,[16,16]);

%%

toc;

[/code]

 

测试结果:

[code]

bestCVaccuracy =

    98

bestc =

    3.4933

bestg =

    9.1004

Accuracy = 100% (50/50) (classification)

Accuracy = 93.3333% (28/30) (classification)

[/code]

 

===========================

K>> TestLabel'

ans =

  Columns 1 through 6

                    1

  Columns 7 through 12

                     3

  Columns 13 through 18

                    5

  Columns 19 through 24

                    7

  Columns 25 through 30

              9        9

K>> preTestLabel'

ans =

  Columns 1 through 6

                    7

  Columns 7 through 12

                    3

  Columns 13 through 18

                    5

  Columns 19 through 24

                    7

  Columns 25 through 30

              7         9

 

GA参数寻优化结果图:

 基于libsvm的手写字体识别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值