1. 程式人生 > >用caffe訓練自己的資料集(一)

用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檔案的儲存位置

像上面一樣執行該檔案,就會得到均值檔案。

至此,影象的前期處理已經結束。接下來就是要進行正式的訓練