1. 程式人生 > >pca+svm手寫數字識別

pca+svm手寫數字識別

在上一篇部落格裡講到在matlab中使用libsvm識別手寫數字,識別精度不高,一是svm的引數沒有設定好,二是在提取影象特徵時,直接將影象展開為一行,沒有做任何處理,導致其訓練速度和識別精度都不夠好,本文采用pca演算法提取影象特徵,然後再用svm進行分類。
主要分為兩步:
1、pca特徵提取
pca主成份分析,主要用來進行人臉識別,具體原理介紹可以參考這篇部落格http://blog.codinglabs.org/articles/pca-tutorial.html ,提取pca特徵主要有以下幾個步驟:
(1)將影象歸一化到固定大小n*n,然後展開為1*n^2的一維向量,假設有m個樣本,則最終形成一個m*n^2的陣列,每一行代表一個樣本,本文所用的影象大小為28*28,樣本類別為10,每個類別訓練圖為500張,則每一張圖展開後就是一個1*756的一維向量,最終形成一個5000*756的陣列dm;
(2)求每一個列向量的均值avg,其大小為1*n^2;
(3)差值a=dm-avg;
(4)協方差b=a*a’;
(5)求協方差矩陣b的特徵值和特徵向量,取前k個最大特徵值及對應的特徵向量T;
(6)令c=a’*T,c的大小為n^2*k,向量c則為原始影象到投影空間的投影向量;
(7)投影向量p=dm*c為樣本的特徵向量,其大小為m*k,即將一個n*n大小的影象對映為一個1*k的向量,每一行代表一個樣本;
(8)將求得的投影向量p送到svm分類器中進行訓練;

識別的時候,只需要將待識別的影象d(1*n^2)先減去均值avg,再與投影向量c相乘,即將原始影象d投影到其主成份分量所在的投影空間中,然後用訓練好的svm模型進行識別。
matlab自帶pca的函式,可以直接呼叫,當然也可以自己實現pca,過程也比較簡單。

clear;clc;
% 訓練樣本數量10*500
train_count=10;
train_count_per_num=500;
% 能量
energy=90;
train_path_mask='F:\\MATLAB\\R2014a\\work\\libsvm-3.11\\data\\shouxie\\pca_svm\\train\\%01d\\%01d.bmp'
; training_samples=[]; train_label=[];%訓練標籤 % img_size=10;% 歸一化影象大小 % 訓練,自帶的pca函式 tic for i=0:train_count-1 for j=1:train_count_per_num img=imread(sprintf(train_path_mask,i,j)); % img=imresize(img,[img_size img_size]); % 歸一化 if ndims(img)==3 img=rgb2gray(img); end
img=im2bw(img,5/255); training_samples=[training_samples;img(:)']; end train_label(i*train_count_per_num+1:(i+1)*train_count_per_num)=ones(1,train_count_per_num)*i; end training_samples=double(training_samples);%一定要轉double train_label=train_label'; %訓練的標籤 % mu=mean(training_samples); %訓練集中的平均值 [train_coeff,train_scores,~,~,train_explained,mu]=pca(training_samples); %pca train_idx=find(cumsum(train_explained)>energy,1); %idx為前k個特徵向量,explained特徵值 train_coeff=train_coeff(:,1:train_idx); %投影向量 train_img_arr=train_scores(:,1:train_idx); %特徵向量,訓練的樣本集 %svm訓練 model = svmtrain(train_label, train_img_arr, '-s 0 -c 1.5 -t 0 -g 3'); save('shouxie_model','model'); %儲存svm模型 xlswrite('train_coeff.xlsx',train_coeff); %儲存特徵向量 xlswrite('mu.xlsx',mu); %儲存樣本平均值,單樣本進行測試的時候會用到 %使用訓練集資料進行測試 [train_predict_label, train_accuracy, train_dec_values] =svmpredict(train_label, train_img_arr, model); % test the trainingdata %測試 test_path_mask='F:\\MATLAB\\R2014a\\work\\libsvm-3.11\\data\\shouxie\\pca_svm\\test\\%01d\\%01d.bmp'; test_count=10; test_count_per_num=100; test_samples=[]; test_label=[]; for i=0:test_count-1 for j=1:test_count_per_num img=imread(sprintf(test_path_mask,i,j)); % img=imresize(img,[img_size img_size]); % 歸一化 if ndims(img)==3 img=rgb2gray(img); end img=im2bw(img,5/255); test_samples=[test_samples;img(:)']; end test_label(i*test_count_per_num+1:(i+1)*test_count_per_num)=ones(1,test_count_per_num)*i; end test_samples=double(test_samples); test_label=test_label'; % test_img_arr=test_samples(:)-mu; test_mu=repmat(mu,1000,1); test_img_arr=test_samples-test_mu; test_img_arr=test_img_arr*train_coeff; %測試集資料投影到投影向量上 %svm測試 [test_predict_label, test_accuracy, test_dec_values] =svmpredict(test_label, test_img_arr, model); toc % test_img1=imread('F:\MATLAB\R2014a\work\libsvm-3.11\data\shouxie\pca_svm\test\0\10.bmp'); % % test_img1=imresize(test_img1,[img_size img_size]); % test_img1=rgb2gray(test_img1); % test_img1=im2bw(test_img1,5/255); % test_img1=double(test_img1); % test_img_arr1=test_img1(:)'-mu; % test_img_arr=test_img_arr1*train_coeff; % [predict_label, accuracy, dec_values] =svmpredict(1, test_img_arr, model);

這裡寫圖片描述
用訓練樣本進行測試的時候,Accuracy = 99.78% (4989/5000) ,用新的測試集時, Accuracy = 87.5% (875/1000),比直接使用原始圖進行訓練高多了,當然,其精度還可以進一步提升。改變-s -c -t -g 等引數進行訓練時,可能會出現過擬合、欠擬合等情況,需要多次嘗試確定其合適的引數值大小。引數調優可以參照這篇部落格http://blog.csdn.net/chunxiao2008/article/details/50448154 ,感謝博主。

相關推薦

pca+svm數字識別

在上一篇部落格裡講到在matlab中使用libsvm識別手寫數字,識別精度不高,一是svm的引數沒有設定好,二是在提取影象特徵時,直接將影象展開為一行,沒有做任何處理,導致其訓練速度和識別精度都不夠好,本文采用pca演算法提取影象特徵,然後再用svm進行分類。

KNN / SVM 數字識別-PCA降維

一.問題分析採用機器學習演算法對usps和mnist兩個資料集完成手寫數字識別任務。1.1.資料集介紹MNIST MNIST 資料集來自美國國家標準與技術研究所, National Institute of Standards and Technology (NIST)。訓練

MFC基於對話框 數字識別 SVM+MNIST數據集

識別數字 做了 XML svm 簡單實用 清空 朋友 detail data 完整項目下載地址: http://download.csdn.net/detail/hi_dahaihai/9892004 本項目即拿MFC做了一個畫板,畫一個數字後可自行識別數字。此外還 有保存

【機器學習--opencv3.4.1版本基於Hog特徵描述子Svm對經典數字識別

 方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。HOG特徵通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。 #include <iostream> #inc

OpenCV機器學習:SVM分類器實現MNIST數字識別

0. 開發環境 最近機器學習隨著AI人工智慧的興起越來越火,博主想找一些ML的庫來練手。突然想起之前在看Opencv的doc時發現有ML的component,於是心血來潮就開始寫程式碼試試。話不多說,直接進正題。 以下我的開發環境配置: -Windows7

【機器學習 sklearn】數字識別 SVM

執行結果: "D:\Program Files\Python27\python.exe" D:/PycharmProjects/sklearn/SVM.py (1797L, 64L) [[ 0. 0. 5. ..., 0. 0. 0.]

基於opencv的數字識別(MFC,HOG,SVM

因為本程式是提取HOG特徵,使用SVM進行分類的,所以大概瞭解下HOG的一些知識,其中我覺得怎麼計算影象HOG特徵的維度會對程式瞭解有幫助 關於HOG,我們可以參考: http://gz-ricky.blogbus.com/logs/85326

數字識別-SVM方法

1 匯入資料,檢視特徵 from sklearn import svm from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split import pandas as p

SVM實現數字識別

SVM簡介    知乎上的一個回答我認為是史上最NB最形象的SVM含義解釋,想看介紹戳這裡(裡面的第一個回答),再看看百科就能知道個大概了。開發環境    Windows10 + VS2013 + Qt580 + OpenCV300主要程式碼    利用opencv-SVM演

基於opencv3.4和SVM數字識別

  本文將使用opencv3.4和SVM識別手寫數字,開發環境為vs2013和C++。 資料集   opencv安裝資料夾的 “samples/data” 下預置了一張手寫數字的圖片,其包含了5000個 0至9 的手寫數字,每個數字

Matlab實現數字識別PCA+KNN)

</pre><pre name="code" class="plain">clear; addpath('../data/'); % images_train = loadMNISTImages('train-images-idx3-ubyte')'

BP神經網絡(數字識別

根據 公式 輸入 廣泛 不可變 理想 變化 n) 放大 1實驗環境 實驗環境:CPU [email protected]/* */,內存8G,windows10 64位操作系統 實現語言:python 實驗數據:Mnist數據集 程序使用的數據庫是mni

keras入門實戰:數字識別

如果 turn wid 寬度 initial 作用 err examples 預測 近些年由於理論知識的硬件的快速發展,使得深度學習達到了空前的火熱。深度學習已經在很多方面都成功得到了應用,尤其是在圖像識別和分類領域,機器識別圖像的能力甚至超過了人類。 本文用深度學習Pyt

【機器學習】數字識別算法

alt gdi 數字識別 -1 轉換 error: erro files turn 1.數據準備 樣本數據獲取忽略,實際上就是將32*32的圖片上數字格式化成一個向量,如下: 本demo所有樣本數據都是基於這種格式的 訓練數據:將圖片數據轉成1*1024的數組,作為一

Tensorflow - Tutorial (7) : 利用 RNN/LSTM 進行數字識別

ddc htm net sets 手寫 n-2 align csdn global 1. 經常使用類 class tf.contrib.rnn.BasicLSTMCell BasicLSTMCell 是最簡單的一個LSTM類。沒有實現clippi

Tensorflow實踐 mnist數字識別

model 損失函數 兩層 最簡 sin test http gif bat minst數據集      tensorflow的文檔中就自帶了mnist手寫數字識別的例子,是一個很經典也比較簡單

tensorflow 基礎學習五:MNIST數字識別

truncate averages val flow one die correct 表示 data MNIST數據集介紹: from tensorflow.examples.tutorials.mnist import input_data # 載入MNIST數據集,

第二節,TensorFlow 使用前饋神經網絡實現數字識別

com net config return pyplot dataset 運行 算法 但是 一 感知器 感知器學習筆記:https://blog.csdn.net/liyuanbhu/article/details/51622695 感知器(Percep

第三節,TensorFlow 使用CNN實現數字識別

啟用 out min 灰度 HA 打破 gre 大量 gray 上一節,我們已經講解了使用全連接網絡實現手寫數字識別,其正確率大概能達到98%,著一節我們使用卷積神經網絡來實現手寫數字識別, 其準確率可以超過99%,程序主要包括以下幾塊內容 [1]: 導入數據,即測試集和

Caffe的運行mnist數字識別

而不是 所在 結果 ack cif sting one efi 打開 老規矩,首先附上官方教程:http://caffe.berkeleyvision.org/gathered/examples/mnist.html 1、必要軟件   因為Caffe中使用的是Linux才能