CenterNet实战:从零搭建到模型测试的完整环境配置指南

📅 2026/7/5 2:05:14 👁️ 阅读次数 📝 编程学习
CenterNet实战:从零搭建到模型测试的完整环境配置指南

1. 环境准备:从零搭建CenterNet开发环境

第一次接触CenterNet时,最头疼的就是环境配置。记得我当初在Ubuntu 18.04上折腾了整整两天,现在把踩过的坑和经验都总结给你。首先明确几个关键组件:

  • Python 3.6+(官方推荐3.6)
  • PyTorch 1.4+(注意CUDA版本匹配)
  • CUDA 10.1(实测兼容性最佳)
  • DCNv2编译支持

1.1 创建Python虚拟环境

强烈建议使用conda管理环境,避免包冲突。执行以下命令创建名为CenterNet的独立环境:

conda create --name CenterNet python=3.6 -y conda activate CenterNet

如果没安装conda,可以用pyenv+virtualenv组合:

pyenv install 3.6.15 python -m venv ~/venv/CenterNet source ~/venv/CenterNet/bin/activate

1.2 安装PyTorch和CUDA工具包

根据显卡驱动版本选择CUDA版本。使用nvidia-smi查看驱动版本,然后到 NVIDIA官网 查兼容性。对于RTX 2080 Ti(驱动版本450+),推荐组合:

conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit=10.1 -c pytorch

验证安装是否成功:

import torch print(torch.__version__) # 应输出1.4.0 print(torch.cuda.is_available()) # 应输出True

2. 关键组件编译:DCNv2与NMS

2.1 编译DCNv2的曲折经历

官方源码中的DCNv2不支持PyTorch 1.0+,需要替换为改进版。按步骤操作:

  1. 删除原DCNv2目录
rm -rf src/lib/models/networks/DCNv2
  1. 克隆新版DCNv2
git clone https://github.com/CharlesShang/DCNv2.git src/lib/models/networks/DCNv2
  1. 修改编译配置(关键步骤!) 打开src/lib/models/networks/DCNv2/src/cuda/dcn_v2_cuda.cu,在头部添加:
#define THC_API_PER_THREAD_ALLOCATION
  1. 执行编译
cd src/lib/models/networks/DCNv2 ./make.sh

常见错误解决方案:

  • error: identifier "THCudaMalloc" is undefined:添加上述宏定义
  • nvcc not found:检查CUDA路径是否加入PATH

2.2 NMS编译的隐藏技巧

进入external目录修改编译选项:

cd src/lib/external

编辑setup.py,找到约第10行取消注释:

extra_compile_args=["-Wno-cpp", "-Wno-unused-function"]

然后执行编译:

python setup.py build_ext --inplace

3. 模型测试:从静态图像到实时摄像头

3.1 预训练模型选择

官方提供多个预训练模型,新手推荐:

  • ctdet_coco_dla_2x:平衡精度与速度(AP 37.4%/52FPS)
  • ctdet_pascal_resdcn18:轻量级模型(AP 72.6%/7ms)

下载模型到指定目录:

mkdir -p models wget https://cloud.tsinghua.edu.cn/f/5c0b8f1a1e3445089d3c/?dl=1 -O models/ctdet_coco_dla_2x.pth

3.2 图像测试实战

测试单张图像(示例图片在images目录):

python demo.py ctdet --demo ../images/16004479832_a748d55f21_k.jpg --load_model ../models/ctdet_coco_dla_2x.pth

你会看到终端输出检测结果,并在demo_results/目录生成带标注的图像。如果遇到KeyError: 'dla34',需要修改pose_dla_dcn.py

# 注释掉pretrained加载部分 def dla34(pretrained=False, **kwargs): model = DLA([1,1,1,2,2,1], [16,32,64,128,256,512], block=BasicBlock, **kwargs) # if pretrained: # model.load_pretrained_model(data='imagenet', name='dla34', hash='ba72cf86') return model

3.3 实时摄像头部署

连接USB摄像头后运行:

python demo.py ctdet --demo webcam --load_model ../models/ctdet_coco_dla_2x.pth

调试技巧:

  • 添加--debug 2参数可视化热力图
  • 使用--flip_test启用翻转测试提升精度
  • 调整--vis_thresh参数(默认0.3)控制检测灵敏度

4. 常见问题排坑指南

4.1 CUDA内存不足问题

现象:RuntimeError: CUDA out of memory解决方案:

  1. 减小测试图像尺寸:
python demo.py ctdet --demo ../images/test.jpg --load_model ../models/ctdet_coco_dla_2x.pth --input_h 512 --input_w 512
  1. 限制GPU使用数量:
CUDA_VISIBLE_DEVICES=0 python demo.py ...

4.2 模型加载异常

现象:KeyError: 'base.base...'这是PyTorch版本不匹配导致,修改模型加载方式:

# 在demo.py中找到load_model函数,修改为: def load_model(model, model_path): checkpoint = torch.load(model_path, map_location=lambda storage, loc: storage) state_dict = {k.replace('module.', ''): v for k,v in checkpoint['state_dict'].items()} model.load_state_dict(state_dict, strict=False) return model

4.3 摄像头帧率低

优化方案:

  1. 使用轻量模型:
wget https://cloud.tsinghua.edu.cn/f/2d9011f5c8a14c3e8f3a/?dl=1 -O models/ctdet_pascal_resdcn18.pth python demo.py ctdet --demo webcam --load_model ../models/ctdet_pascal_resdcn18.pth
  1. 启用Half精度推理(需GPU支持): 修改src/lib/opts.py添加:
group.add_argument('--half', action='store_true', help='use half precision inference')