# 设备端编程

由于原生工具链封闭，无法进行常规（固件）设备端开发，但我们仍然提供了几种替代方案来运行自定义代码：

 1. 脚本 - 使用 Python 3.9 配合 [Script 节点](https://docs.luxonis.com/software-v3/depthai/depthai-components/nodes/script.md)
 2. 创建自己的 NN 模型 以运行计算密集度更高的功能
 3. 创建自定义 [OpenCL](https://en.wikipedia.org/wiki/OpenCL) 内核

## 使用 Script 节点

使用 [Script 节点](https://docs.luxonis.com/software-v3/depthai/depthai-components/nodes/script.md) 可以在设备本身上运行自定义的 Python
脚本，这为用户在构建流水线时提供了更大的灵活性。

当串联使用多个神经网络时，Script
节点也非常有用——你需要先处理第一个网络的输出，然后再将图像输入第二个网络。示例：[面部年龄/性别识别](https://github.com/luxonis/oak-examples/tree/master/gen2-age-gender) 演示——第一个
NN 检测人脸，将检测结果传递给 Script 节点，Script 节点创建
[ImageManipConfig](https://docs.luxonis.com/software-v3/depthai/depthai-components/messages/image_manip_config.md)
来裁剪原始帧，然后将[面部年龄/性别识别](https://docs.openvinotoolkit.org/latest/omz_models_model_age_gender_recognition_retail_0013.html) NN
只输入裁剪后的人脸帧。

对于运行计算密集度高的功能（例如图像滤镜），出于性能考虑，你可能希望避免使用 Script 节点，而是采用下面描述的两种方式之一。

## 创建自定义 NN 模型

你可以使用自己偏好的 NN 库创建自定义模型，将其转换为 OpenVINO 格式，然后编译成 .blob 文件。更多信息请参考 [将模型转换为 MyriadX
blob](https://docs.luxonis.com/software-v3/ai-inference/conversion.md) 文档。

请参阅 [计算机视觉](https://docs.luxonis.com/software-v3/depthai/perception/computer-vision.md) 页面了解更多信息。

### 支持的网络层

将模型转换为 OpenVINO 的 IR 格式（.bin 和 .xml）时，需要检查 OpenVINO 是否支持所使用的网络层。以下是各种框架支持的网络层及其限制：

 * [Caffe](https://docs.openvino.ai/2022.1/openvino_docs_MO_DG_prepare_model_Supported_Frameworks_Layers.html#caffe-supported-layers)
 * [MXNet](https://docs.openvino.ai/2022.1/openvino_docs_MO_DG_prepare_model_Supported_Frameworks_Layers.html#mxnet-supported-symbols)
 * [TensorFlow](https://docs.openvino.ai/2022.1/openvino_docs_MO_DG_prepare_model_Supported_Frameworks_Layers.html#tensorflow-supported-operations)
 * [TensorFlow 2
   Keras](https://docs.openvino.ai/2022.1/openvino_docs_MO_DG_prepare_model_Supported_Frameworks_Layers.html#tensorflow-2-keras-supported-operations)
 * [Kaldi](https://docs.openvino.ai/2022.1/openvino_docs_MO_DG_prepare_model_Supported_Frameworks_Layers.html#kaldi-supported-layers)
 * [ONNX](https://docs.openvino.ai/2022.1/openvino_docs_MO_DG_prepare_model_Supported_Frameworks_Layers.html#onnx-supported-operators)

## 创建自定义 OpenCL 内核

创建自定义 NN 模型存在一些限制，例如 OpenVINO/VPU 支持的[支持的网络层](#Supported%20layers)。为了避免这些限制，你可以考虑创建自定义 OpenCL 内核并编译到 VPU 上。该内核将在 VPU 的 SHAVE
核心上运行。需要注意的是，这种方式并不特别友好。我们计划编写一个教程，介绍如何开发这些内核并在 OAK 相机上运行。

 * [OpenVINO 提供的关于如何使用 OpenCL
   实现自定义层的教程](https://docs.openvinotoolkit.org/2021.1/openvino_docs_IE_DG_Extensibility_DG_VPU_Kernel.html)
 * [OpenCL 中的自定义内核实现](https://github.com/openvinotoolkit/openvino/tree/2021.4.2/inference-engine/src/vpu/custom_kernels)
