Raspberry pi4上CNN代码如何接入Intel Neural Compute Stick 2运行
树莓派4接入Intel NCS2实现CNN推理加速方法
先搞懂基本调用逻辑
NCS2是独立的Myriad VPU加速外设,不会直接兼容你原来用PyTorch/TensorFlow写的原生CNN代码,它只运行OpenVINO IR格式的优化模型,完整调用链路是:
- 将训练好的CNN模型转换为OpenVINO IR格式(含
.xml网络结构文件、.bin权重文件) - 初始化OpenVINO运行时核心,指定推理设备为
MYRIAD(这是NCS2对应的固定设备名,不要写错) - 将IR模型加载到NCS2上完成编译,创建推理实例
- 按照原模型要求完成输入数据预处理,送入NCS2执行推理,取回输出结果做后处理即可
整个过程中推理计算全部在NCS2上完成,几乎不占用树莓派CPU资源。
前置校验(必做,避免无效调试)
先把NCS2插在树莓派的USB3.0蓝色接口上(插USB2.0会大幅降低推理速度,还容易供电不足),依次执行两条命令确认环境正常:
- 检查硬件是否被系统识别
lsusb
输出中包含ID 03e7:2485 Intel Movidius MyriadX即为硬件识别正常。
2. 检查OpenVINO是否能调用NCS2
python3 -c "from openvino.runtime import Core; print(Core().available_devices)"
输出列表中包含MYRIAD即为环境配置正常,可以开始改造代码。
现有代码改造步骤
1. 模型格式转换
不要直接把原生的.pth/.pt/.h5/.pb模型往NCS2上加载,必须先转成IR格式:
- 如果是PyTorch训练的CNN:先把模型导出为ONNX格式,再用OpenVINO模型优化工具转换
- 如果是TensorFlow训练的CNN:可以直接把pb文件/SavedModel目录传给模型优化工具转换
转换命令示例(替换成你自己的模型路径、输入参数即可):
mo --input_model your_cnn.onnx --input_shape [1,3,224,224] --output_dir ./ir_model/
转换完成后会在指定输出目录生成.xml和.bin两个文件,就是NCS2可运行的模型文件。
2. 推理代码替换
你原来代码里的预处理、后处理逻辑完全不用改,只需要把原生框架加载模型、执行推理的部分替换成下面的OpenVINO调用代码即可:
# 导入OpenVINO运行时核心,不需要额外安装NCS2专属SDK from openvino.runtime import Core import numpy as np # 初始化OpenVINO核心 ie = Core() # 读取转换好的IR模型 model = ie.read_model(model="./ir_model/your_cnn.xml", weights="./ir_model/your_cnn.bin") # 将模型编译加载到NCS2设备,device_name固定填MYRIAD就是调用NCS2 compiled_model = ie.compile_model(model=model, device_name="MYRIAD") # 获取模型输入输出节点句柄 input_node = compiled_model.input(0) output_node = compiled_model.output(0) # --- 这部分保留你原来的预处理代码即可,比如图像resize、归一化、维度调整 --- # 最终预处理好的输入要和模型要求的形状、数据类型一致,通常是shape为(1,C,H,W)的float32张量 input_data = your_original_preprocess(raw_input) # --- 预处理代码结束 --- # 送入NCS2执行推理,这一步就是硬件加速环节 infer_result = compiled_model([input_data])[output_node] # --- 这部分保留你原来的后处理代码即可,比如softmax、类别映射、阈值判断 --- final_output = your_original_postprocess(infer_result) # --- 后处理代码结束 ---
常见问题排查
- 设备名不要写错:NCS2对应的设备名固定是
MYRIAD,填NCS2/VPU/GPU都会找不到设备 - 输入数据类型要匹配:绝大多数CNN要求输入是
float32类型,直接传uint8图像或者float64张量会报错 - 加载模型失败大概率是供电问题:树莓派USB口供电不足时NCS2会掉线,换带独立供电的USB3.0 hub即可解决
- 第一次加载模型时会有3-10秒的模型编译时间,属于正常现象,不是程序卡死,后续推理就会保持稳定速度
- 如果要对比CPU和NCS2的速度,只需要把
compile_model里的device_name改成CPU就行,其他代码完全不用改
内容的提问来源于stack exchange,提问作者Edme W
相关产品推荐
相关产品推荐

