3. 设备上编程

虽然由于本机工具的封闭性而无法进行常规(固件)设备上的开发,但我们仍然公开了几种运行自定义代码的替代方法:

  1. Scripting-使用带有python3.9版本的 脚本节点

  2. 创建您自己的神经网络模型,来运行更多计算繁重特征的任务。

  3. 创建自定义OpenCL内核

3.1. 使用脚本节点

使用 脚本节点 允许您在设备本身上运行自定义python脚本,这使用户在构建管道时具有更大的灵活性。

脚本节点 在串联使用多个神经网络模型时也非常有用 ,您只需要在将图像提供给第二个前处理第一个神经网络的输出。这里的 例子人脸年龄和性别识别 示例–第一个NN模型将检测人脸,检测结果传递到脚本节点。该节点会创建 ImageManip配置节点 以裁剪原始帧并仅向 人脸年龄/性别识别模型 提供裁剪的人脸帧。

对于运行计算量大的方法(例如图像过滤器),由于性能原因,您可能希望避免使用脚本节点,而是使用下面描述的2个选项之一。

3.2. 创建自定义NN模型

您可以使用自己喜欢的 NN 库创建自定义模型,将模型转换为 OpenVINO,然后将其编译为 .blob 。有关此主题的更多信息,请参阅 将模型转换为MyriadX blob 文档。

3.3. 创建自定义OpenCL内核

创建自定义 NN 模型有一些限制,例如OpenVINO/VPU不支持的 。为避免这些限制,您可以考虑创建自定义 OpenCL 内核并为 VPU 编译它。该内核将在 VPU 上的 SHAVE 内核上运行。考虑到此选项对用户不是很友好。我们计划创建一个关于如何开发这些并在 OAK 相机上运行它们的教程。

3.4. Poe独立运行模式

3.5. 在设备上运行您自己的CV模型

正如在 设备上编程 中提到的,您可以使用您最喜欢的NN库创建 自定义CV模型 ,将其转换并编译为 .blob 并在设备上运行。本教程将介绍如何做到这一点。

如果您对 训练和部署自己的AI模型 感兴趣,请参阅 自定义训练

示例:

3.5.1. 使用PyTorch创建自定义模型

TL;DR 如果您对实现代码感兴趣,请 点击此处

  1. 创建PyTorchNN模块

    我们首先需要创建一个扩展PyTorch的 nn.Module 的Python类。然后我们可以将我们的NN逻辑放入 forward 创建的类的函数中。在帧连接的例子中,我们可以使用 torch.cat 函数连接多个帧:

    class CatImgs(nn.Module):
        def forward(self, img1, img2, img3):
            return torch.cat((img1, img2, img3), 3)
    

    如需更复杂的模块,请参阅Kunal Tyagi的 Harris corner detection in PyTorch

    请记住 ,VPU仅支持 FP16 ,这意味着最大值为 65504。当乘以几个值时,如果您没有正确使用归一化或除法,您可能会快速溢出。

  2. 将NN模块导出到onnx

    由于OpenVINO不直接支持PyTorch,我们首先需要将模型导出为 onnx 格式,然后再导出为 OpenVINO。PyTorch集成了对onnx的支持 ,因此导出到onnx非常简单:

    # For 300x300 frames
    X = torch.ones((1, 3, 300, 300), dtype=torch.float32)
    torch.onnx.export(
        CatImgs(),
        (X, X, X), # Dummy input for shape
        "path/to/model.onnx",
        opset_version=12,
        do_constant_folding=True,
    )
    

    这会将连接模型导出为onnx格式。我们可以使用 Netron应用程序 可视化创建的模型:

    ../../_images/concat_model.png
  3. 简化onnx模型

    将模型导出到onnx时,PyTorch效率不高。它创建了大量不必要的操作/层,从而增加了网络的大小(这可能导致FPS降低)。这就是我们推荐使用 onnx-simplifier 的原因,这是一个简单的python包,可以删除不必要的操作/层。

    import onnx
    from onnxsim import simplify
    
    onnx_model = onnx.load("path/to/model.onnx")
    model_simpified, check = simplify(onnx_model)
    onnx.save(model_simpified, "path/to/simplified/model.onnx")
    

    以下是使用onnx-simplifier进行简化的重要性的示例。左边是直接从PyTorch导出的模糊模型(来自Kornia),右边是具有 相同功能 的简化网络:

    ../../_images/blur_comparison.png
  4. 转换为OpenVINO/blob

    现在我们有了(简化的)onnx模型,我们可以将其转换为OpenVINO,然后再转换为 .blob 格式。有关转换模型的其他信息,请参阅 将自定义模型转换为MyriadX blob

    这通常首先使用 OpenVINO的模型优化器 将onnx转换为 IR 格式(.bin/.xml),然后使用编译工具编译为 .blob 。 但我们也可以使用blobconverter将onnx直接转换为.blob。

    Blobconverter只需同时执行这两个步骤 - 无需安装OpenVINO。你可以像这样编译你的onnx模型:

    import blobconverter
    
    blobconverter.from_onnx(
        model="/path/to/model.onnx",
        output_dir="/path/to/output/model.blob",
        data_type="FP16",
        shaves=6,
        use_cache=False,
        optimizer_params=[]
    )
    
  5. 在管道中使用.blob

    您现在可以将 .blob 模型与 NeuralNetwork 节点一起使用。浏览 depthai-experiments/custom-models 以运行使用这些自定义模型的演示应用程序。

3.5.2. Kornia

Kornia , “State-of-the-art and curated Computer Vision algorithms for AI.”, 有 **一组在PyTorch中实现的通用计算机视觉算法 ** 。这允许用户执行类似的操作:

import kornia

class Model(nn.Module):
    def forward(self, image):
        return kornia.filters.gaussian_blur2d(image, (9, 9), (2.5, 2.5))

使用与 PyTorch创建自定义模型 相同的步骤来实现 帧模糊 ,如下所示:

../../_images/blur.jpeg

Note

在我们的测试中,我们发现 一些算法 既不支持OpenVINO框架,也不支持VPU。我们已经为 Sobel过滤器 提交了一个 问题

部署参考的API示例

官方参考链接

有疑问?

我们很乐意为您提供代码或其他问题的帮助。

我们的联系方式

售后技术支持
oak_china_wechat

企业微信:OAK中国

售前技术和项目咨询
WeChat

微信号:13951940532

加好友请备注"OAK咨询"

欢迎到淘宝选购
taobao
OAK中国官方淘宝店

还可以通过我们发布的视频和文章了解OAK

有疑问?

我们很乐意为您提供代码或其他问题的帮助。

我们的联系方式

售后技术支持
oak_china_wechat

企业微信:OAK中国

售前技术和项目咨询
WeChat

微信号:13951940532

加好友请备注"OAK咨询"

欢迎到淘宝选购
taobao
OAK中国官方淘宝店

还可以通过我们发布的视频和文章了解OAK