手寫數字庫很容易建立,但是總會很浪費時間。Google實驗室的Corinna Cortes和紐約大學柯朗研究所的Yann LeCun建有一個手寫數字數據庫,訓練庫有60,000張手寫數字圖像,測試庫有10,000張。
請訪問原站 http://yann.lecun.com/exdb/mnist/
該數據庫在一個文件中包含了所有圖像,使用起來有所不便。如果我把每個圖像分別保存,成了圖像各自獨立的數據庫。
並在Google Code中托管。
如果你有需要,歡迎在此下載:
http://yann.lecun.com/exdb/mnist/
http://code.google.com/p/supplement-of-the-mnist-database-of-handwritten-digits/downloads/list
Handwritten Digits MNIST Handwritten Digits [data/mnist_all.mat]
[training pictures: 0 1 2 3 4 5 6 7 8 9 ]
[testing pictures: 0 1 2 3 4 5 6 7 8 9 ]
8-bit grayscale images of "0" through "9"; about 6K training examples of each class; 1K test examples USPS Handwritten Digits [data/usps_all.mat]
[pictures: 0123456789 ]
8-bit grayscale images of "0" through "9"; 1100 examples of each class. Binary Alphadigits [data/binaryalphadigs.mat] [picture]
Binary 20x16 digits of "0" through "9" and capital "A" through "Z". 39 examples of each class.
From Simon Lucas' (sml@essex.ac.uk), Algoval system.
另有提供matlab讀取的MNIST、USPS、Binary Alphadigits數據庫,Data for MATLAB hackers,見:http://www.cs.toronto.edu/~roweis/data.html
參考網址:
[1] http://yann.lecun.com/exdb/mnist/
[2] http://hi.baidu.com/ln0707/blog/item/8207ef010a243d81d53f7c03.html
[3] http://www.cs.toronto.edu/~roweis/data.html
[4] http://blog.csdn.net/onezeros/archive/2010/05/28/5631930.aspx
如何使用MNIST數據集:
MNIST是一個據說很出名的手寫數字數據庫,據說是美國中學生手寫的數字,說實話大部分都寫得挺丑的。。。Anyway,幸好能看得懂是哪個數字。現在課題是用CNN(卷積神經網絡)識別這個數據庫的數字。我想,CNN還真沒懂,不過先搞清楚怎么讀入數據庫吧,不然空有理論無法實操。一般人會用MATLAB來做神經網絡的東東,而我正是一個一般人。當然,非一般的人可能用python之類的高端平台,反正我是不會。。。
首先上搜索引擎,無論是百度還是google,搜“MNIST”第一個出來的肯定是
下面用其中一個包t10k-images_idx3為例子,寫代碼說明如何使用這個數據庫。
這是從verysource.com上面下載的源碼,贊一個!and再贊一個!
% Matlab_Read_t10k-images_idx3.m
% 用於讀取MNIST數據集中t10k-images.idx3-ubyte文件並將其轉換成bmp格式圖片輸出。
% 用法:運行程序,會彈出選擇測試圖片數據文件t10k-labels.idx1-ubyte路徑的對話框和
% 選擇保存測試圖片路徑的對話框,選擇路徑后程序自動運行完畢,期間進度條會顯示處理進度。
% 圖片以TestImage_00001.bmp~TestImage_10000.bmp的格式保存在指定路徑,10000個文件占用空間39M。。
% 整個程序運行過程需幾分鍾時間。
% Written By DXY@HUST IPRAI
% 2009-2-22
clear all;
clc;
%讀取訓練圖片數據文件
[FileName,PathName] = uigetfile('*.*','選擇測試圖片數據文件t10k-images.idx3-ubyte');
TrainFile = fullfile(PathName,FileName);
fid = fopen(TrainFile,'r'); %fopen()是最核心的函數,導入文件,‘r’代表讀入
a = fread(fid,16,'uint8'); %這里需要說明的是,包的前十六位是說明信息,從上面提到的那個網頁可以看到具體那一位代表什么意義。所以a變量提取出這些信息,並記錄下來,方便后面的建立矩陣等動作。
MagicNum = ((a(1)*256+a(2))*256+a(3))*256+a(4);
ImageNum = ((a(5)*256+a(6))*256+a(7))*256+a(8);
ImageRow = ((a(9)*256+a(10))*256+a(11))*256+a(12);
ImageCol = ((a(13)*256+a(14))*256+a(15))*256+a(16);
%
從上面提到的網頁可以理解這四句,給出了數據集的大小
if ((MagicNum~=2051)||(ImageNum~=10000))
error('不是 MNIST t10k-images.idx3-ubyte 文件!');
fclose(fid);
return;
end %排除選擇錯誤的文件。
savedirectory = uigetdir('','選擇測試圖片路徑:');
h_w = waitbar(0,'請稍候,處理中>>');
for i=1:ImageNum
b = fread(fid,ImageRow*ImageCol,'uint8'); %fread()也是核心的函數之一,b記錄下了一副圖的數據串。注意這里還是個串,是看不出任何端倪的。
c = reshape(b,[ImageRow ImageCol]); %亮點來了,reshape重新構成矩陣,終於把串轉化過來了。眾所周知圖片就是矩陣,這里reshape出來的灰度矩陣就是該手寫數字的矩陣了。
d = c'; %轉置一下,因為c的數字是橫着的。。。
e = 255-d; %根據灰度理論,0是黑色,255是白色,為了弄成白底黑字就加入了e
e = uint8(e);
savepath = fullfile(savedirectory,['TestImage_' num2str(i,d) '.bmp']);
imwrite(e,savepath,'bmp'); %最后用imwrite寫出圖片
waitbar(i/ImageNum);
end
fclose(fid);
close(h_w);
在選擇好的路徑中,就有了一大堆MNIST的手寫數字的圖片。想弄哪個,就用imread()弄它!