1. 程式人生 > >caffe學習筆記(四)--製作自己的資料集train.txt和val.txt,生成LMDB檔案

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檔案指令

  1. 其中DATA是train資料的目錄,DATASAVE是train.txt儲存的路徑
  2. -name ground*.jpg的意思呢是指的是以ground開頭的圖片名字
  3. cut -d ‘/’ -f3-5是擷取圖片的路徑,調整-f後面的數字可設定幾級路徑
  4. sed “s/$/ 1/”是在其後面加上 1(空格和1)
  5. 然後儲存到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,然後對其中需要修改的地方進行修改:

  1. 其中EXAMPLE=myfile/build_lmdb改為自己檔案的路徑
  2. DATA=myfile/datatest,改為自己的路徑
  3. TRAIN_DATA_ROOT和TRAIN_DATA_ROOT修改到路徑datatest,這裡因為train.txt檔案的路徑是從datatest開始的
  4. TOOLS保持不變
  5. 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檔案

這裡寫圖片描述

然後就可以利用這些檔案進行訓練啦,我看有的模型裡面還有新增均值檔案,下次在學習均值檔案的生成~

參考: