1. 程式人生 > >caffe中DATA層crop_size解釋

caffe中DATA層crop_size解釋

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 600
    mean_file: "examples/images/imagenet_mean.binaryproto"
  }
  data_param {
    source: "examples/images/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: 600 mean_file: "examples/images/imagenet_mean.binaryproto" } data_param { source: "examples/images/val_lmdb" batch_size: 50 backend: LMDB } }

從上面的 資料層的定義,看得出用了映象和crop_size,還定義了 mean_file。
利用crop_size這種方式可以剪裁中心關注點和邊角特徵,mirror可以產生映象,彌補小資料集的不足。
這裡要重點講一下crop_size在訓練層與測試層的區別:
首先我們需要了解mean_file和crop_size沒什麼大關係。mean_file是根據訓練集圖片製作出來的,crop_size是對訓練集影象進行裁剪,兩個都是對原始的訓練集影象進行處理。如果原始訓練影象的尺寸大小為800*800,crop_size的圖片為600*600,則mean_file與crop_size的圖片均為800*800的影象集。
在caffe中,如果定義了crop_size,那麼在train時會對大於crop_size的圖片進行隨機裁剪,而在test時只是擷取中間部分(詳見/caffe/src/caffe/data_transformer.cpp):

//We only do random crop when we do training.
    if (phase_ == TRAIN) {
      h_off = Rand(datum_height - crop_size + 1);
      w_off = Rand(datum_width - crop_size + 1);
    } else {
      h_off = (datum_height - crop_size) / 2;
      w_off = (datum_width - crop_size) / 2;
    }
  }

從上述的程式碼可以看出,如果我們輸入的圖片尺寸大於crop_size,那麼圖片會被裁剪。當 phase 模式為 TRAIN 時,裁剪是隨機進行裁剪,而當為TEST 模式時,其裁剪方式則只是裁剪影象的中間區域。