近期需要做移動端深度學習項目,首先調查了一下適合移動端的深度學習網絡,常用的主要有:SqueezeNet、MobileNet、ShuffleNet、Xception。
幾種網絡原理及性能對比詳見:
https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/79019191
綜合評估SqueezeNet體量小運算速度較快,本文選擇SqueezeNet作爲分類網絡
- git clone https://github.com/DeepScale/SqueezeNet到caffe/examples下
- 標記分類樣本,將訓練、測試照片分別放在SqueezeNet下子目錄train和val下,
創建train.txt和test.txt,格式如下:
照片名 分類label - 生成訓練和測試數據集,編輯shell腳本createTrainLmdb.sh:
#!/bin/bash
~/caffe/build/tools/convert_imageset –resize_height=227 –resize_width=227 –shuffle ./train/ ./train.txt ./lmdb/train_lmdb45
createValLmdb.sh:
#!/bin/bash
~/caffe/build/tools/convert_imageset –resize_height=227 –resize_width=227 –shuffle ./val/ ./val.txt ./lmdb/val_lmdb45
- 準備訓練,使用SqueezeNet_v1.1目錄網絡訓練,train_val.prototxt爲訓練模型文件,deploy.prototxt爲測試模型文件,solver.prototxt爲訓練參數配置文件。
修改train_val.prototxt,指定自己的訓練集路徑和batch_size(根據自己的GPU能力設置)
data_param {
source: "自己的絕對路徑/lmdb/train_lmdb45"
batch_size: 16
backend: LMDB
}
data_param {
source: "自己的絕對路徑/lmdb/val_lmdb45"
batch_size: 16 #not *iter_size
backend: LMDB
}
修改train_val.prototxt最後一層卷積網絡名稱conv10爲conv11(所有的conv10都需要改成conv11,因爲我們採用imagenet的模型初始化當前模型,爲了讓模型初始化與imagenet模型相同的層),將conv10 output_num 1000改成2,top 5改成2。將deploy.prototxt中相同的參數做同樣的修改。
調整solver.prototxt中的參數如學習率、迭代次數、Snapshot等其中學習率初步可以試下0.001
- 編輯shell腳本train.sh
#!/bin/bash
~/caffe/build/tools/caffe train -solver SqueezeNet/SqueezeNet_v1.1/solver.prototxt -weights SqueezeNet/SqueezeNet_v1.1/squeezenet_v1.1.caffemodel -gpu 0
執行./train.sh開始訓練 - 優化方法:用SSD提取目標保存目標ROI圖片做訓練提高精度