Caffe 实现 MobileNetv2-SSDLite 目标检测,预训练文件从 tensorflow 来的,要将 tensorflow 模型转换到 caffe.
先废话,我的环境,如果安装了 cuda, cudnn, 而且 caffe,tensorflow 都通过了,请忽略下面的,只是要注意 caffe 的版本:
Ubuntu 16.04
查看 CUDA 版本:(CUDA 8.0.61)
alpha@zero:~/$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
alpha@zero:~/$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 6
#define CUDNN_MINOR 0
#define CUDNN_PATCHLEVEL 21
caffe 版本,并非官方版本,因为官方版本的有很多网络的某些 layer 或者其他方面的不支持:
tensorflow 版本,因为我的 CUDA,cuDNN 版本的原因,我装了一个官方老版本 (tensorflow 1.3.0)。
alpha@zero:~/$ pip list | grep tensorflow
tensorflow-gpu (1.3.0)
tensorflow-tensorboard (0.1.8)
git clone https://github.com/chuanqi305/MobileNetv2-SSDLite
cd MobileNetv2-SSDLite/ssdlite/
wget http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
tar -zvxf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
python dump_tensorflow_weights.py
# 修改 load_caffe_weight.py 中 caffe_root 为自己的路径
python load_caffe_weight.py
# 修改 coco2voc.py 中 caffe_root 为自己的路径
python coco2voc.py
上面所有步骤成功了后,就可以 test 一下模型
cd 到 MobileNetv2-SSDLite/ 目录下,同样的修改脚本中 caffe_root 为自己的路径后,执行下面命令:
python demo_caffe_voc.py
测试结果如下图片,
制作自己的数据集
这两步请参考, https://blog.csdn.net/Chris_zhangrx/article/details/80458515
MobileNet-SSD, MobileNetv2-SSDLite,训练时数据集需要做的准备一样。
修改 label 文件,在 MobileNetv2-SSDLite/ssdlite/voc/ 目录下 **labelmap_voc.prototxt,修改成自己的类别,例如有两类 car, person。注意 要加 background
item {
name: "none_of_the_above"
label: 0
display_name: "background"
}
item {
name: "car"
label: 1
display_name: "car"
}
item {
name: "person"
label: 2
display_name: "person"
}
python gen_model.py -s train -c CLASS_NUM --tfpad --relu6 >train.prototxt
python gen_model.py -s test -c CLASS_NUM --tfpad --relu6 >test.prototxt
python gen_model.py -s deploy -c CLASS_NUM --tfpad --relu6 >deploy.prototxt
然后修改 train.prototxt 中的三处,
第一处,
source: "trainval_lmdb"
改成你自己的 trainval_lmdb 路径,例如
source: "/home/alpha/MobileNetv2-SSDLite/lmdb/trainval_lmdb"
第二处,
label_map_file: "labelmap.prototxt"
改成自己的 labelmap 路径,例如
label_map_file: "/home/alpha/MobileNetv2-SSDLite/ssdlite/voc/labelmap_voc.prototxt"
第三处,如果 GPU 很渣,训练时候超出显存,把 batch_size 改小一点
batch_size: 64
开始训练
修改 MobileNetv2-SSDLite/ssdlite/voc/solver_train.prototxt ,或者复制到你自己的 project 目录下,其中
net: "train.prototxt"
需修改成自己的 train.prototxt 路径,如下,或者复制到当前目录下
net: "/home/alpha/MobileNetv2-SSDLite/ssdlite/train.prototxt"
当然其他的参数都可以根据自己的训练修改,例如最大迭代次数,以及每隔多少次 保存一次模型,等等
修改并运行 MobileNetv2-SSDLite/ssdlite/voc/train.sh,例如
#!/bin/sh
mkdir -p snapshot
/home/alpha/ssd/build/tools/caffe train \
-solver="/home/alpha/MobileNetv2-SSDLite/ssdlite/voc/solver_train.prototxt" \
-weights="/home/alpha/MobileNetv2-SSDLite/ssdlite/deploy_voc.caffemodel" \
-gpu 0
如果顺利的话,god bless you! 就可以开始训练。
output:
......
I1214 15:04:49.776378 7844 net.cpp:761] Ignoring source layer conv_13/project_conv_13/project_0_split
I1214 15:04:49.778203 7844 caffe.cpp:251] Starting Optimization
I1214 15:04:49.778215 7844 solver.cpp:294] Solving MobileNetv2-SSDLite
I1214 15:04:49.778218 7844 solver.cpp:295] Learning Rate Policy: multistep
I1214 15:04:49.784867 7844 blocking_queue.cpp:50] Data layer prefetch queue empty
I1214 15:04:55.167454 7844 solver.cpp:243] Iteration 0, loss = 15.0445
I1214 15:04:55.167486 7844 solver.cpp:259] Train net output #0: mbox_loss = 15.0445 (* 1 = 15.0445 loss)
I1214 15:04:55.167507 7844 sgd_solver.cpp:138] Iteration 0, lr = 1e-05
I1214 15:05:29.629565 7844 solver.cpp:243] Iteration 10, loss = 14.7857
I1214 15:05:29.629652 7844 solver.cpp:259] Train net output #0: mbox_loss = 14.2803 (* 1 = 14.2803 loss)
......
......