多线程使用pyrealsense2结合YoloV5 TensorRT时程序崩溃求助
问题分析与解决方案
核心问题原因
- 内存资源耗尽:Jetson Nano仅4GB内存,主线程无限制向队列写入colorize后的深度帧,而推理线程处理速度跟不上生产速度,队列无限膨胀占用大量内存。当系统内存不足时,RealSense的colorizer处理块无法分配足够内存执行,触发
RuntimeError。 - 帧内存引用风险:
np.asanyarray(c.colorize(DEPTH).get_data())创建的是原帧数据的视图而非深拷贝,若RealSense原始深度帧被后续getData()覆盖或释放,可能导致colorizer操作时访问无效内存。 - 无队列缓冲限制:未设置队列最大长度,主线程持续生产远超推理线程处理能力的帧,进一步加剧内存压力。
具体解决方案
1. 限制队列长度并启用生产端阻塞
修改队列初始化代码,设置合理的最大长度(建议8-16,平衡延迟与内存占用),并在写入队列时启用阻塞,避免无限制生产:
if __name__ == '__main__': # 设置队列最大长度,防止内存爆炸 queue = Queue(maxsize=8) print("loading model") model = ODModel() print("model loaded") rs = RealSense() p = Thread(target=detect, args=(queue,)) c = rs.colorizer p.start() for i in range(100): RGB, DEPTH = rs.getData() img = np.asanyarray(c.colorize(DEPTH).get_data()) # 队列满时自动等待,直到有空闲位置 queue.put(img, block=True) queue.put(None) p.join() model.destroy() print("Exiting Main Thread")
2. 强制深拷贝帧数据
将colorize后的帧数据深拷贝,彻底脱离对RealSense原始帧内存的依赖:
img = np.array(c.colorize(DEPTH).get_data()).copy()
3. 优化推理线程处理速度
- 提前计算
letterbox的固定尺寸padding参数,避免重复计算开销。 - 确认Yolov5 TensorRT模型启用
fp16推理模式(Jetson Nano原生支持,可大幅提升速度)。 - 移除推理线程中不必要的打印语句(如
print("loading image...")),减少IO耗时。
4. 查看RealSense详细日志
运行程序前设置环境变量开启debug日志,可获取更具体的错误细节:
export RS_LOG_LEVEL=debug python test2.py
Jetson平台上RealSense的持久化日志默认存储在/var/log/librealsense/目录下。
内容的提问来源于stack exchange,提问作者Natanel Birarov
相关产品推荐
相关产品推荐

