在caffe-ssd环境搭建好的情况下
1.下载MobileNet-SSD
cd /home/**/caffe/examples/
git clone https://github.com/chuanqi305/MobileNet-SSD
2.准备数据集,我直接下载的VOC数据集,也可以仿制VOC,使用自己的数据集
a.直接用VOC数据集
cd /home/
mkdir data
cd data
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
解压后可以看到一个VOCdevkit的文件夹
cd /home/**/caffe
执行:
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
再进入到home下的data文件夹
cd VOCdevkit
cd VOC0712
可以看到一个lmdb文件夹
cd lmdb
可以看到两个文件夹,分别是VOC0712_test_lmdb VOC0712_trainval_lmdb
将这两个文件夹直接拷贝到 MobileNet-SSD目录下
并将名称改为trainval_lmdb 和 test_lmdb
#######
制作labelmap.prototxt
制作格式仿造caffe/data/VOC0712中的labelmap_voc.prototxt 即可
疑问:调用labelmap的文件
######
在MobileNet-SSD的根目录下执行
./gen_model.sh num(num 为要训练的类别数)
然后可以生成一个example文件夹,里面有我们需要的训练文件和测试文件:MobileNetSSD_train.prototxt、MobileNetSSD_test.prototxt和MobileNetSSD_deploy.prototxt。
对上面三个文件进行修改:
MobileNetSSD_train.prototxt、MobileNetSSD_test.prototxt中,将data_param里的source字段改成实际的lmdb路径,比如我就直接放在MobileNet-SSD的根目录下所有不需要做什么改动,batch_size可以改变一下,以防训练时内存不够,可以改为8或4,视电脑的实际配置情况
检查所有prototxt文件里的num_classes是否为正确的分类数
接下来就是模型训练了
在MobileNet-SSD根目录下运行 ./train.sh
train.sh里的内容解析:(根据自己的路径实际情况做微调)
第2行是train.prototxt的路径,第7行是snapshot保存中间模型的路径,第8行是slover文件的路径,第9行是预训练权重,第10行是用到的gpu编号,这些都可以按需修改。笔者将最后一行的gpu从0修改为0,1,可利用双GPU训练
solver_train.prototxt文件内容:
rain_net:"example/MobileNetSSD_train.prototxt" #训练用的网络文件
test_net:"example/MobileNetSSD_test.prototxt" #测试用的网络文件
test_iter: 673 #测试时的迭代次数
test_interval: 1000 #每训练1000次迭代一次
base_lr: 0.0005 #基准学习率
display: 5 #每5次迭代屏幕显示一次信息
max_iter: 20000 #最大迭代次数
lr_policy: "multistep" #学习率调整策略
gamma: 0.5
weight_decay: 0.00005 #权重衰减
snapshot: 1000 #每1000次迭代抓取一次快照
snapshot_prefix:"snapshot_power/mobilenet" #快照保存的前缀
solver_mode: GPU #这里一定要GPU
debug_info: false
snapshot_after_train: true
test_initialization: false #不做测试初始化
average_loss: 10 #每10次迭代平均下loss
stepvalue: 10000
stepvalue: 20000
iter_size: 1
type: "RMSProp" #一种优化方法,挖坑,以后填
eval_type: "detection" #这里一定要写检测,默认为classification
ap_version: "11point" #计算AP的方法
训练结束后:
训练的模型还需要做一些生成才能得到
在MobileNet-SSD根目录下执行./test.sh 可以看到detection_eval值和loss值 (不成功,还需要做些修改)
图片测试:
修改 merge_bn.py
示例:
caffe_root = '/home/yfs/wss/caffe/'
train_proto = caffe_root+'examples/MobileNet-SSD/example/MobileNetSSD_train.prototxt'
train_model =caffe_root+ 'examples/MobileNet-SSD/snapshot/mobilenet_iter_120000.caffemodel' #should be your snapshot caffemodel
deploy_proto =caffe_root+ 'examples/MobileNet-SSD/example/MobileNetSSD_deploy.prototxt'
save_model = caffe_root+'examples/MobileNet-SSD/snapshot/MobileNetSSD_deploy_20180713_iter120000.caffemodel'
以上就是我的路径,要修改的主要也就是路径和调用名称
修改demo.py
示例:
caffe_root = '/home/yfs/wss/caffe/examples/MobileNet-SSD/'
net_file= '/home/yfs/wss/caffe/examples/MobileNet-SSD/example/MobileNetSSD_deploy.prototxt'
caffe_model=caffe_root+'snapshot/MobileNetSSD_deploy_20180713_iter120000.caffemodel'
执行python demo.py 可以正常对images里的图片进行分类和检测
要对视频和摄像头操作则还是要修改demo.py