1. 程式人生 > >Caffe中檔案引數設定(九-1):訓練和測試自己的圖片-linux版本

Caffe中檔案引數設定(九-1):訓練和測試自己的圖片-linux版本

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如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  

需要帶四個引數:

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'......

好了,知道這些引數後,我們就可以呼叫命令來生成最終的lmdb格式資料了

由於引數比較多,因此我們可以編寫一個sh指令碼來執行命令:

首先,建立sh指令碼檔案:

# sudo vi examples/images/create_lmdb.sh

編輯,輸入下面的程式碼並儲存

    #!/usr/bin/en sh  
    DATA=examples/images  
    rm -rf $DATA/img_train_lmdb  
    build/tools/convert_imageset --shuffle \  
    --resize_height=256 --resize_width=256 \  
    /home/xxx/caffe/examples/images/ $DATA/train.txt  $DATA/img_train_lmdb  

設定引數-shuffle,打亂圖片順序。設定引數-resize_height和-resize_width將所有圖片尺寸都變為256*256.

/home/xxx/caffe/examples/images/ 為圖片儲存的絕對路徑。

最後,執行這個指令碼檔案

    # sudo sh examples/images/create_lmdb.sh  

就會在examples/images/ 目錄下生成一個名為 img_train_lmdb的資料夾,裡面的檔案就是我們需要的db檔案了

上面就將影象資料轉換成db(leveldb/lmdb)檔案了。

===================================================================================================================================

再從自己的原始圖片到lmdb資料,再到訓練和測試模型的整個流程。

一、準備資料

有條件的同學,可以去imagenet的官網http://www.image-net.org/download-images,下載imagenet圖片來訓練。但是我沒有下載,一個原因是註冊賬號的時候,驗證碼始終出不來(聽說是google網站的驗證碼,而我是上不了google的)。第二個原因是資料太大了。。。

我去網上找了一些其它的圖片來代替,共有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/

二、轉換為lmdb格式

首先,在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兩個文字檔案,裡面就是圖片的列表清單。

接著再編寫一個指令碼檔案,呼叫convert_imageset命令來轉換資料格式。

    # sudo vi examples/myfile/create_lmdb.sh  

插入:

    #!/usr/bin/env sh  
    MY=examples/myfile  
      
    echo "Create train lmdb.."  
    rm -rf $MY/img_train_lmdb  
    build/tools/convert_imageset \  
    --shuffle \  
    --resize_height=256 \  
    --resize_width=256 \  
    /home/xxx/caffe/data/re/ \  
    $MY/train.txt \  
    $MY/img_train_lmdb  
      
    echo "Create test lmdb.."  
    rm -rf $MY/img_test_lmdb  
    build/tools/convert_imageset \  
    --shuffle \  
    --resize_width=256 \  
    --resize_height=256 \  
    /home/xxx/caffe/data/re/ \  
    $MY/test.txt \  
    $MY/img_test_lmdb  
      
    echo "All Done.."  

因為圖片大小不一,因此我統一轉換成256*256大小。執行成功後,會在 examples/myfile下面生成兩個資料夾img_train_lmdb和img_test_lmdb,分別用於儲存圖片轉換後的lmdb檔案。

三、計算均值並儲存

圖片減去均值再訓練,會提高訓練速度和精度。因此,一般都會有這個操作。

caffe程式提供了一個計算均值的檔案compute_image_mean.cpp,我們直接使用就可以了

    # sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto  

compute_image_mean帶兩個引數,第一個引數是lmdb訓練資料位置,第二個引數設定均值檔案的名字及儲存路徑。執行成功後,會在 examples/myfile/ 下面生成一個mean.binaryproto的均值檔案。

四、建立模型並編寫配置檔案

模型就用程式自帶的caffenet模型,位置在 models/bvlc_reference_caffenet/資料夾下, 將需要的兩個配置檔案,複製到myfile資料夾內

    # sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/  
    # sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/  

修改其中的solver.prototxt
    # sudo vi examples/myfile/solver.prototxt  
    net: "examples/myfile/train_val.prototxt"  
    test_iter: 2  
    test_interval: 50  
    base_lr: 0.001  
    lr_policy: "step"  
    gamma: 0.1  
    stepsize: 100  
    display: 20  
    max_iter: 500  
    momentum: 0.9  
    weight_decay: 0.005  
    solver_mode: GPU  
100個測試資料,batch_size為50,因此test_iter設定為2,就能全cover了。在訓練過程中,調整學習率,逐步變小。

修改train_val.protxt,只需要修改兩個階段的data層就可以了,其它可以不用管。

    name: "CaffeNet"  
    layer {  
      name: "data"  
      type: "Data"  
      top: "data"  
      top: "label"  
      include {  
        phase: TRAIN  
      }  
      transform_param {  
        mirror: true  
        crop_size: 227  
        mean_file: "examples/myfile/mean.binaryproto"  
      }  
      data_param {  
        source: "examples/myfile/img_train_lmdb"  
        batch_size: 256  
        backend: LMDB  
      }  
    }  
    layer {  
      name: "data"  
      type: "Data"  
      top: "data"  
      top: "label"  
      include {  
        phase: TEST  
      }  
      transform_param {  
        mirror: false  
        crop_size: 227  
        mean_file: "examples/myfile/mean.binaryproto"  
      }  
      data_param {  
        source: "examples/myfile/img_test_lmdb"  
        batch_size: 50  
        backend: LMDB  
      }  
    }  

實際上就是修改兩個data layer的mean_file和source這兩個地方,其它都沒有變化 。

五、訓練和測試

如果前面都沒有問題,資料準備好了,配置檔案也配置好了,這一步就比較簡單了。

    # sudo build/tools/caffe train -solver examples/myfile/solver.prototxt  

執行時間和最後的精確度,會根據機器配置,引數設定的不同而不同。我的是gpu+cudnn執行500次,大約8分鐘,精度為95%。

以上部分轉自:http://www.cnblogs.com/denny402/p/5083300.html

=========================================================================================

下面是我自己寫的一個生成list指令碼

功能就是讀取資料夾下面的資料夾名稱作為類別並且將對應資料夾下面的圖片包括路徑輸出到txt檔案中。

    # /usr/bin/env sh  
    DATA=/home/x/git/data_list/data  
    TxtPath=$DATA/../txt_list  
    rm -rf $TxtPath/train.txt  
    echo "Create train.txt..."    
    for file_a in ${DATA}/*; do    
        temp_file=`basename $file_a`  
        path1=$DATA/${temp_file}  
        echo $path1  
        #cd $path1  
        echo "xxxxxxxxxxxxxxx"  
        find ${path1} -name q*.png | sed "s/$/ ${temp_file}/">>$TxtPath/train.txt  
        echo $temp_file    
    done  
    echo "Done.."  
以上部分轉自:http://blog.csdn.net/langb2014/article/details/50458520


相關推薦

Caffe檔案引數設定-1訓練測試自己圖片-linux版本

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(l

Java for Web學習筆記訊息叢集5利用websocket實現訂閱釋出

叢集中的訂閱和釋出 利用spring framework在本app內的訂閱和釋出十分簡單。當我們系統越來越複雜的時候,我們需要向其他app釋出訊息。本學習將給出一個通過websocket來實現不同app之間訊息的訂購和釋出。 在小例子中,我們在所有節點之間都建立webSoc

【12】Caffe學習系列訓練測試自己圖片

一、準備資料 有條件的同學,可以去imagenet的官網http://www.image-net.org/download-images,下載imagenet圖片來訓練。驗證碼始終出不來需要翻牆(是google網站的驗證碼)。但是我沒有下載,原因是資料太大了。。。 我去網上找了一些其它的圖片

不要慫,就是GAN (生成式對抗網路) 訓練測試 GAN

在 /home/your_name/TensorFlow/DCGAN/ 下新建檔案 train.py,同時新建資料夾 logs 和資料夾 samples,前者用來儲存訓練過程中的日誌和模型,後者用來儲存訓練過程中取樣器的取樣圖片,在 train.py 中輸入如下程式碼:

Caffe傻瓜系列(9)訓練測試自己圖片

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(leveldb/lmdb)檔

javaIO1OutputStreamFileOutputStream原始碼分析及“裝飾者模式”在IO的應用

前言 一,IO體系 從現在起,我們將基於JDK1.8詳細介紹java.io包中的關於輸入輸出有關的類。瞭解過這個包的都知道,裡面的類繼承關係錯綜複雜,光是弄清楚這些類的關係就夠喝一壺的了。說實話,我也沒有什麼好的方法來一下子就能弄清這些類,但是如果你瞭解“裝

跟開濤學SpringMVC4.1Controller接口控制器詳解1

詳解 shu fix gmv 控制器 input abstract pre pdf http://www.importnew.com/19397.html http://blog.csdn.net/u014607184/article/details/5207453

python3網絡爬蟲2.1爬取堆糖美女

pre 線程 span 需要 pic ring clas lin chrome 額,明明記得昨晚存了草稿箱,一覺醒來沒了,那就簡寫點(其實是具體怎麽解釋我也不太懂/xk,純屬個人理解,有錯誤還望指正) 環境:   版本:python3   IDE:pycharm201

JavaEE互聯網輕量級框架整合開發書籍閱讀筆記1MybatisHibernate概念理解

bat 特定 定義 理解 緩存 面向 ont span 等待 一、關鍵字說明: oop:面向對象 aop:面向切面 ioc:控制反轉 orm:對象關系映射 pojo:數據庫表映射的java實體類 二、常識說明:1.hibernate和mybatis都屬於持久層、orm

設計模式的黃金搭檔一對活寶命令模式+觀察者模式

現有場景描述:現在無論是系統自帶的鍵盤還是第三方的鍵盤一般都自帶撤銷和恢復功能,你知道它們是用的什麼模式實現的嗎?它們用的是==命令模式+觀察者模式==,你答對了嗎?簡單科普一下啥是==Command模式==? Command模式:- 模式型別:行為類模式- 定義:將一個操作、一個方法呼叫、一個命令封裝成一個

PE檔案格式學習十四繫結匯入表

1.介紹 繫結匯入表的作用是加快程式的啟動速度,一個PE程式在啟動時會去載入匯入表中的dll檔案,並將匯入表的FirstThunk指向的陣列填入函式的真實地址,這需要耗去時間,繫結匯入表中儲存了匯入函式的真實地址,所以當PE在啟動時系統檢測到有繫結匯入表,就會直接將地址填入FirstThunk裡,這樣就省去

PE檔案格式學習十六延遲載入表

1.介紹 延遲載入表本質上跟繫結匯入表的目的是一樣的,都是為了加快程式載入檔案的速度,只不過方法不一樣。 延遲載入是指在呼叫某個DLL時才去載入,目的是為了避免在程式啟動之初就載入了不必要的DLL而浪費了時間。微軟建議在兩種情況下使用延遲載入: 程式並非在啟動時就會呼叫D

PE檔案格式學習十二TLS表

1.介紹 TLS全稱執行緒區域性儲存器,它用來儲存變數或回撥函式。 TLS裡面的變數和回撥函式都在程式入口點(AddressOfEntry)之前執行,也就是說程式在被除錯時,還沒有在入口點處斷下來之前,TLS中的變數和回撥函式就已經執行完了,所以TLS可以用作反除錯之類的操作。

ORB-SLAM2原始碼解讀2.1Tracking

Tracking是SLAM的靈魂,更像是前端里程計VO,這裡Tracking的主要任務兩方面:(1)完成相機位姿估計(2)跟蹤區域性地圖 思路:TrackLocalMap()在當前幀和區域性地圖之間找到儘可能多的對應關係,優化當前幀的位姿。對每一幀都進行跟蹤 第一次接觸這麼大的工程,發現之前

pyspider 爬蟲教程1HTML CSS 選擇器

開始之前 由於教程是基於 pyspider 的,你可以安裝一個 pyspider(Quickstart,也可以直接使用 pyspider 的 demo 環境: http://demo.pyspider.org/。 有需要Python學習資料的小夥伴嗎?小編整理【一套Pyt

學習MongoDB--2-1MongoDB入門(概念簡介啟動)

開始進入正式學習使用MongoDB的階段了,首先還是詳細介紹一下MongoDB的一些概念吧: 1》 文件:這個是MongoDB中資料的基本單元,非常類似於關係型資料庫的行,但比傳統行能表示的資訊複雜很多。 2》 集合:這個在MongoDB中代表一組文件,類似於關係型資料庫中

【Ray Tracing in One Weekend】ch0~1c++生成的第一張圖片

Chapter 0: Overview 作者講了講自己的教學經驗以及有關光線追蹤的一些事。 作者推薦我們使用c++。 Chapter 1: Output an image 展示瞭如何用程式碼生成第一張圖片。用到了PPM格式。 這裡 有PPM格式的詳

caffe隨記---訓練測試自己圖片

前面也介紹了tools工具,今天來試著自己跑一下影象分類的例項 1、下載資料 我沒有用imagenet的資料,因為太大了不想下,而且反正也只是當作例程跑一下而已,所以我用的是另一位博主分享的網盤上的資料,共有500張圖片,分為大巴車、恐龍、大象、鮮花和馬五個類,每個類1

ASP.NET Core 中文文件 第四章 MVC4.1Controllers, Actions Action Results

Action 和 action result 是開發者使用 ASP.NET MVC 構建應用程式的基礎部分。 什麼是 Controller 在 ASP.NET MVC 中, 控制器( Controller  )用於定義和聚合操作(Action)的一個集合。操作( 或操作方法 )是控制器中處理入站請求的一個方

學習MongoDB--4-1MongoDB查詢(基本查詢條件操作符介紹)

從前面的學習中,我們得知MongoDB中使用find函式來進行查詢。查詢最終返回的是一個集合中文件的子集,子集合包括0個文件到這個集合中所有的文件。 【第一個查詢引數】 find函式第一個引數是一個文件,其中給出了我們要查詢集合中什麼樣文件的描述。如果我們要查詢所有文件,可