Detectron2视频目标检测推理速度慢(6.96it/s)求优化方案
优化Detectron2视频推理速度与GPU利用率的实用建议
一、模型与推理模式优化
- 启用半精度推理:在推理循环中加入
torch.cuda.amp.autocast()上下文管理器,同时确保模型加载时指定cfg.MODEL.DEVICE = "cuda",减少GPU内存占用的同时提升计算效率。 - 切换轻量模型配置:若对精度要求不极端,可替换为
COCO-Detection/faster_rcnn_R_50_C4_1x.yaml(移除FPN分支,减少计算量)或retinanet_R_50_FPN_1x.yaml,这类模型的推理速度显著快于FPN 3x版本。 - 导出为TensorRT格式:将训练好的模型导出为ONNX后,用TensorRT做算子融合、精度校准等GPU专属优化,能大幅提升利用率和速度。示例代码:
后续用TensorRT工具完成转换与推理。from detectron2.export import export_onnx_model cfg = get_cfg() # 加载你的配置与训练权重 export_onnx_model(cfg, model, "model.onnx", opset_version=11)
二、推理流程优化
- 批量推理替代单帧处理:将视频帧打包成batch输入(比如一次处理4-8帧),修改
cfg.INPUT.BATCH_SIZE_TEST为对应数值,充分利用GPU并行计算能力,避免算力闲置。 - 压缩预处理/后处理耗时:
- 预处理优先用GPU加速操作,比如用
torchvision.transforms的CUDA版本,减少CPU端图像转换的等待。 - 暂时关闭非必要后处理(如绘制复杂标注框、逐帧保存图片),先测试纯推理速度;若需保存结果,改用批量异步IO。
- 预处理优先用GPU加速操作,比如用
- 优化视频读取:用
cv2.VideoCapture时设置CAP_PROP_BUFFERSIZE = 10增大缓存,或用ffmpeg批量读取帧到内存,消除逐帧读取的IO瓶颈。
三、系统与GPU配置优化
- 开启cudnn基准模式:在代码开头添加
torch.backends.cudnn.benchmark = True,让cudnn自动选择最优卷积算法;同时移除代码中不必要的torch.cuda.synchronize()调用,减少CPU-GPU同步等待。 - 清理GPU占用:用
nvidia-smi检查是否有其他进程占用A10算力,关闭无关程序,确保GPU资源全部用于推理。 - 调整内存分配:设置
torch.cuda.set_per_process_memory_fraction(0.9),允许进程占用更多GPU内存,避免因内存不足导致的算力浪费。
四、代码细节优化
- 单例Predictor:确保Predictor仅初始化一次,不要在帧循环内重复创建,避免重复加载模型的耗时。
- 过滤低置信度结果:设置
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5(可根据需求调整),减少后处理需要处理的检测框数量。
内容的提问来源于stack exchange,提问作者Dr.Fail to fall asleep
相关产品推荐
相关产品推荐

