6.caffe:create_txt.sh(數據預處理成txt文本文件)


 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文件。

該文件的使用格式:

[cpp]
  1. 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命令來生成圖片清單:

[cpp]
  1. # sudo vi examples/images/create_filelist.sh  

編輯這個文件,輸入下面的代碼並保存

  1. # /usr/bin/env sh  
  2. DATA=examples/images  
  3. echo "Create train.txt..."  
  4. rm -rf $DATA/train.txt  
  5. find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt  
  6. find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt  
  7. cat $DATA/tmp.txt>>$DATA/train.txt  
  8. rm -rf $DATA/tmp.txt  
  9. 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兩個文本文件,里面就是圖片的列表清單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM