管道调试
管道调试
warning,但可以设置更详细的级别来帮助调试问题。以下级别可用:| 调试级别 | 信息 |
|---|---|
critical | 仅当发生导致程序停止/崩溃的严重错误时。 |
error | 错误不会停止程序,但操作将无法完成。示例:当 ImageManip 的裁剪 ROI 超出边界时,将打印错误并且不会执行裁剪。当 NeuralNetwork 接收到的帧的形状(宽度/高度/通道)与 .blob 不匹配时。 |
warn | 在用户操作可以改进某些行为/修复它时打印警告。示例:当 API 更改时,旧的 API 样式将被弃用并向用户显示警告。 |
info | 将打印有关 CPU/RAM 消耗、温度、CMX 切片和 SHAVE 核心分配的信息。 |
debug | 在管道启动和停止时特别有用。Debug 将打印:有关设备初始化的信息,例如管道 JSON、固件/引导加载程序/OpenVINO 版本。设备/XLink 如何被关闭/处理。 |
trace | Trace 将在从设备接收到消息时打印一条消息。 |
资源调试仅在使用环境变量
DEPTHAI_LEVEL 设置调试级别时可用。在代码中设置调试级别时不可用。使用 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 进行调试
Command Line
1[184430102189660F00] [2.1] [0.675] [system] [info] DepthCamera allocated resources: shaves: [0-12] no cmx slices.
2[184430102189660F00] [2.1] [0.675] [system] [info] SIPP (Signal Image Processing Pipeline) internal buffer size '18432'B, DMA buffer size: '16384'B
3[184430102189660F00] [2.1] [0.711] [system] [info] ImageManip internal buffer size '285440'B, shave buffer size '34816'B
4[184430102189660F00] [2.1] [0.711] [system] [info] ColorCamera allocated resources: no shaves; cmx slices: [13-15]
5ImageManip allocated resources: shaves: [15-15] no cmx slices.Command Line
1[19443010513F4D1300] [0.1.2] [2.014] [MonoCamera(0)] [trace] Mono ISP took '0.866377' ms.
2[19443010513F4D1300] [0.1.2] [2.016] [MonoCamera(1)] [trace] Mono ISP took '1.272838' ms.
3[19443010513F4D1300] [0.1.2] [2.019] [StereoDepth(2)] [trace] Stereo rectification took '2.661958' ms.
4[19443010513F4D1300] [0.1.2] [2.027] [StereoDepth(2)] [trace] Stereo took '7.144515' ms.
5[19443010513F4D1300] [0.1.2] [2.028] [StereoDepth(2)] [trace] 'Median' pipeline took '0.772257' ms.
6[19443010513F4D1300] [0.1.2] [2.028] [StereoDepth(2)] [trace] Stereo post processing (total) took '0.810216' ms.
7[2024-05-16 14:27:51.294] [depthai] [trace] Received message from device (disparity) - parsing time: 11µs, data size: 256000Linux/MacOS
Command Line
1DEPTHAI_LEVEL=debug python3 script.pyCPU 使用率
debug(或更低)时,depthai 还会打印 LeonOS 和 LeonRT 的 CPU 使用率。CPU 使用率达到 100%(或接近)可能会导致许多不良影响,例如更高的帧延迟、更低的 FPS,甚至在某些情况下会导致固件崩溃。与 OAK USB 摄像头相比,OAK PoE 摄像头的 CPU 消耗会增加,因为网络堆栈运行在 LeonOS 核心上。 降低 CPU 消耗的最简单方法是降低管道的复杂性,或降低摄像头的 FPS,因为它们是 CPU 的主要消耗者(运行 3A 算法)。CPU 使用率未达到 100% 也极大地降低了帧延迟,在下面的脚本示例中,延迟从约 710 毫秒降低到约 110 毫秒:RAM 使用情况
info(请参阅 Pipeline Debugging 部分),您将看到 RAM 的使用情况: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 MiBCMX(用于图像处理)和 DDR(其他所有内容)之间分配。如果 DDR 使用率接近最大值(在此示例中为 358 MiB),您可能会收到类似以下的错误:Command Line
1[error] Neural network executor '0' out of '2' error: OUT_OF_MEMORY减少 RAM 消耗
- 池大小 - 某些节点(包括 ColorCamera、 PointCloud、 ImageManip、 EdgeDetector、 MonoCamera、 StereoDepth、 VideoEncoder、 Warp)具有可配置的池大小(请参阅 节点池文档)。 这意味着用户可以配置要在池(RAM)中存储多少条消息。如果您遇到 RAM 使用限制,最简单的减少方法是减小池大小。配置池大小的 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 使用的 RAM 是 1080P 帧的 4 倍。减少 RAM 消耗的一个简单方法是使用较低的分辨率/较小的帧。
- VideoEncoder VideoEncoder 节点可能会消耗大量 RAM,尤其是在高分辨率下。 例如,RGB 编码 示例消耗 259 MiB。如果我们 将分辨率从 4K 更改为 1080P,DDR 消耗将仅减少到 65 MiB。
- ImageManip 每个 ImageManip 节点都有自己的(输出)池,默认包含 4 帧,因此拥有多个处理高分辨率帧的 ImageManip 会消耗大量 DDR RAM。默认情况下,每个 池“槽”将消耗 1 MiB,即使它是一个小的 300x300 RGB 帧(约 270kB)。因此,指定输出帧大小也可以减少 RAM,例如,对于 300x300 RGB 帧,您可以设置
manip.setMaxOutputFrameSize(270000)。 - XLinkIn 就像 ImageManip 一样,每个 XLinkIn 节点也有自己的消息池。默认情况下,每个 XLinkIn 将消耗 40 MiB,因为每个池“槽”保留 5 MiB ,并且池中有 8 个“槽”。如果您正在从主机向设备发送 300x300 RGB 帧,您可以 设置
xin.setMaxDataSize(270000),并限制每个池的消息数量xin.setNumFrames(4)。这将把 DDR RAM 消耗从 40 MiB 减少到约 1 MiB。
如果您只是从主机发送控制/配置信息,您可以设置 xin.setMaxDataSize(1),因为 CameraControl 和 ImageManipConfig 只包含元数据(不包含任何数据,例如 NNData / ImgFrame/ Buffer)。