將圖片轉換成caffe的lmdb形式並進行實驗
最近做實驗需要用到caffe,做一下總結以備以後操作參考
實驗是使用自己從網上爬的資料集來替換caffe中demo中的資料集
首先介紹一下資料的格式
Caffe生成的資料分為2種格式:Lmdb和Leveldb
它們都是鍵/值對(Key/Value Pair)嵌入式資料庫管理系統程式設計庫。
雖然lmdb的記憶體消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允許多種訓練模型同時讀取同一組資料集。
因此lmdb取代了leveldb成為Caffe預設的資料集生成格式。
不論使用何種框架進行CNNs訓練,共有3種資料集:
Training Set:用於訓練網路
Validation Set:用於訓練時測試網路準確率
Test Set:用於測試網路訓練完成後的最終正確率
- 資料集的準備
1在實驗目錄下分別建立train,test,val三個檔案分別存放訓練集,測試集,驗證集(三個檔案家中存放的是圖片資料
jpg,png等格式) 使用指令碼江上述的圖片資料集生成(key,value)的文字資料
2 在此我使用的資料集是從網上搜索出的貓狗的影象各300張資料量有點小,命名格式是cat_xxx.jpg或者是dog_xxx.jpg(這些也是可以利用指令碼來完成的)
#!/usr/bin/env sh
DATA=images/train
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name cat*.jpg | cut -d '/' -f4 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name dog*.jpg | cut -d '/' -f4 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
通過上述指令碼可以獲取cat_xxx.jpg 1這樣的鍵值對資料存放在train.txt檔案中。
- 3 利用train.txt的鍵值對資料形成lmdb形式的資料。
在caffe中,作者為提供了這樣一個檔案:convert_imageset.cpp,存放在根目錄下的tools資料夾下。編譯之後,生成對應的可執行檔案放在 buile/tools/ 下面,這個檔案的作用就是用於將圖片檔案轉換成caffe框架中能直接使用的db檔案。
使用格式
“`
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
需要帶四個引數:
FLAGS: 圖片引數組,後面詳細介紹
-gray: 是否以灰度圖的方式開啟圖片。程式呼叫opencv庫中的imread()函式來開啟圖片,預設為false
-shuffle: 是否隨機打亂圖片順序。預設為false
-backend:需要轉換成的db檔案格式,可選為leveldb或lmdb,預設為lmdb
-resize_width/resize_height: 改變圖片的大小。在執行中,要求所有圖片的尺寸一致,因此需要改變圖片大小。 程式呼叫opencv庫的resize()函式來對圖片放大縮小,預設為0,不改變
-check_size: 檢查所有的資料是否有相同的尺寸。預設為false,不檢查
-encoded: 是否將原圖片編碼放入最終的資料中,預設為false
-encode_type: 與前一個引數對應,將圖片編碼為哪一個格式:‘png','jpg'......
ROOTFOLDER/: 圖片存放的絕對路徑,從linux系統根目錄開始
LISTFILE: 圖片檔案列表清單,一般為一個txt檔案,一行一張圖片
DB_NAME: 最終生成的db檔案存放目錄
#!/usr/bin/env sh
DATA=images/train
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
/home/caffe/caffe/images/train $DATA/train.txt $DATA/img_train_lmdb
設定引數-shuffle,打亂圖片順序。設定引數-resize_height和-resize_width將所有圖片尺寸都變為256*256.
/home/caffe/caffe/images/train/ 為圖片儲存的絕對路徑。
可以根據實際情況將路徑修改。
執行指令碼,img_train_lmdb資料生成。
4計算均值
圖片減去均值再訓練,會提高訓練速度和精度。因此,一般都會有這個操作。
caffe程式提供了一個計算均值的檔案compute_image_mean.cpp,直接使用就可以了
# sudo build/tools/compute_image_mean images/train/img_train_lmdb images/train/mean.binaryproto
- 5 使用的demo中的網路引數檔案和訓練引數檔案配置
網路引數
網路模型檔案在 models/bvlc_reference_caffenet/train_val.prototxt 檔案中;
這裡直接使用caffe提供的這個網路結構,以後再根據自己的想法做更改;(可以根據models下面的不同網路模型進行選擇)
注意:大家需要開啟這個檔案,更改裡面的路徑
訓練引數
訓練引數檔案在:models/bvlc_reference_caffenet/solver.prototxt中
對solver.prototxt 修改後的引數如下
net: "/home/caffe/caffe/data/myfile/train_val.prototxt"
test_iter: 4 //測試的時候,輸入4個batch
test_interval: 1000 //每迭代1000次,測試一次
base_lr: 0.01 // 初始的學習率是0.01
lr_policy: "step"
gamma: 0.1
stepsize: 3000 //每迭代3000次,調整一次學習率
display: 20 //每20次迭代,顯示一次
max_iter: 12000 //最大迭代12000次
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000
snapshot_prefix: "/home/caffe/caffe/data/myfile/"
solver_mode: GPU
這個檔案需要根據網路引數與實際的資料來修改。
- 6訓練及輸出結果
# sudo /home/caffe/caffe/build/tools/caffe train -solver data/myfile/solver.prototxt```
當然,上面的命令,需要根據自己的路徑相應的改下
輸出的結果並不是很好也許是資料集的問題,畢竟是大資料集下的實驗,通過此過程算是一個小小的入門吧。