前言:
本文章記錄了我將自己的數據集處理並訓練的流程,幫助一些剛入門的學習者,也記錄自己的成長,萬事起於忽微,量變引起質變。
正文:
一、流程
1)准備數據集
2)數據轉換為lmdb格式
3)計算均值並保存(非必需)
4)創建模型並編寫配置文件
5)訓練和測試
二、實施
(一)准備數據集
在深度學習中,數據集准備往往是最難的事情,因為數據涉及隱私、商業等各方面,獲取難度很大,不過有很多科研機構公布了供學習使用的數據集,我們可以在網上下載。還有一種獲取的途徑是論文,查閱國內外相關的論文,看他們是如何獲取到數據集的,我們也可以使用他 們所采用的數據集。
我要訓練的模型是人臉識別,訓練的數據集是在網上下載的,經過整理,在我的網盤可以下載:http://pan.baidu.com/s/1jIxCcKI
(二)數據轉換為lmdb格式
生成lmdb格式的文件通過腳本來實現,這就需要我們自己編寫腳本文件,這里遇到了一些坑,首先使用vim創建腳本文件create1.sh
#!/usr/bin/env sh DATA=AR1 MY=newfile echo "Create train.txt..." rm -rf $MY/train.txt for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 do find $DATA/train/$i -name *.pgm|cut -d '/' -f2-4 | sed "s/$/ $i/">>$MY/train.txt done echo "Create test.txt..." rm -rf $MY/test.txt for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 do find $DATA/test/$i -name *.pgm|cut -d '/' -f2-4 | sed "s/$/ $i/">>$MY/test.txt done echo "All done"
這個腳本文件中,用到了rm,find, cut, sed,cat等linux命令。
rm: 刪除文件
find: 尋找文件
cut: 截取路徑
sed: 在每行的最后面加上標注。本例中將找到的*cat.jpg文件加入標注為1,找到的*bike.jpg文件加入標注為2
cat: 將兩個類別合並在一個文件里。
執行這個腳本:
sh data/face/create1.sh
成功的話就會在newfile文件夾里生成train.txt和test.txt文件,比如

f2-4的含義是選取以“/”而分隔開的第2至第4部分
接着再編寫一個腳本文件,調用convert_imageset命令來轉換數據格式。
vim lmdb.sh
#!/usr/bin/env sh MY=data/face/newfile echo "Create train lmdb.." rm -rf $MY/img_train_lmdb build/tools/convert_imageset --shuffle \ --resize_height=256 \ --resize_width=256 \ /home/zyf/ygh/project/caffe/data/face/AR1/ $MY/train.txt $MY/img_train_lmdb echo "Create test lmdb.." rm -rf $MY/img_test_lmdb build/tools/convert_imageset \ --shuffle \ --resize_width=256 \ --resize_height=256 \ /home/zyf/ygh/project/caffe/data/face/AR1/ \ $MY/test.txt \ $MY/img_test_lmdb echo "All Done.."
我統一轉換成256*256大小。
sh lmdb.sh
運行成功后,會在 newfile下面生成兩個文件夾img_train_lmdb和img_test_lmdb,分別用於保存圖片轉換后的lmdb文件。
(三)計算均值並保存(非必需)
圖片減去均值再訓練,會提高訓練速度和精度。因此,一般都會有這個操作。
caffe程序提供了一個計算均值的文件compute_image_mean.cpp,我們直接使用就可以了
build/tools/compute_image_mean data/face/newfile/img_train_lmdb data/face/newfile/mean.binaryproto
compute_image_mean帶兩個參數,第一個參數是lmdb訓練數據位置,第二個參數設定均值文件的名字及保存路徑。運行成功后,會在 newfile/ 下面生成一個mean.binaryproto的均值文件。
(四)創建模型並編寫配置文件
模型里面的數據
data_param { source: "data/face/newfile/img_train_lmdb" backend:LMDB batch_size: 128 } transform_param { mean_file: "data/face/newfile/mean.binaryproto" mirror: true }
這其中的source和mean_file的路徑要改成前面你自己生成的文件目錄,其余的不需要修改,我這里采用的是網上訓練精度不錯的一個網絡,具體下載可以轉到百度雲: 鏈接
其中的train_val.prototxt是訓練網絡
然后修改其中的solver.prototxt
net: "data/face/train_val.prototxt" test_iter: 10 test_interval: 100 base_lr: 0.001 lr_policy: "step" gamma: 0.95 stepsize: 100 momentum: 0.9 weight_decay: 0.0005 display: 100 max_iter: 5000 snapshot: 5000 snapshot_prefix: "data/face" solver_mode: GPU device_id:0 #debug_info: true
其中test_iter: 10,test_interval: 100,一千張圖片每次測試100張,10次就都可以覆蓋了。。在訓練過程中,調整學習率,逐步變小。
(五)訓練和測試
如果前面都沒有問題,數據准備好了,配置文件也配置好了,這一步就比較簡單了。
build/tools/caffe train -solver data/face/solver.prototxt
直接訓練即可,可以實時在命令行下查看其精度與loss。
待續。。。
by still
