caffe學習筆記(四)--製作自己的資料集train.txt和val.txt,生成LMDB檔案
在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,png,tif等格式的,而且有可能圖片的大小還不一致。
我今天嘗試製作一個自己的訓練資料集,主要步驟為:
1.用MATLAB截圖得到訓練集的圖片
2.生成標籤檔案列表,即生成 train.txt val.txt 檔案
3.將 txt 檔案列表中的影象與train影象庫、val影象庫的影象相連線,生成lmdb格式檔案
實驗是對一副315×299畫素的jpg灰度圖片所進行的,我首先用MATLAB截圖程式碼對其進行了三個類別的截圖,然後對這三個類別進行15×15的滑動視窗分割,得到了每個類別400張15×15的圖片樣本,其中200張用作train 100張用做test。
而在caffe中經常使用的資料型別是lmdb或leveldb,如何從原始圖片檔案轉換成caffe中能夠執行的db(leveldb/lmdb)檔案?
在caffe中,作者為我們提供了這樣一個檔案:convert_imageset.cpp,存放在根目錄下的tools資料夾下。編譯之後,生成對應的可執行檔案放在 buile/tools/ 下面,這個檔案的作用就是用於將圖片檔案轉換成caffe框架中能直接使用的db檔案。
1 資料準備
首先在caffe根目錄下建立一個資料夾myfile,用於存放資料檔案和後面的caffe模型相關檔案。
然後在myfile資料夾下建立build_lmdb和datatest兩個資料夾,其中build_lmdb資料夾用於存放生成的lmdb檔案,datatest資料夾存放圖片資料。
在datatest下主要有2個資料夾和2個.sh檔案和2個.txt檔案,其中train資料夾中存放待訓練的圖片,val資料夾中存放待測試的圖片,creatlist.sh是分別用來生成train和val的.sh檔案,train.txt和val.txt是生成的標籤檔案。
建立好資料夾後,我們把MATLAB分割好的圖片放到train和val資料夾裡面
我在這裡對3個類別分別又建立了3個資料夾
這是其中的一個類別,其他的和val資料夾同此, 把待訓練的圖片放到這裡。
2 生成train.txt val.txt
下面是生成train.txt標籤檔案的.sh檔案指令
- 其中DATA是train資料的目錄,DATASAVE是train.txt儲存的路徑
- -name ground*.jpg的意思呢是指的是以ground開頭的圖片名字
- cut -d ‘/’ -f3-5是擷取圖片的路徑,調整-f後面的數字可設定幾級路徑
- sed “s/$/ 1/”是在其後面加上 1(空格和1)
- 然後儲存到train.txt中
# /usr/bin/env sh
DATA=myfile/datatest/train/
DATASAVE=myfile/datatest/
echo "Create train.txt..."
find $DATA -name ground*.jpg | cut -d '/' -f3-5 | sed "s/$/ 1/">>$DATASAVE/train.txt
find $DATA -name sea*.jpg | cut -d '/' -f3-5 | sed "s/$/ 2/">>$DATASAVE/tmp.txt
find $DATA -name matou*.jpg | cut -d '/' -f3-5 | sed "s/$/ 3/">>$DATASAVE/tmp1.txt
cat $DATASAVE/tmp.txt>>$DATASAVE/train.txt
cat $DATASAVE/tmp1.txt>>$DATASAVE/train.txt
rm -rf $DATASAVE/tmp.txt
rm -rf $DATASAVE/tmp1.txt
echo "Done.."
以此就可以生成train.txt檔案了,見下圖
生成val.txt檔案同上
至此我們就已經完成了製作自己的資料集以及生成train.txt和val.txt
3 生成LMDB檔案
在caffe root/examples/imagenet中有個create_imagenet.sh檔案,我們將其複製到我們的build_lmdb資料夾下重新命名為create_mynet.sh,然後對其中需要修改的地方進行修改:
- 其中EXAMPLE=myfile/build_lmdb改為自己檔案的路徑
- DATA=myfile/datatest,改為自己的路徑
- TRAIN_DATA_ROOT和TRAIN_DATA_ROOT修改到路徑datatest,這裡因為train.txt檔案的路徑是從datatest開始的
- TOOLS保持不變
- resize是調整其大小為256*256以適應net的輸入,這裡還不太懂,先記下來
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
EXAMPLE=myfile/build_lmdb
DATA=myfile/datatest
TOOLS=build/tools
TRAIN_DATA_ROOT=/home/dragon/caffe/myfile/datatest/
VAL_DATA_ROOT=/home/dragon/caffe/myfile/datatest/
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=false
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
exit 1
fi
if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi
echo "Creating train lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/train_lmdb
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/val_lmdb
echo "Done."
然後在終端裡面執行
cd caffe
./myfile/build_lmdb/create_mynet.sh
即可得到lmdb檔案
然後就可以利用這些檔案進行訓練啦,我看有的模型裡面還有新增均值檔案,下次在學習均值檔案的生成~
參考: