本页目录

  • CPU usage
  • 内存使用
  • 减少内存消耗

管道调试

您可以通过更改调试级别来启用日志记录。默认设置为 warning,但可以设置更详细的级别来帮助调试问题。以下级别可用:
调试级别信息
critical唯一的严重错误,会导致程序停止/崩溃。
error错误不会停止程序,但不会完成操作。例如:当 ImageManip 裁剪 ROI 超出边界时,将打印错误并且裁剪不会发生。当 NeuralNetwork 接收到一个形状(宽度/高度/通道)与 .blob 不匹配的帧时。
warn警告会在用户操作可能改善某些行为/修复问题时打印。例如:当 API 发生变化时,旧 API 样式将被弃用,并会向用户显示警告。
info将打印有关 CPU/RAM 消耗、温度、CMX 切片和 SHAVE 核心分配的信息。
debug在启动和停止管道时特别有用。Debug 将打印:设备初始化信息,例如 Pipeline JSON、固件/引导加载程序/OpenVINO 版本。设备/XLink 如何被关闭/释放。
traceTrace 将在每次从设备接收到消息时打印一条消息。
调试可以通过代码(通过 API)启用,也可以通过环境变量启用。

通过 API 进行调试

Python
1with dai.Device() as device: # 初始化设备
2    # 设置调试级别
3    device.setLogLevel(dai.LogLevel.DEBUG)
4    device.setLogOutputLevel(dai.LogLevel.DEBUG)
其中 setLogLevel 设置详细程度,用于过滤从设备发送到主机的消息;setLogOutputLevel 设置详细程度,用于过滤在主机(stdout)上打印的消息。这种区别使我们能够内部捕获日志消息而不打印到 stdout,并将它们用于例如在其他地方显示或分析。

通过环境变量 DEPTHAI_LEVEL 进行调试

使用环境变量设置调试级别,而不是直接在代码中配置,可以提供额外的详细信息。这包括CMXSHAVE使用情况,以及管道中每个节点处理一帧所需的时间。RGB PreviewINFO 模式下的日志消息示例:
Command Line
1[184430102189660F00] [2.1] [0.675] [system] [info] DepthCamera 分配的资源:shaves:[0-12] 无 cmx 切片。
2[184430102189660F00] [2.1] [0.675] [system] [info] SIPP(信号图像处理管道)内部缓冲区大小 '18432'B,DMA 缓冲区大小:'16384'B
3[184430102189660F00] [2.1] [0.711] [system] [info] ImageManip 内部缓冲区大小 '285440'B,shave 缓冲区大小 '34816'B
4[184430102189660F00] [2.1] [0.711] [system] [info] ColorCamera 分配的资源:无 shaves;cmx 切片:[13-15]
5ImageManip 分配的资源:shaves:[15-15] 无 cmx 切片。
Stereo DepthTRACE 模式下的日志消息示例:
Command Line
1[19443010513F4D1300] [0.1.2] [2.014] [MonoCamera(0)] [trace] Mono ISP 耗时 '0.866377' ms。
2[19443010513F4D1300] [0.1.2] [2.016] [MonoCamera(1)] [trace] Mono ISP 耗时 '1.272838' ms。
3[19443010513F4D1300] [0.1.2] [2.019] [StereoDepth(2)] [trace] Stereo 校正耗时 '2.661958' ms。
4[19443010513F4D1300] [0.1.2] [2.027] [StereoDepth(2)] [trace] Stereo 耗时 '7.144515' ms。
5[19443010513F4D1300] [0.1.2] [2.028] [StereoDepth(2)] [trace] '中值' 管道耗时 '0.772257' ms。
6[19443010513F4D1300] [0.1.2] [2.028] [StereoDepth(2)] [trace] Stereo 后处理(总计)耗时 '0.810216' ms。
7[2024-05-16 14:27:51.294] [depthai] [trace] 从设备接收消息(视差) - 解析时间:11µs,数据大小:256000

Linux/MacOS

Command Line
1DEPTHAI_LEVEL=debug python3 script.py

Windows PowerShell

Command Line
1$env:DEPTHAI_LEVEL='debug'
2python3 script.py
3
4# 之后关闭调试
5Remove-Item Env:DEPTHAI_LEVEL

Windows CMD

Command Line
1set DEPTHAI_LEVEL=debug
2python3 script.py
3
4# 之后关闭调试
5set DEPTHAI_LEVEL=

CPU usage

When setting the Debug Level to debug (or lower), depthai will also print our CPU usage for LeonOS and LeonRT. CPU usage at 100% (or close to it) can cause many undesirable effects, such as higher frame latency, lower FPS, and in some cases even firmware crash.Compared to OAK USB cameras, OAK PoE cameras will have increased CPU consumption, as the networking stack is running on the LeonOS core. The easiest way to reduce CPU consumtpion is to reduce the pipeline complexity, or to reduce FPS of the cameras, as they are the main consumers of CPU (running 3A algorithms).Not having 100% CPU usage also drastically decreased frame latency, in the example for the script below it went from ~710 ms to ~110ms:

内存使用

所有使用RVC2的OAK设备都有512 MiB(4 Gbit)板载内存,用于固件(约15MB)、资源文件(从几KB到100MB,例如神经网络模型)以及其他资源,例如存储消息的消息池。如果启用 info(参见管道调试章节),你会看到内存的使用情况:
Command Line
1[info] Memory Usage - DDR: 41.23 / 358.82 MiB, CMX: 2.17 / 2.50 MiB,
2LeonOS Heap: 20.70 / 78.63 MiB, LeonRT Heap: 3.51 / 23.84 MiB
正如你所见,内存被分配到两个LEON(CPU)核心、CMX(用于图像处理)和 DDR(其他所有内容)之间。如果 DDR 使用接近最大值(本例中为358 MiB),你可能会看到如下错误:
Command Line
1[error] Neural network executor '0' out of '2' error: OUT_OF_MEMORY
这意味着你需要减少内存消耗,接下来我们将介绍几种方法。

减少内存消耗

  • 池大小 - 某些节点(包括ColorCameraPointCloudImageManipEdgeDetectorMonoCameraStereoDepthVideoEncoderWarp)具有可配置的池大小(此处查看池文档)。这意味着用户可以配置池中存储多少消息(内存)。如果遇到内存使用限制,最简单的减少方法是减小池大小。配置池大小的API是 node.setNumFramesPool(num_frames_pool)。对于ColorCamera,用户需要指定5个池大小 colorCam.setNumFramesPool(raw, isp, preview, video, still)。注意,将池大小减小到2以下会导致管道问题
  • 大分辨率帧 如果在RGB视频示例中将分辨率从1080P改为4K,DDR使用将从41 MiB增加到161 MiB。这是因为4K帧使用的内存是1080P的4倍。减少内存消耗的一个简单方法是使用较低分辨率/较小的帧。
  • VideoEncoder VideoEncoder 节点会消耗大量内存,尤其是在高分辨率下。例如,RGB编码示例消耗259 MiB。如果将分辨率从4K改为1080P,DDR消耗将减少到仅65 MiB。
  • ImageManip 每个ImageManip节点都有自己的(输出)池,默认包含4帧。因此,多个处理高分辨率帧的ImageManip节点会消耗大量DDR内存。默认情况下,每个池“位置”会消耗1 MiB,即使它只是一个300x300的RGB帧(仅270kB)。因此,指定输出帧大小也可以减少内存,例如,对于300x300 RGB帧,可以设置 manip.setMaxOutputFrameSize(270000)
  • XLinkInImageManip一样,每个XLinkIn节点也有自己的消息池。默认情况下,每个XLinkIn会消耗40 MiB,因为每个池“位置”预留了5 MiB,且池中有8个“位置”。如果要从主机向设备发送300x300 RGB帧,可以设置 xin.setMaxDataSize(270000),并限制每个池的消息数量 xin.setNumFrames(4)。这将使DDR内存消耗从40 MiB减少到大约1 MiB。
如果只是从主机发送控制/配置信息,可以设置 xin.setMaxDataSize(1),因为CameraControlImageManipConfig仅包含元数据(不包含任何数据,如NNData / ImgFrame/Buffer)。