前期准備:
文件夾train:此文件夾中按類別分好子文件夾,各子文件夾里存放相應圖片
文件夾test:同train,有多少類就有多少個子文件夾
trainlabels.txt : 存的是訓練集的標簽
testlables.txt: 存的是測試集的標簽
(特別注意:文件的路徑以及文件名要對應)
第一步
生成train文件夾和test文件夾以及標簽文件。本文用的是matlab對數據集進行讀取,然后輸出圖片到相應文件夾中,並且生成標簽文件。此處給出matlab的代碼,請自行分析。
%% 實現圖片的輸出,將圖片輸出到train和test兩個文件夾下,並且對圖片進行重命名 % 同時給所有圖片打標簽,存於test_labels.txt trainlabels.txt % % clear rand('seed',1); datadir = ('D:\matconvnet-beta23\data\chars74K\Fnt'); % 原數據集所在路徑 catedir=dir(datadir); % 獲取數據集下信息 trainratio = 0.8; % 百分之八十訓練 train_labels= fopen('train_labels.txt','wt'); % 創建標簽文件 test_labels = fopen('test_labels.txt','wt'); class_num = 0 ; % 記錄類別 for i =3:length(catedir) sampdir=dir(fullfile(datadir,catedir(i).name,'\*.png')); % 獲取類文件夾下 png圖片, disp(['category ', num2str(i-2) , ' have ', num2str(length(sampdir)),'instance.']); new_folder_train = ['./train/',catedir(i).name]; % 創建各類文件夾,按第i類創建 new_folder_test = ['./test/',catedir(i).name]; mkdir(new_folder_train); mkdir(new_folder_test); class_num =class_num + 1; for j = 1:length(sampdir) if j==1 krand = randperm(length(sampdir)); % 隨機選取圖片,防止過擬合 end kk = krand(j); img = imread(fullfile(datadir,catedir(i).name,sampdir(j).name)); % 讀取 name = [catedir(i).name,'\',sampdir(kk).name]; % 輸出每張圖片的名稱 if j < length(sampdir) *trainratio % j是讀取的第j個樣本(子類中),j小於**時,設置為1,1是表示訓練 imwrite(img,[new_folder_train,'/',sampdir(kk).name]); % 注 :‘.png’ fprintf(train_labels,'%s %s\n',name,num2str(class_num-1)); % 從0開始編號,寫label的txt文件 else imwrite(img,[new_folder_test,'/',sampdir(kk).name]); fprintf(test_labels,'%s %s\n',name,num2str(class_num-1)); % 從0開始編號 end disp(['category ', num2str(i-2) , ' have ', num2str(length(sampdir)-2),' sample. ' ... 'sample ', ' ------ ', num2str(j) ]); end end fclose(train_labels); fclose(test_labels);
來看看生成的文件,此處將數據存於caffe-master\data\Chars74k下,因此train和test文件夾是在caffe-master\data\Chars74k下。
如圖所示,train文件夾里有62個子文件夾,分別代表62個類別,每個子文件夾里就是圖片。Test文件夾同理。
如圖所示,這訓練集的標簽文件,分兩個部分。第一部分是路徑,此處要注意, “Sample001\img001-00051.png ” 要與train文件夾里的圖片的文件名一一對應,否則在用convert_imageset.exe進行轉換格式時候會出現 找不到文件的提示。
(PS:我直接就是在matlab中輸出圖片時,多加了’.png’,導致圖片的文件名是 Sample001\img001-00051.png.png 最終導致找不到文件)
第二部分就是標簽了,這里的標簽是從0開始表示第一個類別。特別注意,txt文件中,文件路徑和標簽中有一個空格。
- 第二步
有了train和test以及對應標簽文件,就可以利用 convert_imageset.exe將圖片轉換成LMDB或者LEVELDB的格式,這里采用批處理的方式。首先在caffe-master\data\Chars74k 文件夾下創建txt文件重命名為:convert_chars74k_LMDB.bat
一定要把后綴改成 .bat ,然后將以下代碼復制到文本中,保存。
D:\caffe-master\Build\x64\Release\convert_imageset.exe --resize_width=28 --resize_height=28 ./train/ train_labels.txt train_lmdb -backend=lmdb D:\caffe-master\Build\x64\Release\convert_imageset.exe --resize_width=28 --resize_height=28 ./test/ test_labels.txt test_lmdb -backend=lmdb Pause
這里的每行包含七個部分,第一個部分:D:\caffe-master\Build\x64\Release\convert_imageset.exe 表示 convert_imageset.exe所在路徑(PS,若是用Debug生成的,則在將Release改成Debug即可)
第二、三部分,是對原始圖片進行了resize,第四部分:
./train/ 是訓練圖片文件所在路徑,此處用了相對路徑的形式(不了解相對路徑的同學,請度娘 ./ ../的作用) 第五部分,train_labels.txt是訓練集的標簽
第六部分:train_lmdb 是生成LMDB格式文件的文件名
第七部分:-backend=lmdb 是所要轉成的格式(要轉成 leveldb的則改成 -backend=leveldb)
然后雙擊運行convert_chars74k_LMDB.bat
運行正常的話,在文件夾caffe-master\data\Chars74k下會出現
test_lmdb 和train_lmdb 兩個文件夾。至此,已經將自己的數據集轉換成為LMDB格式的數據了,即caffe可讀的數據格式。
- 第三步
訓練
此處和訓練Mnist和Cifar-10一樣可參考(http://blog.csdn.net/u011995719/article/details/53998331)
訓練需要寫兩個prototxt文件,一個是描述網絡結構的,一個是超參數的設定。
如圖所示,一個是網絡模型描述,一個是超參數設置,特別注意路徑。
寫好這兩個文件之后,就可以利用caffe.exe進行訓練啦。
在文件夾caffe-master\data\Chars74k下,創建txt文件,重命名為caffe_train_Chars74k.bat(注意改后綴),然后復制以下代碼:
..\..\Build\x64\Release\caffe.exe train --solver=./Chars74k_solver.prototxt
Pause
同樣的,注意路徑就好。保存之后,雙擊運行即可。