win10下使用caffe訓練自己的數據,車牌二分類

caffe編譯參考:http://blog.csdn.net/cym1990/article/details/72630584

1.數據格式轉換

Caffe採用leveldb或者lmdb的數據格式

第一步就是數據的格式轉換了。

編譯如下圖所示工程,可以生成文件convert_imageset.exe


本次訓練是使用的車牌數據,只分2類,有車牌,無車牌。

在caffe根目錄下新建data文件夾,在data文件夾下新建plate文件夾,plate文件夾有如下文件:


train和test文件夾存放原始數據,trainldb和testldb文件夾存放格式轉換後的leveldb數據,mean存放均值文件,實驗數據是車牌和非車牌二分類數據。部分數據大概如下:

有車牌:



無車牌:



在train圖像數據文件夾中建立train.txt文件

在命令行中,cd到train圖像數據文件夾中執行下面批處理命令:

dir /b/s/p/w *.jpg > train.txt

可以實現將文件夾中的所有文件的文件名和路徑提取到train.txt中

生成如圖所示:



然後使用替換功能調整爲以下格式,圖像後面的爲標籤,每個類別使用同一個標籤表示(多個類別必須從0開始),可以通過查找替換功能,將jpg替換爲jpg 0,這樣可以快速加標籤。



利用convert_imageset.exe生成對應的leveldb格式數據,注意參數和路徑,參數部分可以查看conver_imageset.cpp文件中的定義。

我們可以寫一個convert_imageset.bat文件,來執行數據格式轉換,文件內容如下:


SET GLOG_logtostderr=1
D:\WorkSpace\caffe\caffe\Build\x64\Release\convert_imageset.exe --backend=leveldb --resize_width=64 --resize_height=64  D:\WorkSpace\caffe\caffe\data\plate\ D:\WorkSpace\caffe\caffe\data\plate\train\train.txt D:\WorkSpace\caffe\caffe\data\plate\train_ldb 
pause

D:\WorkSpace\caffe\caffe\Build\x64\Release\convert_imageset.exe --backend=leveldb --resize_width=64 --resize_height=64 D:\WorkSpace\caffe\caffe\data\plate\ D:\WorkSpace\caffe\caffe\data\plate\test\test.txt D:\WorkSpace\caffe\caffe\data\plate\test_ldb 
pause

可以看到我們在轉換數據的時候,將所有數據大小統一調整爲64*64,這樣方便數據處理。

上面的命令先轉換train數據格式,然後轉換測試數據格式。

在命令行中的這個需要注意:

D:\WorkSpace\caffe\caffe\data\plate\   D:\WorkSpace\caffe\caffe\data\plate\train\train.txt
前面的文件夾加上後面文件train.txt中每行的內容,需要保證是一個合法的絕對路徑,這個路徑就是需要尋找到每個文件的路徑。同理測試數據一樣。


生成成功後得到以下信息:




以上命令運行成功後,在train_ldb文件夾下生成對應的文件:



其他格式的數據轉換,比如binary等可以參考examples下cifar10和mnist下的樣例。這部分早晚要自己寫的,可以多熟悉一下。


2.數據預處理

這一步主要計算數據的均值,得到均值文件,一般來說,訓練集減去均值文件後再進行訓練效果會好一點,當然也可以對數據做其他處理。
編譯如下圖所示工程,可以得到文件compute_image_mean.exe


同樣,在plate文件夾下建立批處理文件,compute_image_mean.bat,文件內容如下:
SET GLOG_logtostderr=1
D:\WorkSpace\caffe\caffe\Build\x64\Release\compute_image_mean.exe --backend=leveldb D:\WorkSpace\caffe\caffe\data\plate\train_ldb D:\WorkSpace\caffe\caffe\data\plate\mean\train_mean.binaryproto
pause


D:\WorkSpace\caffe\caffe\Build\x64\Release\compute_image_mean.exe --backend=leveldb D:\WorkSpace\caffe\caffe\data\plate\test_ldb D:\WorkSpace\caffe\caffe\data\plate\mean\test_mean.binaryproto
pause
以上命令會在mean文件夾中生成文件train_mean.binaryproto和test_mean.binaryproto
以上2個文件分別爲訓練和測試時候的均值文件,如下圖所示。


3.定義網絡結構並訓練

將路徑caffe\models\bvlc_alexnet文件夾下面的train_val.prototxt和solver.prototxt文件都複製到caffe\data\plate路徑下
修改train_val.prototxt文件如下:
name: "AlexNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    #crop_size: 227
    mean_file: "D://WorkSpace//caffe//caffe//data//plate//mean//train_mean.binaryproto"
  }
  data_param {
    source: "D://WorkSpace//caffe//caffe//data//plate//train_ldb"
    batch_size: 256
    backend: LEVELDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    #crop_size: 227
    mean_file: "D://WorkSpace//caffe//caffe//data//plate//mean//test_mean.binaryproto"
  }
  data_param {
    source: "D://WorkSpace//caffe//caffe//data//plate//test_ldb"
    batch_size: 50
    backend: LEVELDB
  }
}

修改solver.prototxt文件如下:
主要是修改一下路徑。
net: "D://WorkSpace//caffe//caffe//data//plate//train_val.prototxt"
test_iter: 100
test_interval: 100
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 200
snapshot_prefix: "D://WorkSpace//caffe//caffe//data//plate//"
solver_mode: GPU


最後,寫一個批處理文件start_train.bat來調用caffe.exe進行訓練和測試,bat文件內容如下:

D:\WorkSpace\caffe\caffe\Build\x64\Release\caffe.exe train --solver=D:\WorkSpace\caffe\caffe\data\plate\solver.prototxt 
pause

,如果沒有錯誤,就可以看到訓練結果了,如下圖所示




可能會遇到的文件:

(1)caffe訓練數據時出現了Check failed: data_怎麼辦?

(2)路徑文件,找不到數據,這個一般仔細檢查文件都可以找出來,還有就是如果路徑中包含有/t,也會導致路徑不可用,可以在路徑中使用//來代替\

(3)http://blog.csdn.net/zr459927180/article/details/51001536,參考此文章,遇到的文件有下面幾個,可以參考:

        1.  caffe訓練時遇到loss一直居高不下時:http://blog.sina.com.cn/s/blog_141f234870102w941.html

另外,均值一般都是訓練集的均值,測試集正常是不知道,無法求出來的。


  2. 利用Caffe訓練一個基於AlexNet的三分類分類器,將train_val.prototxt的全連接輸出層的輸出類別數目改爲3,訓練一直不收斂,loss很高;當把輸出改成4或1000(>3)的時候,網絡可以收斂。也就是caffenet結構的輸出層的類別數一定要大於我訓練集的類別數纔可以收斂!後來查了半天才發現原因,讓我淚奔。。。
原來我把圖像類別的label設置成1,2,3,改成0,1,2後,最後全連接層的轉出改成3就OK了。
可能出現的問題
1.網絡結構方面的配置信息:prototxt要根據自己的實際情況和數據集進行修改,每個參數的實際意義要自己弄清楚,文中給出的prototx只是個示例,具體還是要自己修改,每個參數的意義網上有,可以查一下,用法可以參見caffe.prototxt(添加自己的layer時會需要在這裏加參數的),還有loss不降可能是學習率設置的問題,我最近在vgg-face的模型上finetune其他人臉數據時,學習率用0.01,怎麼訓練都沒啥結果,換成0.0001,loss就開始降了,accuracy也挺滿意。
還有就是當時寫bat文件時用的都是些絕對路徑,自己調整好就可以了,這個看下報錯信息,問題不大

參考以下文章:

1.在caffe上跑自己的數據

2.如何快糙好猛地在Windows下編譯CAFFE並使用其matlab和python接口

3.http://blog.csdn.net/zr459927180/article/details/51001536

4.caffe windows訓練測試自己的圖片http://www.jianshu.com/p/607f1e51e3ab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章