Faster RCNN 训练过程中遇到的问题及解决方法
摘要
本文对Faster RCNN训练过程中遇到的问题及解决方法进行总结。训练过程采用的是 faster-rcnn.pytorch pytorch-1.0 版本。
配置
训练之前首先查看环境配置:
- anaconda : 使用 anaconda 3.0
- Python:faster-rcnn.pytorch 要求使用 python 2.7 or 3.6,实际过程中使用更高版本如 python 3.9 也是可以的
- Pytorch:faster-rcnn.pytorch 要求使用 pytorch 1.0 (for Pytorch 0.4.0 go to master branch),实际过程中使用更高版本如 pytorch 1.10 也可以
- CUDA 8.0 or higher,实际过程中使用 cuda-10.2
数据集准备
训练过程中只用到了 PASCAL_VOC 07 数据集,按照 faster-rcnn.pytorch 中提到的 GitHub 上faster rcnn 另一个复现版本中的方法准备数据集:
- 下载训练、验证、测试数据集以及VOCdevkit
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
- 解压
tar xvf VOCtrainval_06-Nov-2007.tar tar xvf VOCtest_06-Nov-2007.tar tar xvf VOCdevkit_08-Jun-2007.tar
- 创建软连接
cd $FRCN_ROOT/data ln -s $VOCdevkit VOCdevkit2007`
实际训练过程中创建软连接会出现提示找不到 /Faster-RCNN-Root/data/VOCdevkit2007/VOC2007/… 的错误,怀疑是软连接出现的问题,直接将解压得到的 VOCdevkit 改名为 VOCdevkit2007 解决了问题
预训练模型
将预训练模型 VGG16和 ResNet101 放置在 data/pretrained_model/ 文件夹下.
预训练模型下载:
VGG16: Dropbox, VT Server
ResNet101: Dropbox, VT Server
编译
- 使用 pip 安装所需的工具包
pip install -r requirements.txt
- 编译
编译过程出错可能是由于 cuda 环境变量配置造成的,需要将正确的环境变量添加到 ~/.bashrc 文件中:cd lib python setup.py build develop
- 查看 cuda 路径,一般是在 /user/local/ 路径下
- 添加环境变量:
export PATH=/usr/local/cuda-10.2/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
训练
以预训练模型 vgg16 为例,
CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \
--dataset pascal_voc --net vgg16 \
--bs $BATCH_SIZE --nw $WORKER_NUMBER \
--lr $LEARNING_RATE --lr_decay_step $DECAY_STEP \
--cuda
- $GPU_ID: 指定使用哪个 gpu,在 gpu 空闲的情况下是可用的,如机器有两张卡,在均没有被占用的情况下 $GPU_ID=0,1
- $BATCH_SIZE: 批大小,也就是在一次模型迭代/训练过程中所使用的样本数目,一般设置为 2 的整数幂,根据显存大小而定,实际中使用的是两张 GTX 2080 Ti 的显卡,大小均为12G,设置 bs=16 可以跑,但是负荷比较大,可能会造成显卡温度过高,可以设置 bs=8
- $WORKER_NUMBER:加载数据(batch)的线程数目,根据 gpu 的能力而定,实际训练中设置 nw=4
- 当加载batch的时间 < 数据训练的时间GPU每次训练完都可以直接从CPU中取到next batch的数据无需额外的等待,因此也不需要多余的worker,即使增加worker也不会影响训练速度
- 当加载batch的时间 > 数据训练的时间GPU每次训练完都需要等待CPU完成数据的载入若增加worker,即使worker_1还未就绪,GPU也可以取worker_2的数据来训练
- $LEARNING_RATE:学习率初始化为 0.01
- $DECAY_STEP:decay step,学习率衰减速度,设置为 8
batch size | num workers | learning rate | decay step |
---|---|---|---|
8 | 4 | 0.01 | 8 |
训练过程中出现的一些问题
site-packages 版本问题
由于第三方库有些方法已经过时了,因此代码中的一些语句可能导致错误。