Yolov7转TensorRT推理报错:无法解包足够值(预期4,得到0)
解决Yolov7-TensorRT本地推理时
ValueError: not enough values to unpack (expected 4, got 0)问题 核心原因分析
报错说明self.infer(img)没有返回预期的4个结果(num, final_boxes, final_scores, final_cls_inds),Colab正常但本地失败,大概率是本地环境与Colab的环境不兼容,或者infer方法的API修改引入了逻辑错误。
具体排查与解决步骤
1. 对齐TensorRT版本
Colab导出的.trt引擎文件是基于特定版本TensorRT生成的,本地版本不匹配会导致引擎无法正确解析,推理无输出:
- 先在Colab中查看TensorRT版本:
import tensorrt print(tensorrt.__version__) - 本地安装完全相同版本的TensorRT,注意要匹配CUDA、cuDNN的版本(参考TensorRT官方兼容矩阵)
- 用本地的TensorRT重新导出引擎文件,不要直接复用Colab导出的文件
2. 检查infer方法的API修改逻辑
替换废弃API(如get_tensor_shape)时,可能破坏了输出张量的读取逻辑:
- 确认
infer方法中正确绑定了所有输出张量:- 检查输出张量的数量是否为4个,名称与导出引擎时的配置一致
- 确保每个输出张量都通过
cudaMemcpy或TensorRT的新API正确读取数据并返回
- 在
infer方法中添加日志,打印输出张量的形状、数据是否为空,定位哪一步没有拿到结果
3. 验证CUDA/cuDNN兼容性
本地CUDA、cuDNN版本与TensorRT不兼容,会导致引擎无法正常执行:
- 对照TensorRT官方文档,确认当前TensorRT版本对应的CUDA、cuDNN版本范围
- 调整本地环境到兼容版本,例如TensorRT 8.6对应CUDA 11.8、cuDNN 8.7.0
4. 对齐图像预处理逻辑
本地preproc函数与Colab实现不一致,会导致输入引擎的图像数据格式错误:
- 对比本地和Colab的
preproc代码,确保:- 图像resize的填充方式、保持比例的逻辑完全一致
- 归一化用的
mean和std值与导出引擎时的参数一致 - 图像通道顺序(RGB/BGR)、数据类型(如float32)正确
调试辅助手段
- 使用TensorRT官方工具
trtexec测试引擎文件是否正常:
如果trtexec --loadEngine=yolov7-tiny-nms.trt --batch=1trtexec报错,说明引擎本身无效,需要重新导出 - 在
inference方法中添加打印,检查img的形状、数据是否符合引擎输入要求
内容的提问来源于stack exchange,提问作者hmmyess
相关产品推荐
相关产品推荐

