You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程使用pyrealsense2结合YoloV5 TensorRT时程序崩溃求助

问题分析与解决方案

核心问题原因

  1. 内存资源耗尽:Jetson Nano仅4GB内存,主线程无限制向队列写入colorize后的深度帧,而推理线程处理速度跟不上生产速度,队列无限膨胀占用大量内存。当系统内存不足时,RealSense的colorizer处理块无法分配足够内存执行,触发RuntimeError。
  2. 帧内存引用风险:np.asanyarray(c.colorize(DEPTH).get_data())创建的是原帧数据的视图而非深拷贝,若RealSense原始深度帧被后续getData()覆盖或释放,可能导致colorizer操作时访问无效内存。
  3. 无队列缓冲限制:未设置队列最大长度,主线程持续生产远超推理线程处理能力的帧,进一步加剧内存压力。

具体解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:01:34