近期需要做移动端深度学习项目,首先调查了一下适合移动端的深度学习网络,常用的主要有:SqueezeNet、MobileNet、ShuffleNet、Xception。
几种网络原理及性能对比详见:
https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/79019191
综合评估SqueezeNet体量小运算速度较快,本文选择SqueezeNet作为分类网络
- git clone https://github.com/DeepScale/SqueezeNet到caffe/examples下(笔者发现本Git地址网络结构与标准网络不同可能会影响测试集准确率,后面文章会说明此处)
- 标记分类样本,将训练、测试照片分别放在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图片做训练提高精度