推理
概述
如果所选模型未转换为所需的 RVC 平台,请参考转换部分。
安装
pip 安装它们:Command Line
1pip install depthai --force-reinstall
2pip install depthai-nodes推理管线
- Camera, - 模型和解析器;- 队列;- 结果。
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 # Camera
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)。您可以通过
pipeline.create(ParsingNeuralNetwork).build(... fps=<limit>) 设置 FPS 限制。Camera
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并将其作为参数传递给解析器的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 章节。在那里,您可以了解我们在实践中是如何实现它们的。
队列
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# 创建并配置用于模型输入的调整大小节点
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 时序日志(例如分层分析)来衡量端到端延迟,而不是猜测资源份额。