此页面由 AI 自动翻译。查看英文原版

本页目录

  • 在设备上运行您自己的 CV 功能
  • 使用 PyTorch 创建自定义模型
  • Kornia

计算机视觉

我们的平台支持在设备本身上执行计算机视觉 (CV) 功能。虽然您无法运行 OpenCV,但您可以使用其许多支持的功能。借助 DepthAI,您可以:
  • 使用 ImageManip 进行裁剪、旋转、扭曲/去扭曲、镜像、翻转、透视变换等操作。
  • 使用 EdgeDetector 检测边缘(Sobel 滤波器)。
  • 使用 FeatureTracker 检测和跟踪特征
  • 使用 ObjectTracker 跟踪对象(卡尔曼滤波器、匈牙利算法)。 支持开箱即用的 Yolo 和 MobileNet 对象检测器。
  • 使用 StereoDepth 感知立体深度(Census 变换、成本匹配和聚合)。
DepthAI 计算机视觉
如果您想使用任何其他 CV 功能,请参阅下面的指南,了解如何有效地在设备的硬件加速块上实现和运行 CV 功能。

在设备上运行您自己的 CV 功能

演示:

使用 PyTorch 创建自定义模型

在本指南中,我们将创建一个简单的模型,将三个帧连接成一个。这是一个简单的示例,但您可以使用相同的过程来创建更复杂的模型。

TL;DR

If you are only interested in the implementation

我们首先需要创建一个扩展 PyTorch 的 nn.Module 的 Python 类。 然后,我们可以将我们的 NN 逻辑放入创建类的 forward 函数中。 在帧连接的示例中,我们可以使用 torch.cat 函数来连接多个帧:
Python
1class CatImgs(nn.Module):
2    def forward(self, img1, img2, img3):
3        return torch.cat((img1, img2, img3), 3)
对于更复杂的模块,请参考 Kunal Tyagi 的 PyTorch 中的 Harris 角点检测 演示。请记住,VPU 只支持 FP16 这意味着最大值为 65504。当乘以几个值时,如果您不正确地归一化/除以值,您可能会很快溢出。
由于 OpenVINO 不直接支持 PyTorch,因此我们首先需要将模型导出为 onnx 格式,然后再导出为 OpenVINO。 PyTorch 具有 对 onnx 的集成支持,因此导出到 onnx 非常简单:
Python
1# 对于 300x300 帧
2X = torch.ones((1, 3, 300, 300), dtype=torch.float32)
3torch.onnx.export(
4    CatImgs(),
5    (X, X, X), # 形状的虚拟输入
6    "path/to/model.onnx",
7    opset_version=12,
8    do_constant_folding=True,
9)
这将把连接模型导出为 onnx 格式。我们可以使用 Netron 应用 来可视化创建的模型:
Netron 应用可视化
在将模型导出到 onnx 时,PyTorch 的效率不高。它会创建大量不必要的运算/层,从而增加了网络的尺寸(可能导致 FPS 下降)。 因此,我们建议使用 onnx-simplifier 一个简单的 Python 包,可以移除不必要的运算/层。
Python
1import onnx
2from onnxsim import simplify
3
4onnx_model = onnx.load("path/to/model.onnx")
5model_simplified, check = simplify(onnx_model)
6onnx.save(model_simplified, "path/to/simplified/model.onnx")
这是使用 onnx-simplifier 显著简化效果的示例。左侧是直接从 PyTorch 导出的模糊模型(来自 Kornia),右侧是具有相同功能的简化网络:
模糊模型比较
现在我们有了一个(简化的)onnx 模型,我们可以将其转换为 OpenVINO,然后再转换为 .blob 格式。有关转换模型的更多信息,请参阅 转换指南通常,这首先需要使用 OpenVINO 的模型优化器 将 onnx 转换为 IR 格式(.bin/.xml),然后使用 Compile tool 编译为 .blob。但我们也可以使用 blobconverter 直接从 onnx 转换为 .blob。Blobconverter 会一次性完成这两个步骤——无需安装 OpenVINO。您可以像这样编译您的 onnx 模型:
Python
1import blobconverter
2
3blobconverter.from_onnx(
4    model="/path/to/model.onnx",
5    output_dir="/path/to/output/model.blob",
6    data_type="FP16",
7    shaves=6,
8    use_cache=False,
9    optimizer_params=[]
10)
现在您可以使用您的 .blob 模型与 NeuralNetwork 节点。 请查看 oak-examples/custom-models 来运行使用这些自定义模型的演示应用程序。

Kornia

Kornia, “State-of-the-art and curated Computer Vision algorithms for AI.”,包含一套在 PyTorch 中实现的常用计算机视觉算法。这允许用户执行类似以下的操作:
Python
1import kornia
2
3class Model(nn.Module):
4    def forward(self, image):
5        return kornia.filters.gaussian_blur2d(image, (9, 9), (2.5, 2.5))
并使用与 使用 PyTorch 创建自定义模型 中描述的完全相同的过程来实现帧模糊,如下所示:
Frame blurring