Caffe初試(三)使用caffe的cifar10網絡模型訓練自己的圖片數據


 

由於我涉及一個車牌識別系統的項目,計划使用深度學習庫caffe對車牌字符進行識別。剛開始接觸caffe,打算先將示例中的每個網絡模型都拿出來用用,當然這樣暴力的使用是不會有好結果的- -||| ,所以這里只是記錄一下示例的網絡模型使用的步驟,最終測試的准確率就暫且不論了!

一、圖片數據庫

來源

我使用的圖像是在項目的字符分割模塊中分割出來的字符圖像,灰度化並歸一化至32*64,字符圖片樣本示例如下:

 

建立自己的數據文件夾

在./caffe/data/目錄下建立自己的數據文件夾mine,並且在mine文件夾下建立train文件夾和test文件夾(由於只是為了熟悉cifar10網絡模型,為減少訓練時長,所以只選取了A,B,C三個字符樣本進行訓練和測試)。train文件夾用於存放訓練樣本,test文件夾用於存放測試樣本。

然后,將你處理好的訓練樣本圖片放在./caffe/data/mine/train/這個文件夾下面,測試樣本放在./caffe/data/mine/test/這個文件夾下面。

train:

 

test:

 

 編寫train.txt和test.txt文本

(1)--train.txt  :存放訓練圖片的路徑名(相對於./caffe/data/mine/train/)和類別標簽,一行一張圖片,如下所示:

 

 

(2)--test.txt  :存放測試樣本的路徑名(相對於./caffe/data/mine/test/)和類別標簽,一行代表一張圖片,如下圖所示:

 

二、將圖片數據轉換為LEVELDB格式的數據

在原caffe工程中將caffe.cpp從工程中移除,將tools文件夾中的convert_imageset.cpp添加到工程中,編譯后在./caffe/bin/下生成.exe,將其改名為convert_imageset.exe。

然后,在根目錄下(我的是F:\caffe\)寫一個批處理bat文件,命名為converttrain2ldb.bat,旨在將訓練集中的數據格式轉換為leveldb格式:

 

運行后,在data/mine/下生成mtrainldb文件夾,文件夾的內容如下所示:

 

當你生成的.ldb文件的大小為0KB或很小很小,那應該就是你的bat文件出錯了。

同理將測試集轉換為leveldb文件:

 

 

三、計算圖像的均值

在原caffe工程中將caffe.cpp從工程中移除,將tools文件夾中的compute_image_mean.cpp添加到工程中,編譯后在./caffe/bin/下生成.exe,將其改名為compute_image_mean.cpp.exe。

在根目錄下寫一個批處理bat文件,命名為computeMean.bat,旨在計算圖像的均值,生成均值文件:

 

運行后,在data/mine/下生成均值文件。如下所示:

 

四、創建網絡模型,編寫配置文件,編寫訓練腳本,驗證測試集

創建網絡模型

在./data/mine下建立文件夾train-val,將./examples/cifar10/文件夾下的cifar10_quick_train_test.prototxt網絡模型配置文件copy至該文件夾下面,如下所示:

 

並且進行如下的修改:

name: "CIFAR10_quick"
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {        //【第1塊修改的地方】下面是均值文件所在的路徑,改為你自己的均值文件所在的路徑
    mean_file: "data/mine/train_mean.binaryproto"
  }
  data_param {            //【第2塊修改的地方】下面改為訓練樣本生成的數據庫所在的目錄[注意:是訓練樣本數據庫]
    source: "data/mine/mtrainldb"
    batch_size: 50    //【第3塊修改的地方】由於我們的訓練樣本不多,所以我們一次讀入50張圖片就好
    backend: LEVELDB
  }
}
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {    //【第4塊修改的地方】下面是均值文件所在的路徑,改為你自己的均值文件所在的路徑
    mean_file: "data/mine/train_mean.binaryproto"
  }
  data_param {      //【第5塊修改的地方】下面改為測試樣本生成的數據庫所在的目錄[注意:是測試樣本數據庫]
    source: "data/mine/mtestldb"
    batch_size: 50//【第6塊修改的地方】由於我們的測試樣本只有150張,所以我們一次讀入50張圖片就好
    backend: LEVELDB
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }

   中間的省略......
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 3         //【第7塊修改的地方】我們現在是3分類問題,所以將第二個全連接層改為3
    weight_filler {
      type: "gaussian"
      std: 0.1
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

 

編寫超參數配置文件

同樣的,將cifar10_quick_solver.prototxt超參數配置文件copy至./data/mine/train-val下,進行下面的修改:

//【1】改為你自己的網絡模型配置文件的目錄
net: "data/mine/train-val/cifar10_quick_train_test.prototxt"
//【2】預測階段迭代次數,設為3,因為batch_size設為50,這樣就可以覆蓋150張測試集圖片
test_iter: 3
//【3】每迭代50次, 進行一次測試
test_interval: 50
//【4】權值學習率,其實就是在反向傳播階段,權值每次的調整量的程度
base_lr: 0.001
momentum: 0.9
weight_decay: 0.004
//【5】在整個過程中,我們使用固定的學習率,也可嘗試使用可變學習率
lr_policy: "fixed"
//【6】因為想觀察每一次訓練的變化,所以設置迭代一次顯示一次內容
display: 1
//【7】將最大迭代次數設為4000
max_iter: 4000
//【8】每迭代1000次輸出一次結果
snapshot: 1000
//【9】輸出格式
snapshot_format: HDF5
//【10】輸出文件的前綴
snapshot_prefix: "data/mine/cifar10_quick"
//【11】用的是CPU
solver_mode: CPU

 

編寫訓練腳本

在根目錄下新建批處理bat文件,命名為trainMine_useCifar10.bat,內容如下所示:

 

運行后,即調用train-val文件夾下的cifar10_quick_solver.prototxt開始訓練,訓練過程如下圖所示:

...

訓練完成后,在指定目錄下生成了HDF5格式的訓練模型:

 

 

驗證測試集

在根目錄下編寫批處理bat文件,命名為testMine_useCifar10.bat:

 

雙擊運行后,開始對測試集中的數據進行測試,輸出結果如下所示:

可以看到,有些測試batch的准確率為1,有些batch的准確率為0,accuracy部分除了這兩個數字,未出現其它數字,所以我估摸着必有蹊蹺,但還不知道問題出在哪,待日后再弄明白!

 

以上。


免責聲明!

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



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