caffe讀取多標簽的lmdb數據


問題描述:

lmdb文件支持數據+標簽的形式,但是卻只能寫入一個標簽,引入多標簽的解決方法有很多,這兒詳細說一下我的辦法:制作多個data數據,分別加入一個標簽。我的方法只適用於標簽數量較少的情況,標簽數量比較多的話建議修改源碼支持。下面介紹詳細步驟。以下均以兩個標簽作為介紹。

生成兩個含單標簽的list:

img1 0
img2 0
img3 1
img4 1
img1 10
img2 11
img3 10
img4 11

按照同一順序做shuffle處理,caffe訓練數據shuffle處理是有必要的,雖然caffe的lmdb轉換工具能夠直接做shuffle,但是不能保證兩個list的順序一致。文本按行亂序的命令可以參考http://www.cnblogs.com/zhaojunjie/p/6735713.html。處理后的文件如下:

img1 0
img3 1 img4 1 img2 0
img1 10
img3 10 img4 11 img2 11

接下來就可以對他們生成兩個lmdb了,值得注意的是如果圖像數據較大,生成lmdb時可以將第二個list的圖像resize到1*1,如下(前面已經shuffle,這里不再加入shuffle參數):

pathtocaffe/build/tools/convert_imageset --resize_height=256 --resize_width=256 "" list1 lmdb_data_1
pathtocaffe/build/tools/convert_imageset --resize_height=1 --resize_width=1 "" list2 lmdb_data_2

生成好了lmdb,如何用呢?prototxt文件參考如下:

name: "CaffeNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label1"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    mean_file: "train_VGG_cub_mean.binaryproto"
    crop_size: 224
  }
  data_param {
    source: "lmdb_data_1"
    backend: LMDB
    batch_size: 16
  }
}
layer {
  name: "data2"
  type: "Data"
  top: "data_noused"
  top: "label2"
  include {
    phase: TRAIN
  }
  data_param {
    source: "lmdb_data_2"
    backend: LMDB
    batch_size: 16
  }
}
#將data_nousedresize到1位,防止caffe輸出過多內容
layer {
  name: "reductionx"
  bottom: "data_noused"
  top: "data_noused"
  type: "Reduction"
  reduction_param {
    axis: 0
  }

}

 

【完】

 


免責聲明!

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



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