YOLO v1算法原文的作者是在darknet框架下实现的, 原文作者的实现 ,这里主要讲的是caffe版本的YOLO实现,主要采用yeahkun写的:点击打开链接 其实只是步骤相对来说有点繁琐,但是要跑通并不困难:
大致步骤包括:
1、编译caffe-yolo
2、下载VOC2007数据集
3、生成list文件
4、生成LMDB文件
5、训练
6、测试
下面是每一步的具体操作:
先从github上把 caffe-yolo 的代码下下来,链接在这里
要重新编译caffe,有同学会觉得,自己明明已经配好了caffe,为什么meic每次跑其他网络或算法时都要重新编译呢?
原因:这些新网络或算法的作者自己新定义了一些内容,比如新的layer,所以需要重新将这些源文件编译一下,否则就不能使用这个新的算法。
下载下来的文件名叫 caffe-yolo-master
首先把 caffe-yolo-master 目录下的 Makefile.config.example 复制一份并改名为 Makefile.config
(这一步跟之前配置普通版本的caffe是一模一样的,相信配过caffe的都很熟悉)
在命令行输入:
cd caffe-yolo-master
cp Makefile.config.example Makefile.config
然后修改 Makefile.config 文件,把里面的这两行:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
替换成下面这两行:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
然后在终端输入:
make clean
make all
make pycaffe
3步分开输入,不要同时输入,就会完成caffe的编译,如果有错误,可以参考我之前的博客进行解决,关于caffe编译出现的各种坑。
当前是在caffe-yolo-master 目录下,先cd进入到/data/yolo目录下:
cd ./data/yolo
然后从github上下载VOC2007的数据集:
终端输入:
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
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
下载好的数据集如下:
在 /data/yolo 目录下有一个 get_list.py 的文件,通过它可以生成包含所有图片的标签的list
本案例只用到VOC2007,所以对 get_list.py 的 for name in ["VOC2007", "VOC2012"]:
删除 "VOC2012"
只留下 "VOC2007"
如下图:
原来:
变成:
然后到代码的最后面,因此这里不需要生成2012的test的list,所以如图所示,把这一段都注释掉:
保存退出
执行:
python get_list.py
就会在/data/yolo/目录下生成两个list:
trainval.txt是训练和验证集
test_2007是测试集
同样是在 /data/yolo 目录下有一个 convert.sh 的文件,通过它可以生成包含数据的lmdb文件格式。
这里有很多路径需要修改。
没修改之前的文件如下:
ROOT_DIR改成你的VOC图片的根目录,比如我的图片路径是 /home/lincanran/caffe-yolo-master/data/yolo,那么这个地方就是:
ROOT_DIR=/home/lincanran/caffe-yolo-master/data/yolo/
LMDB_DIR是生成的lmdb想要存放的地方,lmdb这个文件夹需要我们提前先创建好,不然运行会报错。
下面分2步进行:
(1)生成训练验证集的lmdb
生成训练验证集时,就不用改
直接运行:(要在/data/yolo 目录下)
sh convert.sh
会生成:
(2)生成测试集的lmdb
将原来的训练验证集部分注释掉,取消注释下面测试集的部分
也就是原来的:
# 2007 + 2012 trainval
LIST_FILE=$CAFFE_ROOT/data/yolo/trainval.txt
LMDB_DIR=./lmdb/trainval_lmdb
SHUFFLE=true
# 2007 test
# LIST_FILE=$CAFFE_ROOT/data/yolo/test_2007.txt
# LMDB_DIR=./lmdb/test2007_lmdb
# SHUFFLE=false
现在改成:
# 2007 + 2012 trainval
#LIST_FILE=$CAFFE_ROOT/data/yolo/trainval.txt
#LMDB_DIR=./lmdb/trainval_lmdb
#SHUFFLE=true
# 2007 test
LIST_FILE=$CAFFE_ROOT/data/yolo/test_2007.txt
LMDB_DIR=./lmdb/test2007_lmdb
SHUFFLE=false
改完之后,同样直接运行:
sh convert.sh
会生成:
首先我们用别人预训练好的GoogLeNet模型,从链接:点击打开链接 处下载,点击readme.md里面的那个caffemodel_url的链接进行下载,名字是bvlc_googlenet.caffemodel 。
caffe-yolo 的prototxt文件都放在了/examples/yolo目录下
先进入到该目录:
cd home/yourpath/caffe-yolo-master/examples/yolo
主要是要修改下面3个文件:
修改其中的solver的路径、网络结构的路径,lmdb数据存放的路径等等
(1)gnet_train.prototxt
这里路径改成刚刚第4步生成的2个lmdb的路径
batch_size根据你自己的实际情况去修改
(2)gnet_solver.prototxt
这里基本不用怎么修改
max_iter是要迭代的最大次数
snapshot_prefix是训练好的caffemodel保存的地址,你需要先创建好文件夹
solver_mode是指定GPU或者CPU训练
(3)train.sh
1是填写你的solver.prototxt文件,即上面(2)gnet_solver.prototxt
2是初始化参数权重,因为我们用预训练好的模型,所以这里填 ./bvlc_googlenet.caffemodel
3是已经编译好的caffe-yolo-master目录下的caffe可执行文件的地址(注意:不要用你自己之前安装的caffe,要用刚刚第一步编译好的caffe-yolo版本)
4是指定训练使用的GPU,这里我用了2,3两块
保存退出
全部修改完成后,
在终端运行:
sh train.sh
训练开始,如下图所示:
测试和平时的caffe差不多,直接sh test.sh就行,但需要先修改好 test.sh 和 gnet_test.prototxt 这两个文件里的路径。
(1)gnet_test.prototxt
这里路径改成刚刚第4步生成的测试集的lmdb的路径
batch_size根据需要去修改
(2)test.sh
PROTO是上面的(1)gnet_test.prototxt
MODEL是第5步训练得到的caffemodel模型(注意,这里是用VOC训练集训练得到的caffemodel,不要用下载的bvlc_googlenet.caffemodel,下载的这个只是预训练用的而已)
ITER是测试迭代的次数,和(1)gnet_test.prototxt中的batch_size相乘,就是总测试集图片的数量
GPU_ID是指定测试时所用的GPU
下面记得要换成 test_detection,而不是训练时候的train了
其他都差不多
全部修改完成后,
在终端运行:
sh test.sh
测试开始!!
整个基于VOC2007数据集的yolo v1的caffe实现就基本完成了!