手寫數字識別數據集minist
手寫數字識別是一個典型的多分類問題,輸入一個樣本,輸出識別結果。樣本的類別數為10類,分別代表0~10這十個數字,其中,分類器的輸入是一張包含單個數字的圖片,輸出為一個十維的向量,有且只有一維為1,其余為0。表示輸入樣本將會被唯一分類到一個類別當中,即被唯一地識別為某一個數字。
模式識別課程鏈接:https://www.icourse163.org/course/BIT-1206703821
數據集下載地址:鏈接:https://pan.baidu.com/s/1b-8tzCp2neh3NsY81mcfdg 提取碼:kaz0
程序源碼
% mat2vector.m % 輸入:圖片數據(矩陣),樣本個數 % 函數作用:將圖片組轉化為行向量的組合,每個行向量作為一張圖片的特征 % 輸出:樣本數*圖片像素數量大小的矩陣 function [data_]= mat2vector(data,num) [row,col,~] = size(data); data_ = zeros(num,row*col); for page = 1:num for rows = 1:row for cols = 1:col data_(page,((rows-1)*col+cols)) = im2double(data(rows,cols,page)); end end end end % Template_hand.m % 手寫數字模板匹配 clc clear al % 讀取模板 image = cell(1,10); % 生成十個cell保存模板 for i = 0:9 filename = sprintf('./手寫數字/%d/5.bmp',i); % 讀取模板 image{1,i+1} = mat2vector(imresize(imread(filename),[28,28]),1); % 統一大小為28*28,並調用函數mat2vector將其轉換為行向量 end % 待匹配樣本 correct_num = 0; for index = 0:9 % 每個數字測試一次 distance = zeros(1,10); % 保存計算得到的距離值 fname = sprintf('./手寫數字/%d/4.bmp',index); sample = mat2vector(imresize(imread(fname),[28,28]),1); % 圖片轉換為行向量 for j = 1:10 % 共十個模板,計算與每個模板的距離 distance(j) = pdist2(sample,image{1,j},'euclidean'); % 計算歐式距離,這里可以更改‘euclidean’為其他距離,用於描述相似度 end [m,p] = min(distance); % 計算距離最小值,並給出索引 if p-1 == index correct_num = correct_num+1; end fprintf('數字%d到模板的最小距離為:%d,匹配到的類別為:%d\n',[index,m,p-1]); % 索引從1開始,模板從0開始,因此減一輸出 end fprintf('共測試10個樣本,正確匹配個數為%d個\n',[correct_num]);