caffe中DATA層crop_size解釋
阿新 • • 發佈:2019-01-27
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 模式時,其裁剪方式則只是裁剪影象的中間區域。