天天看點

windows環境下,利用caffe架構,采用MoblieNet的圖像識别

環境:

首先,環境搭建.

  1. 預設已裝好cuda8.0+cuDNN6.0.
  2. caffe的安裝參考我上一篇博文.

第二,資料準備.

  1. 準備好trainlmg和testlmg檔案.
  2. 計算均值

第三,微調網絡結構

  • github上https://github.com/shicai/MobileNet-Caffe下載下傳模型和.protutxt.
    windows環境下,利用caffe架構,采用MoblieNet的圖像識别
  • 複制mobilenet_deploy.prototxt,命名為train.prototxt,修改如下
  • 這裡把第一層給換為了兩層,
name: "MOBILENET"
layer {
  name: "data_train"
  type: "ImageData"
  top: "data"
  top: "label"
  include {
    phase: TRAIN # TRAIN,表示訓練時使用
  }
  transform_param {
    scale: 0.00390625 # 1/255,圖像歸一化
    mirror: true # 是否鏡像,視情況而定
    crop_size: 224 # 輸入到網絡的圖像的尺寸
    mean_value: [112.24, 115.46, 117.84] # 訓練集的圖像的三個通道的均值
  }
  image_data_param {
    source: "train_txt.txt" # 你的trainImg.txt,形如  0\0.jpg 0  
                                                    0\1.jpg 0
                                                    0\10.jpg 0
                                                    0\100.jpg 0
                                                    0\1000.jpg 0
                                                    0\1001.jpg 0
    batch_size: 10  # 你的batc size
    new_height: 224 # 如果設定了,就是把原始的輸入圖像resize成new_*的尺寸,前面的crop_size是随機采集的尺寸
    new_width: 224
    shuffle:true # 是否打散資料
    root_folder: "D:\\work\\data-backandcard\\trainImg\\" # 你訓練圖像的位址的前半段,
           
                                                                        # 其實某個圖像的位址就是 root_folder + trainImg.txt,
           
                                                                        # 注意兩個\\,或者一個/
           
}
}
layer {
  name: "data_test"
  type: "ImageData"
  top: "data"
  top: "label"
  include {
    phase: TEST # TEST,表示測試時使用
  }
  transform_param {
    scale: 0.00390625
    mirror: true
    crop_size: 224
    mean_value: [112.24, 115.46, 117.84]
  }
  image_data_param {
    source: "test_txt.txt"
    batch_size: 10 
    new_height: 224
    new_width: 224
    shuffle:true
    root_folder: "D:\\work\\data-backandcard\\testImg\\"
  }
}
           
  • 針對最後一層
layer {
  name: "myfc7" # 原本是"fc7",最好改一下新的,有人說如果不改,可能不會改變模型結構
  type: "Convolution"
  bottom: "pool6"
  top: "myfc7" # 所有的"fc7"均改為新的,例如我的"myfc7"
  param {
    lr_mult: 10 # 把學習率調高,加速收斂
    decay_mult: 1
  }
  param {
    lr_mult: 20 # 把學習率調高,加速收斂
    decay_mult: 0
  }
  convolution_param {
    num_output: 13  # 修改你的輸出類别數
    kernel_size: 1
    weight_filler {
      type: "msra"
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "myfc7"  # 這裡改
  bottom: "label"
  top: "loss"
}
layer {
  name: "top1/acc"
  type: "Accuracy"
  bottom: "myfc7" # 這裡
  bottom: "label"
  top: "top1/acc"
  include {
    phase: TEST
  }
  accuracy_param {
    top_k: 1
  }
}
layer {
  name: "top5/acc"
  type: "Accuracy"
  bottom: "myfc7" # 這裡
  bottom: "label"
  top: "top5/acc"
  include {
    phase: TEST
  }
  accuracy_param {
    top_k: 5
  }
}
           
  • 修改solver.prototxt, 用于定義訓練的參數
net: "train.prototxt" # train.prototxt的路徑,最好寫絕對路徑
test_iter: 170 # 你的 總測試樣本數 / batchsize ,大約是這樣,一個整數
test_interval: 2000 # 你的 總訓練樣本數 /batchsize

base_lr: 0.0001  # 初試學習率,對訓練影響巨大,如果你的loss一直=87.3...,很可能是這個原因
lr_policy: "step" # 梯度下降的方式
gamma: 0.1 # 一般是這個值 
stepsize: 1999 # 每多少的iter下降一次學習率

display: 10 # 每多少iter列印一下loss
max_iter: 10000 # 最大疊代次數,一般是test_interval的3-6倍
momentum: 0.9 # 一般是這個
weight_decay: 0.0005 # 一般是這個
snapshot: 5000 # 每多少次iter儲存一下caffe的model,同時也會列印top1 和 top5 準确率,如果你的硬碟空間充足可以設小一點,反正MobileNet很小,20M不到
snapshot_prefix: "./model/mobilenet" # caffemodel的儲存路徑和儲存名稱,如"model"檔案夾下記得要建立,他的名字是mobilenet_iter_1000.caffemodel
solver_mode: GPU # 使用GPU訓練
           
  • 訓練,cmd下輸入如下,回車
    D:\caffe\bin\caffe.exe train -solver .\solver.prototxt -weights D:\caffe\models\MobileNet\Mobilenet.caffemodel -gpu all
               
    具體的路徑依自己的而定
  • 下一篇将介紹如何将caffe的模型與Opencv的Dnn子產品結合起來使用

繼續閱讀