在Ubuntu 20.04上从零搭建Faster R-CNN PyTorch环境(避坑CUDA 11.1 + PyTorch 1.9)
当深度学习遇上目标检测,Faster R-CNN无疑是这个领域的重要里程碑。而PyTorch作为当下最受欢迎的深度学习框架之一,其灵活性和易用性让研究者趋之若鹜。本文将带你从零开始在Ubuntu 20.04系统上搭建Faster R-CNN的PyTorch实现环境,特别针对CUDA 11.1和PyTorch 1.9+版本进行优化配置,避开那些让无数开发者头疼的版本兼容性问题。
1. 环境准备与基础配置
1.1 系统要求与初始检查
在开始之前,确保你的系统满足以下基本要求:
- 操作系统:Ubuntu 20.04 LTS(推荐使用纯净安装)
- GPU:NVIDIA显卡(至少4GB显存,推荐8GB以上)
- 驱动:NVIDIA驱动版本≥450.80.02
- 存储空间:至少50GB可用空间(用于数据集和模型)
首先更新系统并安装基础工具:
sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential cmake git wget unzip验证NVIDIA驱动是否正确安装:
nvidia-smi你应该看到类似如下的输出,其中包含你的GPU型号和驱动版本信息:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 GeForce RTX 208... On | 00000000:01:00.0 On | N/A | | 30% 45C P8 18W / 250W | 687MiB / 11019MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+1.2 CUDA 11.1与cuDNN安装
CUDA 11.1是一个相对较新的版本,与PyTorch 1.9有良好的兼容性。以下是安装步骤:
- 下载CUDA 11.1安装包:
wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run- 运行安装程序:
sudo sh cuda_11.1.0_455.23.05_linux.run注意:安装时不要选择安装驱动(如果已经安装了更新的驱动),只选择CUDA Toolkit。
- 安装完成后,将CUDA路径添加到环境变量:
echo 'export PATH=/usr/local/cuda-11.1/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc- 验证CUDA安装:
nvcc --version接下来安装cuDNN,这是NVIDIA提供的深度神经网络加速库:
- 从NVIDIA官网下载cuDNN for CUDA 11.1(需要注册账号)
- 解压并安装:
tar -xzvf cudnn-11.1-linux-x64-v8.0.5.39.tgz sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.1/include sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.1/lib64 sudo chmod a+r /usr/local/cuda-11.1/include/cudnn*.h /usr/local/cuda-11.1/lib64/libcudnn*2. Python环境与PyTorch安装
2.1 创建隔离的Python环境
为了避免与系统Python环境冲突,我们使用conda创建一个独立环境:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh # 按照提示完成安装后 conda create -n fasterrcnn python=3.8 -y conda activate fasterrcnn2.2 安装PyTorch 1.9及相关依赖
PyTorch 1.9对CUDA 11.1有官方支持,使用以下命令安装:
conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=11.1 -c pytorch -c conda-forge验证PyTorch是否正确识别了CUDA:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))你应该看到类似如下的输出:
1.9.0 True NVIDIA GeForce RTX 2080 Ti2.3 安装其他必要依赖
Faster R-CNN需要一些额外的Python包:
pip install numpy scipy matplotlib opencv-python pillow scikit-image pyyaml tqdm特别要注意的是scipy的版本,1.3.0以上版本移除了imread函数,我们需要使用imageio替代:
pip install imageio3. Faster R-CNN源码获取与编译
3.1 获取源代码
推荐使用PyTorch 1.0+兼容的分支:
git clone -b pytorch-1.0 --single-branch https://github.com/jwyang/faster-rcnn.pytorch.git cd faster-rcnn.pytorch3.2 编译CUDA扩展
Faster R-CNN需要编译一些CUDA扩展:
cd lib python setup.py build develop这个步骤可能会遇到几个常见问题:
错误:invalid command 'develop'
- 解决方案:确保你已经安装了最新版本的setuptools
pip install --upgrade setuptoolsImportError: cannot import name '_mask'
- 解决方案:这通常是因为编译不完整,尝试完全删除build目录后重新编译
rm -rf build python setup.py build developscipy.misc.imread缺失
- 解决方案:修改代码中使用imageio.imread替代
# 在需要的地方替换 from imageio import imread
3.3 准备数据集
我们将使用PASCAL VOC 2007数据集作为示例:
- 创建数据目录结构:
mkdir -p data/VOCdevkit2007 cd data/VOCdevkit2007- 下载数据集:
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 ../.. ln -s data/VOCdevkit2007/VOCdevkit data/VOCdevkit20074. 模型训练与验证
4.1 下载预训练模型
Faster R-CNN通常使用在ImageNet上预训练的基础网络(如VGG16或ResNet101):
mkdir -p data/pretrained_model cd data/pretrained_model下载VGG16预训练模型:
wget https://s3-us-west-2.amazonaws.com/jwyang/faster-rcnn-vgg16-1.0.0.pth或者ResNet101预训练模型:
wget https://s3-us-west-2.amazonaws.com/jwyang/faster-rcnn-res101-1.0.0.pth4.2 训练配置
训练脚本的主要参数如下表所示:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| --dataset | 使用的数据集 | pascal_voc |
| --net | 基础网络架构 | vgg16或res101 |
| --bs | 批处理大小 | 根据GPU内存调整(通常1-4) |
| --nw | 数据加载线程数 | 根据CPU核心数调整(通常4-8) |
| --lr | 初始学习率 | 0.001-0.01 |
| --lr_decay_step | 学习率衰减步长 | 5-10 |
| --cuda | 使用GPU加速 | 总是启用 |
使用VGG16训练示例:
CUDA_VISIBLE_DEVICES=0 python trainval_net.py \ --dataset pascal_voc \ --net vgg16 \ --bs 4 \ --nw 4 \ --lr 0.001 \ --lr_decay_step 5 \ --cuda4.3 常见训练问题解决
GPU内存不足
- 降低批处理大小(--bs参数)
- 使用更小的基础网络(如VGG16代替ResNet101)
- 启用梯度检查点(需要修改代码)
Loss不收敛
- 调整学习率(尝试0.01, 0.001, 0.0001)
- 检查数据预处理是否正确
- 确保预训练模型正确加载
训练速度慢
- 增加数据加载线程数(--nw参数)
- 使用更快的存储(如SSD代替HDD)
- 考虑使用混合精度训练
4.4 模型测试与评估
训练完成后,可以使用以下命令评估模型在测试集上的表现:
python test_net.py \ --dataset pascal_voc \ --net vgg16 \ --checksession 1 \ --checkepoch 20 \ --checkpoint 10021 \ --cuda参数说明:
- checksession: 训练会话ID(通常为1)
- checkepoch: 训练的epoch数
- checkpoint: 模型检查点编号
5. 自定义数据集训练
5.1 准备自定义数据集
要训练自己的数据集,需要按照PASCAL VOC的格式组织数据:
VOCdevkit └── VOC2007 ├── Annotations # XML标注文件 ├── ImageSets │ └── Main # 训练/验证/测试划分文件 └── JPEGImages # 原始图像5.2 修改类别定义
在lib/datasets/pascal_voc.py中修改类别列表:
self._classes = ( '__background__', # always index 0 'class1', 'class2', # 添加你的类别... )5.3 清除缓存
在开始新训练前,删除旧的缓存文件:
rm data/cache/voc_2007_trainval_gt_roidb.pkl5.4 启动训练
使用与前面类似的命令开始训练,确保指定正确的数据集路径和网络架构。
6. 模型部署与推理
6.1 单张图像测试
使用demo.py脚本可以对单张图像进行测试:
python demo.py \ --net vgg16 \ --checksession 1 \ --checkepoch 20 \ --checkpoint 10021 \ --cuda \ --load_dir models \ --image_dir images6.2 批量推理
要批量处理一个目录下的所有图像,可以修改demo.py脚本或使用如下命令:
for img in images/*.jpg; do python demo.py \ --net vgg16 \ --checksession 1 \ --checkepoch 20 \ --checkpoint 10021 \ --cuda \ --load_dir models \ --image $img done6.3 性能优化技巧
启用CuDNN基准测试
- 在代码开始处添加:
torch.backends.cudnn.benchmark = True使用混合精度训练
- 安装apex库:
git clone https://github.com/NVIDIA/apex cd apex pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./模型量化
- 训练后可以对模型进行量化以减少内存占用和提高推理速度:
model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 )
7. 高级配置与调优
7.1 修改锚点(Anchor)设置
Faster R-CNN的性能很大程度上依赖于锚点的设置。要修改锚点参数,编辑lib/model/config.py:
__C.ANCHOR_SCALES = [8, 16, 32] # 默认锚点尺度 __C.ANCHOR_RATIOS = [0.5, 1, 2] # 默认宽高比7.2 调整NMS阈值
非极大值抑制(NMS)是目标检测中的关键步骤,可以调整其阈值:
__C.TEST.NMS = 0.3 # NMS阈值,默认0.37.3 学习率调度策略
默认使用步长衰减,可以尝试其他策略如余弦退火:
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)7.4 多GPU训练
要使用多个GPU进行训练,可以使用PyTorch的DataParallel:
model = torch.nn.DataParallel(model)然后在训练命令中指定多个GPU:
CUDA_VISIBLE_DEVICES=0,1 python trainval_net.py ...8. 可视化与调试
8.1 训练过程可视化
使用TensorBoard可以方便地监控训练过程:
- 安装TensorBoard:
pip install tensorboard- 在代码中添加记录:
from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter() writer.add_scalar('Loss/total', loss.item(), iteration)- 启动TensorBoard:
tensorboard --logdir=runs8.2 检测结果可视化
修改demo.py脚本可以保存带有检测框的图像:
cv2.imwrite('output.jpg', im2show)8.3 常见错误调试
CUDA out of memory
- 降低批处理大小
- 使用更小的输入图像尺寸
- 清理不必要的GPU缓存
NaN loss
- 检查数据中是否有无效值
- 降低学习率
- 添加梯度裁剪
预测框位置异常
- 检查锚点设置是否合理
- 验证数据标注是否正确
- 调整回归损失权重