【caffe】caffe中使用crop_size剪裁訓練圖片


下面以一個簡單的例子進行介紹。

  1. layer {
  2. name: “data”
  3. type: “Data”
  4. top: “data”
  5. top: “label”
  6. include {
  7. phase: TRAIN
  8. }
  9. transform_param {
  10. mirror: true
  11. crop_size: 600
  12. mean_file: “examples/images/imagenet_mean.binaryproto”
  13. }
  14. data_param {
  15. source: “examples/images/train_lmdb”
  16. batch_size: 256
  17. backend: LMDB
  18. }
  19. }
  20. layer {
  21. name: “data”
  22. type: “Data”
  23. top: “data”
  24. top: “label”
  25. include {
  26. phase: TEST
  27. }
  28. transform_param {
  29. mirror: false
  30. crop_size: 600
  31. mean_file: “examples/images/imagenet_mean.binaryproto”
  32. }
  33. data_param {
  34. source: “examples/images/val_lmdb”
  35. batch_size: 50
  36. backend: LMDB
  37. }
  38. }



從上面的 數據層的定義,看得出用了鏡像和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):


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



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


下面是我在網上找到的自己進行圖像裁剪的程序:

可對照給出的網址進行詳細閱讀:http://blog.csdn.net/u011762313/article/details/48343799


我們可以手動將圖片裁剪並導入pycaffe中,這樣能夠提高識別率(pycaffe利用caffemodel進行分類中:進行分類這一步改爲如下):


  1. #記錄分類概率分佈
  2. pridects = np.zeros((1, CLASS_NUM))
  3. # 圖片維度(高、寬)
  4. img_shape = np.array(img.shape)
  5. # 裁剪的大小(高、寬)
  6. crop_dims = (32, 96)
  7. crop_dims = np.array(crop_dims)
  8. # 這裏使用的圖片高度全部固定爲32,長度可變,最小爲96
  9. # 裁剪起點爲0,終點爲w_range
  10. w_range = img_shape[1] - crop_dims[1]
  11. # 從左往右剪一遍,再從右往左剪一遍,步長爲96/4=24
  12. for k in range(0, w_range + 1, crop_dims[1] / 4) + range(w_range, 1, -crop_dims[1] / 4):
  13. # 裁剪圖片
  14. crop_img = img[:, k:k + crop_dims[1], :]
  15. # 數據輸入、預處理
  16. net.blobs[‘data’].data[…] = transformer.preprocess(‘data’, crop_img)
  17. # 前向迭代,即分類
  18. out = net.forward()
  19. # 每一次分類,概率分佈疊加
  20. pridects += out[‘prob’]
  21. # 取最大的概率分佈爲最終結果
  22. pridect = pridects.argmax()





  • caffe中提供了過採樣的方法(oversample),詳見/caffe/python/caffe/io.py,裁剪的是圖片中央、4個角以及鏡像共10張圖片。


注:如果圖片過大,需要適當縮小batch_size的值,否則使用GPU時可能超出其緩存大小而報錯

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