DL:Pvanet笔记

pvanet训练及BUG记录
Train Pvanet Note (Pvanet Project Version : Nov.21 2016 from GitHub)
来自小北完美踩过的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。

训练方法

Train Command

1
python tools/train_net.py --gpu 0 --solver models/pvanet/example_train_384/solver.prototxt --weights models/pvanet/example_train_384/original.model --cfg models/pvanet/cfgs/train.yml --imdb voc_2007_trainval

–gpu 序号,单GPU为0
–solver 训练参数文件
–weight 预训练模型,使用Imagenet的预训练模型,若没有,开始训练时很难收敛,loss=nan
–cfg 配置
–imdb 训练数据集名字(需要按照voc或者Coco的命名规则,亦可修改程序来打破规则!详见/lib/datasets/factory.py)

由于程序结构问题,训练的数据集需要覆盖至VOC数据集的文件夹下
~/data/VOCdevkit2007/VOC2007/Annotations和ImageSets和JPEGImages三个文件夹
ImageSets/Main文件中用到的只有trainval.txt这个文件,里面保存所有图片的名字(无后缀),需用程序生成

训练模型会保存在pva根目录生成的output文件夹中

修改配置文件

————train.prototxt————
1>搜索num_classes,修改成自己数据集的类别数(含background,文件中有两处)
2>搜索name: “cls_score”,修改下面的num_output为实际的类别数
3>搜索name: “bbox_pred”,修改下面的num_output为实际的类别数×4

————test.prototxt————
1>搜索name: “cls_score”,修改下面的num_output为实际的类别数
2>搜索name: “bbox_pred”,修改下面的num_output为实际的类别数×4
若修改错误,会出现参数不匹配错误

修改程序

cd ~/lib/datesets/
1>pascal_voc.py :
1)修改pascal_voc类属性
self._classes,self._image_ext
2)搜索

1
2
x1 = float(bbox.find('xmin').text) -1
y1 = float(bbox.find('ymin').text) -1

修改为

1
2
x1 = float(bbox.find('xmin').text)
y1 = float(bbox.find('ymin').text)

2>imdb.py :
1)搜索这一行代码

1
boxes[:, 2] = widths[i] - oldx1 - 1

在下面添加代码

1
2
3
for b in range(len(boxes)):
if boxes[b][2]<boxes[b][0]:
boxes[b][0]=0

注:这一步与上面的第二步都是为了防止标注数据的box中含有坐标为0的情况,造成训练loss=nan
faster-rcnn 系列在处理生成pascal voc数据集时,为了使像素以0为起点,每个bbox的左上和右下坐标都减一

3>修改完后需要重新编译
输入

1
2
3
4
python
import py_compile
py_compile.compile('imdb.py')
py_compile.compile('pascal_voc.py')

首先在/data/cache文件夹中删除.pkl训练缓存文件

典型Error及解决方法

各种No module named XX错误,直接apt-get install 或者pip install
1>No module named caffe,则进入faster-rcnn目录下,执行make pycaffe,有时需要使用sudo
另外需要添加pva目录下的Python到PYTHONPATH环境变量中
2>No module named cv2, 在编译opencv的文件夹下,搜索cv2.so,拷贝到/usr/lib/python2.7/dist-packages
若没有cv2.so,则需要确保安装numpy后再重新编译opencv,从别的地方拷贝的cv2.so都是无效的

3>在该版本的pvanet下,需要使用numpy-1.11版本(神坑)

4>No module named google.protobuf.internal
使用pip安装protobuf,注意:使用apt-get安装protobuf是不会向python目录下添加库的

Error 1

ValueError: numpy.dtype has the wrong size ,try compiling
说明当前numpy版本过低
查看numpy版本号 >>python -c “import numpy;print numpy.version.version”

若之前是使用apt-get install python-numpy安装的numpy,则默认安装的是1.8版本
注意此时就不要apt-get remove python-numpy,可能会删除一些依赖项

若使用pip install numpy会自动安装最新版本的numpy-1.12
此时编译后会出现第二的错误

Error 2

bbox_targets[ind,start:end]=bbox_target_data[ind,1:]
TypeError: slice indices must be integers or None or have anindex method
说明当前numpy版本过高
numpy-1.12 does not support floats as indexes !!!

1
2
3
4
Download numpy 1.11.2
cd numpy-1.11.2
python setup.py build
sudo python setup.py install

Error 3

KeyError: ‘max_overlaps’

在/data/cache文件夹中删除.pkl文件

Others

1>cudnn错误,暂时支持4.0版本的cudnn
2>so一类错误,添加LD_LIBRARY_PATH,另外在pva/lib/中重新make,有时需要手动删除.so文件再make