推理
推理
概述
如果所选模型未为所需的 RVC 平台进行转换,请参阅 转换 部分。
安装
pip 进行安装:Command Line
1pip install depthai --force-reinstall
2pip install depthai-nodes推理管道
- 相机,
- 模型和解析器;
- 队列;
- 结果。
Python
1import depthai as dai
2from depthai_nodes.node import ParsingNeuralNetwork
3
4model = "..." # NN Archive 或 HubAI 模型标识符
5
6# 创建管道
7with dai.Pipeline() as pipeline:
8
9 # 相机
10 camera = pipeline.create(dai.node.Camera).build()
11
12 # 模型和解析器
13 nn_with_parser = pipeline.create(ParsingNeuralNetwork).build(
14 camera, model
15 )
16
17 # 队列
18 parser_output_queue = nn_with_parser.out.createOutputQueue()
19
20 # 启动管道
21 pipeline.start()
22
23 while pipeline.isRunning():
24
25 # 结果
26 ...除了定义 HubAI 模型标识符外,上面的模板应该可以开箱即用。但请注意,某些 OAK 设备有内部 FPS 限制(例如 OAK-D Lite)。您可以将 FPS 限制设置为
pipeline.create(ParsingNeuralNetwork).build(... fps=<limit>)。相机
Python
1camera_node = pipeline.create(dai.node.Camera).build()模型和解析器
- 自动地,使用
ParsingNeuralNetwork节点,或 - 手动地,将它们初始化为独立节点并将它们链接在一起。
自动设置
ParsingNeuralNetwork 节点通过添加模型输出的自动解析功能来扩展标准的 NeuralNetwork 节点。 可以从 depthai_nodes 包中导入它,如下所示:Python
1from depthai_nodes.node import ParsingNeuralNetworkPython
1# 设置 NN Archive
2nn_archive = dai.NNArchive(<path/to/NNArchiveName.tar.xz>)
3
4# 设置模型(带解析器)并将其链接到摄像头输出
5nn_with_parser = pipeline.create(ParsingNeuralNetwork).build(
6 cameraNode, nn_archive
7)Python
1# 设置 HubAI 模型标识符
2model = "..."
3
4# 设置带解析器的模型
5nn_with_parser = pipeline.create(ParsingNeuralNetwork).build(
6 camera_node, model
7)如果您计划使用私有的 HubAI 模型,请确保配置您的 Luxonis Hub API 密钥。相关说明可在 API 密钥最佳实践 页面上找到。正确设置后,API 密钥将自动应用于身份验证您与 HubAI 平台的请求。
手动设置
DepthAI Nodes 解析器或实现您自己的解析器。Python
1from depthai_nodes.node import <ParserNode>
2# 或:
3class ParserNode(dai.node.ThreadedHostNode):
4 def __init__(self) -> None:
5 super().__init__()
6 self.input = self.createInput()
7 self.out = self.createOutput()
8 def build(self) -> "ParserNode":
9 return self
10 def run(self) -> None:
11 nn_out_raw = self.input.get()
12 nn_out_processed = ... # 自定义后处理
13 self.out.send(nn_out_processed)create() 方法将模型和解析器初始化为独立节点:Python
1model = pipeline.create(dai.node.NeuralNetwork)
2parser = pipeline.create(<ParserNode>)- 初始化时,可以通过将参数值作为参数传递给
create()方法来设置配置:parser = pipeline.create(<ParserNode>, <ParameterName>=<ParameterValue>, ...)如果配置多个参数,可以将它们组织成一个dict并将其作为参数传递给parser的build()方法:parser = pipeline.create(<ParserNode>).build(config_dict); - 初始化后,可以通过使用 setter 方法更改配置:
parser.<SetterMethodName>(<ParameterValue>)。 您可以在 DepthAI Nodes API 参考 页面上找到特定解析器的所有可用 setter 方法。
.blob 或 RVC4 的 .dlc 文件):Python
1model.setModelPath(<path/to/model_executable>)Python
1width, height = ... # 模型输入尺寸
2camera_stream = camera.requestOutput(size=(width, height))
3camera_stream.link(model.input)
4model.out.link(parser.input)如果您有兴趣构建更高级的解析器——类似于我们自动处理 NN Archives 以进行设置的原生解析器——请查看 DepthAI Nodes 库的 parsers 部分。在那里,您可以探索我们是如何在实践中实现它们的。
队列(Queue)
Python
1frame_queue = nn_with_parser.passthrough.createOutputQueue()单头
Python
1parser_output_queue = nn_with_parser.out.createOutputQueue()多头
Python
1head0_parser_output_queue = nn_with_parser.getOutput(0).createOutputQueue()
2head1_parser_output_queue = nn_with_parser.getOutput(1).createOutputQueue()
3...结果
pipeline.start() 启动后,可以从定义的队列中获取输出。 您可以获取输入帧和已解析的模型输出,如下所示:Python
1while pipeline.isRunning():
2
3 # 获取摄像头输出
4 frame_queue_output = frame_queue.get()
5 frame = frame_queue_output.getCvFrame()
6 ...
7
8 # 获取已解析的输出
9 parser_output = parser_output_queue.get()
10 ...- 通用的 DepthAI 消息,或
- 自定义的 DepthAI 节点消息
示例
故障排除
设置模型 SHAVEs
Command Line
1NeuralNetwork: Blob compiled for ... shaves, but only ... are available in current configurationCommand Line
1[14442C103180EECF00] [2.1] [4.736] [NeuralNetwork(2)] [warning] Network compiled for 8 shaves, maximum available 13, compiling for 6 shaves likely will yield in better performance- 如果模型是使用 旧版 Blobconverter 导出的,您可以重新编译模型并指定匹配的 SHAVE 数量,或者
- 如果模型是在 HubAI 中导出的,则无需重新编译 - 您可以在管道初始化时设置 SHAVE 数量以匹配设备要求:
Python
1nn_archive = dai.NNArchive(...)
2nn_with_parser = pipeline.create(ParsingNeuralNetwork).build(
3 ..., nn_archive
4)
5# 设置 SHAVE 数量
6nn_with_parser.setNNArchive(
7 nn_archive, numShaves=<Number>
8)DepthAI v3 不再支持旧的
SHAVE 配置方法。请避免使用:Python
1nn = pipeline.create(dai.node.NeuralNetwork)
2nn.setNumShaves(6)更改解析器参数
- 具有单独解析器节点的管道: 直接访问解析器节点即可。
- 具有
ParsingNeuralNetwork节点的管道: 在这种情况下,解析器已集成到 AI 模型中。 通过在ParsingNeuralNetwork节点上调用.getParser()方法来检索它。
Python
1parser.setConfThreshold(0.5)不同的可视化和模型输入尺寸
ImageManip 节点在将图像发送到模型之前调整其大小,同时保留原始分辨率用于显示。示例:Python
1cam = pipeline.create(dai.node.Camera).build()
2
3# 请求特定的捕获图像尺寸
4cam_out = cam.requestOutput(size=(<width1>, <height1>))
5
6# 创建并配置用于模型输入的 resize 节点
7resize_node = pipeline.create(dai.node.ImageManip)
8resize_node.initialConfig.setOutputSize(<width2>, <height2>)
9cam_out.link(resize_node.inputImage)
10
11# 定义具有调整大小输入的模型
12nn_with_parser: ParsingNeuralNetwork = pipeline.create(ParsingNeuralNetwork).build(
13 resize_node.out, ...
14)
15
16# 使用原始分辨率进行可视化
17video_queue = cam_out.out.createOutputQueue() # 高分辨率流
18detection_queue = nn_with_parser.out.createOutputQueue() # 低分辨率流上的检测
19...从 HubAI 下载的模型位置
.depthai_cached_models 文件夹中。 此缓存包含之前运行的所有模型。 如果模型已缓存,则会本地加载,而不是重新下载。 要强制重新下载,可以在下载模型时使用 useCached=False 参数。 示例:Python
1nn_archive = dai.NNArchive(dai.getModelFromZoo(model_description, useCached=False))
2nn_with_parser = pipeline.create(ParsingNeuralNetwork).build(
3 ..., nn_archive
4).depthai_cached_models 文件夹并重新运行管道。扩展阅读
在 RVC4 上并发执行模型
HTP 上的资源分配
- HTP 计算核心和 V-TCM 内存会在所有并发 SNPE 会话之间弹性共享。
- 内部调度器使用轮询策略;资源分配在多个模型之间不是固定的,并且可以逐帧变化。
控制旋钮
- 不支持资源引导。没有每个模型的优先级、核心亲和性或配额 API。唯一的全局控制是
--perf_profile标志,它会影响 SoC 级别的功耗/性能权衡。
实践指南
- 假设在新的/并发会话启动或停止时,延迟和吞吐量会发生波动。
- 使用 SNPE 定时日志(例如逐层分析)来测量端到端延迟,而不是猜测资源共享。