1 #!/usr/bin/env sh 2 DATA=/home/wp/CAFFE/caffe-master/myself/00b 3 MY=/home/wp/CAFFE/caffe-master/myself/00b 4 5 echo "Creating train.txt..." 6 rm -rf $MY/train.txt 7 find $DATA/train/banana -name *.jpg| cut -d/ -f9-10 | sed "s/$/ 0/">>$MY/train.txt 8 find $DATA/train/cata -name *.jpg| cut -d/ -f9-10 | sed "s/$/ 1/">>$MY/train.txt 9 find $DATA/train/flower -name *.jpg| cut -d/ -f9-10 | sed "s/$/ 2/">>$MY/train.txt 10 11 echo "Creating val.txt..." 12 rm -rf $MY/val.txt 13 find $DATA/val/banana -name *.jpg| cut -d '/' -f9-10 | sed "s/$/ 0/">>$MY/val.txt 14 find $DATA/val/cata -name *.jpg| cut -d '/' -f9-10 | sed "s/$/ 1/">>$MY/val.txt 15 find $DATA/val/flower -name *.jpg| cut -d '/' -f9-10 | sed "s/$/ 2/">>$MY/val.txt 16 17 echo "Done." 18 19 # cd CAFFE/caffe-master 20 # sh ./myself/00b/create_txt.sh
#!/usr/bin/env sh DATA=data/re/ MY=data/re echo "Create train.txt..." rm -rf $MY/train.txt find $DATA/train -name 3*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/train.txt find $DATA/train -name 4*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/train.txt echo "Create test.txt..." rm -rf $MY/val.txt find $DATA/test -name 3*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/val.txt find $DATA/test -name 4*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/val.txt echo "All done"
結果會在:home/wp/CAFFE/caffe-master/myself/00b目錄下生成train.txt,val.txt
參考一:
在深度學習的實際應用中,我們經常用到的原始數據是圖片文件,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的數據類型是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片文件轉換成caffe中能夠運行的db(leveldb/lmdb)文件?前面文章有學習過着個數據由來和使用。
在caffe中,作者為我們提供了這樣一個文件:convert_imageset.cpp,存放在根目錄下的tools文件夾下。編譯之后,生成對應的可執行文件放在 buile/tools/ 下面,這個文件的作用就是用於將圖片文件轉換成caffe框架中能直接使用的db文件。
該文件的使用格式:
- convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
需要帶四個參數:
FLAGS: 圖片參數組,后面詳細介紹
ROOTFOLDER/: 圖片存放的絕對路徑,從linux系統根目錄開始
LISTFILE: 圖片文件列表清單,一般為一個txt文件,一行一張圖片
DB_NAME: 最終生成的db文件存放目錄
如果圖片已經下載到本地電腦上了,那么我們首先需要創建一個圖片列表清單,保存為txt
本文以caffe程序中自帶的圖片為例,進行講解,圖片目錄是 example/images/, 兩張圖片,一張為cat.jpg, 另一張為fish_bike.jpg,表示兩個類別。
我們創建一個sh腳本文件,調用linux命令來生成圖片清單:
- # sudo vi examples/images/create_filelist.sh
編輯這個文件,輸入下面的代碼並保存
- # /usr/bin/env sh
- DATA=examples/images
- echo "Create train.txt..."
- rm -rf $DATA/train.txt
- find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
- find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
- cat $DATA/tmp.txt>>$DATA/train.txt
- rm -rf $DATA/tmp.txt
- echo "Done.."
這個腳本文件中,用到了rm,find, cut, sed,cat等linux命令。
rm: 刪除文件
find: 尋找文件
cut: 截取路徑
sed: 在每行的最后面加上標注。本例中將找到的*cat.jpg文件加入標注為1,找到的*bike.jpg文件加入標注為2
cat: 將兩個類別合並在一個文件里。
最終生成如下的一個train.txt文件:
cat.jpg 1
fish-bike.jpg 2
當然,圖片很少的時候,手動編寫這個列表清單文件就行了。但圖片很多的情況,就需要用腳本文件來自動生成了。在以后的實際應用中,還需要生成相應的val.txt和test.txt文件,方法是一樣的。
生成的這個train.txt文件,就可以作為第三個參數,直接使用了。
接下來,我們來了解一下FLAGS這個參數組,有些什么內容:
-gray: 是否以灰度圖的方式打開圖片。程序調用opencv庫中的imread()函數來打開圖片,默認為false
-shuffle: 是否隨機打亂圖片順序。默認為false
-backend:需要轉換成的db文件格式,可選為leveldb或lmdb,默認為lmdb
-resize_width/resize_height: 改變圖片的大小。在運行中,要求所有圖片的尺寸一致,因此需要改變圖片大小。 程序調用opencv庫的resize()函數來對圖片放大縮小,默認為0,不改變
-check_size: 檢查所有的數據是否有相同的尺寸。默認為false,不檢查
-encoded: 是否將原圖片編碼放入最終的數據中,默認為false
-encode_type: 與前一個參數對應,將圖片編碼為哪一個格式:‘png','jpg'......
稍微解釋一下:
find . -name * cat.jpg用於查找文件,得到./cat.jpg格式的數據。之后用cut -d 和-f來得到后面的cat.jpg的字符串。-d后面加上切分標志,得到一個(.)和一個(cat.jpg),-f2 表示取cat.jpg。sed主要是用於處理文件的一行用的,“s/$/ 1”表示把每行文件的后面替換成為空格+1的模式。"s/a/b/"g用於把a換成b。cat A>>B用於把A文件的內容添加到B的后面。最終得到的文件如下:
cat.jpg 1
fish-bike.jpg 1
參考二:
我去網上找了一些其它的圖片來代替,共有500張圖片,分為大巴車、恐龍、大象、鮮花和馬五個類,每個類100張。需要的同學,可到我的網盤下載:http://pan.baidu.com/s/1nuqlTnN
編號分別以3,4,5,6,7開頭,各為一類。我從其中每類選出20張作為測試,其余80張作為訓練。因此最終訓練圖片400張,測試圖片100張,共5類。我將圖片放在caffe根目錄下的data文件夾下面。即訓練圖片目錄:data/re/train/ ,測試圖片目錄: data/re/test/
首先,在examples下面創建一個myfile的文件夾,來用存放配置文件和腳本文件。然后編寫一個腳本create_filelist.sh,用來生成train.txt和test.txt清單文件
# sudo mkdir examples/myfile # sudo vi examples/myfile/create_filelist.sh
編輯此文件,寫入如下代碼,並保存
#!/usr/bin/env sh DATA=data/re/ MY=examples/myfile echo "Create train.txt..." rm -rf $MY/train.txt for i in 3 4 5 6 7 do find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/train.txt done echo "Create test.txt..." rm -rf $MY/test.txt for i in 3 4 5 6 7 do find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/test.txt done echo "All done"
然后,運行此腳本
# sudo sh examples/myfile/create_filelist.sh
成功的話,就會在examples/myfile/ 文件夾下生成train.txt和test.txt兩個文本文件,里面就是圖片的列表清單。