# 设备端编程

由于原生工具的封闭性，常规的（固件级）设备端开发不可行，但我们仍然提供了几种替代方式来运行自定义代码：

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

## 使用脚本节点

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

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

对于运行计算量较大的功能（例如图像滤镜），出于性能考虑，你可能希望避免使用脚本节点，而是采用下面描述的两种方案之一。

## 创建自定义 NN 模型

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

更多内容请参考 [计算机视觉](https://docs.luxonis.com/software/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)
