计算机视觉
- 裁剪、旋转、变形/去畸变、镜像、翻转、透视变换等,使用 ImageManip
- 边缘检测(Sobel 滤波器),使用 EdgeDetector
- 特征检测与跟踪,使用 FeatureTracker
- 对象跟踪(卡尔曼滤波、匈牙利算法),使用 ObjectTracker 开箱即用支持 Yolo 和 MobileNet 目标检测器。
- 立体深度感知(Census 变换、代价匹配与聚合),使用 StereoDepth

在设备上运行您自己的 CV 功能
- 帧拼接 - 使用 PyTorch
- 拉普拉斯边缘检测 - 使用 Kornia
- 帧模糊 - 使用 Kornia
- Rahul Ravikumar 的教程:在 OAK 上运行自定义模型
- Kunal Tyagi 的 PyTorch Harris 角点检测
使用 PyTorch 创建自定义模型
TL;DR
如果您只对实现感兴趣
我们首先需要创建一个继承 PyTorch 的 nn.Module 的 Python 类。然后,我们可以将 NN 逻辑放在所创建类的 对于更复杂的模块,请参考 Kunal Tyagi 的 PyTorch Harris 角点检测 演示。请记住,VPU 仅支持 FP16,这意味着最大值为 65504。当相乘多个值时,如果不正确归一化/除值,可能会很快溢出。
forward 函数中。在帧拼接的例子中,我们可以使用 torch.cat 函数将多帧拼接起来:Python
1class CatImgs(nn.Module):
2 def forward(self, img1, img2, img3):
3 return torch.cat((img1, img2, img3), 3)由于 PyTorch 不被 OpenVINO 直接支持,我们首先需要将模型导出为 onnx 格式,然后再转换为 OpenVINO 格式。PyTorch 具有 对 onnx 的内置支持,因此导出为 onnx 非常简单:这将把拼接模型导出为 onnx 格式。我们可以使用 Netron 应用 可视化创建的模型:
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 时,PyTorch 的效率并不高。它会创建大量不必要的操作/层,从而增加网络的尺寸(可能导致较低的 FPS)。因此,我们建议使用 onnx-simplifier,这是一个简单的 Python 包,可以移除不必要的操作/层。以下是一个示例,展示了使用 onnx-simplifier 进行简化的显著效果。左侧是直接从 PyTorch 导出的模糊模型(来自 Kornia),右侧是相同功能的简化网络:
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 模型,可以将其转换为 OpenVINO 格式,然后转换为
.blob 格式。有关转换模型的更多信息,请参见 转换指南。通常,首先使用 OpenVINO 的模型优化器 将 onnx 转换为 IR 格式(.bin/.xml),然后使用 Compile 工具 编译为 .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)在线 blobconverter
您也可以使用 在线 blobconverter 来转换您的模型。
现在,您可以使用 NeuralNetwork 节点来加载您的
.blob 模型。请查看 oak-examples/custom-models 以运行使用这些自定义模型的演示应用程序。Kornia
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))