用caffe訓練自己的資料集(一)
本文主要參考了:https://blog.csdn.net/heimu24/article/details/53581362
https://blog.csdn.net/gaohuazhao/article/details/69568267
準備工具linux系統,caffe框架,淘寶上獲取的圖片。
整個過程分為,三部分,一、是對資料進行處理,轉化為caffe能應用的資料型別。二、搭建網路,進行訓練。三、利用訓練好的資料進行分類。
一、下載資料集
首先從網上下載需要的資料集。下載地址,百度網盤:https://pan.baidu.com/s/1o77w1wI
下載完後解壓,裡面會有四個檔案,如圖所示
只保留train和val即可,因為我們後面用這兩個檔案來自己生成train.txt和val.txt.
在caffe的examples資料夾下新建一個myfile4資料夾,在這個檔案加下建立一個data資料夾,把剛才下載的train和val儲存到data資料夾中。
二、生成.txt檔案
首先在myfile4下面建立一個.sh檔案,我的檔名為:create_filelist.sh。內容如下:
#!/usr/bin/env sh DATA=examples/myfile4/data #資料來源的路徑 MY=examples/myfile4/data #生成的txt檔案儲存位置 echo "Create train.txt..." rm -rf $MY/train.txt #先把檔案中原有的同名檔案刪除 find $DATA/train -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/train.txt find $DATA/train -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/train.txt find $DATA/train -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/train.txt find $DATA/train -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/train.txt find $DATA/train -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/train.txt find $DATA/train -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/train.txt find $DATA/train -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/train.txt find $DATA/train -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/train.txt find $DATA/train -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/train.txt find $DATA/train -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/train.txt echo "Create test.txt..." rm -rf $MY/val.txt find $DATA/val -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/val.txt find $DATA/val -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/val.txt find $DATA/val -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/val.txt find $DATA/val -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/val.txt find $DATA/val -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/val.txt find $DATA/val -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/val.txt find $DATA/val -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/val.txt find $DATA/val -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/val.txt find $DATA/val -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/val.txt find $DATA/val -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/val.txt echo "All done"
對一些語句進行解釋:
find $DATA/train -name 15001*.jpg 是在檔案加下找到所有前幾位名為15001的圖片
cut -d '/' -f4-5 是以'/'為分界符,找到第四至五段的內容擷取下來
sed "s/$/ 0/" 在擷取的檔名後面加一個空格和一個標籤0
MY/train.txt 儲存到train.txt中
在caffe目錄下執行該檔案,命令為:./examples/myfile4/create_filelist.sh。執行完後,會在myfile4/data資料夾下生成train.txt和val.txt檔案。得到的train.txt的內容如下:
三、轉化為db檔案
接著把.txt檔案轉換成caffe能識別的db檔案。還是在myfile4下建立該檔案,檔名為create_lmdb.sh。內容如下:
#!/usr/bin/env sh MY=examples/myfile4 TRAIN_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/ VAL_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/ echo "Create train lmdb.." rm -rf $MY/img_train_lmdb build/tools/convert_imageset \ --resize_height=32 \ --resize_width=32 \ --shuffle \ $TRAIN_DATA_ROOT \ $MY/data/train.txt \ $MY/img_train_lmdb echo "Create test lmdb.." rm -rf $MY/img_val_lmdb build/tools/convert_imageset \ --resize_height=32 \ --resize_width=32 \ --shuffle \ $VAL_DATA_ROOT \ $MY/data/val.txt \ $MY/img_val_lmdb echo "All Done.."對程式碼進行一些解釋:
MY=examples/myfile4設定lmdb檔案要儲存的位置。
TRAIN_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/ 該圖片儲存的絕對路徑。是從linux的根目錄開始的
VAL_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/ 資料列表的儲存位置
build/tools/convert_imageset 這句是利用caffe自帶的圖片處理工具對圖片進行處理。
convert_imageset命令列使用格式 convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME FLAGS是處理的引數,像圖片的大小,隨機抽取還是怎麼樣。ROOTFOLDER是圖片存放的絕對目錄。LISTFILE是檔案列表清單。DB_NAME是生成的檔案存放的位置。想要了解更詳細的自行百度,我也不太清楚。
執行這個檔案./examples/myfile4/create_lmdb.sh執行完後會在myfile4資料夾下生成img_val_lmdb和img_train_lmdb資料夾裡面就是我們想要的caffe能識別的db檔案。
四、計算均值
計算均值的原因是保證所有特徵都在0附近,在大多數情況下,我們並不關心所輸入影象的整體明亮程度,比如物件識別任務中,影象的整體明亮程度,並不會影響影象中存在的是什麼物體,我們對影象的平均亮度感興趣,所以可以減去這個值來進行均值規整化。
建立的檔名為,create_meanfile.sh 程式碼如下:
EXAMPLE=examples/myfile4 DATA=examples/myfile4/ TOOLS=build/tools $TOOLS/compute_image_mean $EXAMPLE/img_train_lmdb $DATA/mean1.binaryproto echo "Done."
也是利用caffe自帶的均值處理工具進行處理。
$EXAMPLE/img_train_lmdb要處理的檔案的位置,$DATA/mean1.binaryproto檔案的儲存位置
像上面一樣執行該檔案,就會得到均值檔案。
至此,影象的前期處理已經結束。接下來就是要進行正式的訓練