DepthAI v2 has been superseded by DepthAI v3. You are viewing legacy documentation.
此页面由 AI 自动翻译。查看英文原版

本页目录

  • 如何放置它
  • 输入和输出
  • 配置空间检测
  • 常见错误
  • 用法
  • 功能示例
  • 空间坐标系
  • 参考

YoloSpatialDetectionNetwork

Yolo NN 的空间检测。它类似于 YoloDetectionNetworkSpatialLocationCalculator 的组合。

如何放置它

Python

Python
1pipeline = dai.Pipeline()
2yoloSpatial = pipeline.create(dai.node.YoloSpatialDetectionNetwork)

C++

C++
1dai::Pipeline pipeline;
2auto yoloSpatial = pipeline.create<dai::node::YoloSpatialDetectionNetwork>();

输入和输出

配置空间检测

SpatialDetectionNetwork 节点的管道在下面的模式中进行了描述:
空间检测节点本质上只是检测网络(YoloDetectionNetworkMobileNetDetectionNetwork)和 SpatialLocationCalculator 的抽象。它通过将每个检测到的对象的边界框链接到空间位置计算器来工作。过程如下:
检测网络负责在输入帧中检测对象。它输出一个检测到的对象列表,每个对象由一个边界框标签和一个置信度分数表示。
深度图与输入帧对齐。这是必需的,因为 DetectionNetwork 在输入帧上运行,而 SpatialLocationCalculator 在深度图上运行。
来自网络的边界框被发送到 SpatialLocationCalculator,并根据 BoundingBoxScaleFactor 进行缩放。这样做是为了确保它包含整个对象。然后,边界框与深度一起用于计算对象的空间坐标。
  • XY 坐标取自边界框中心。它们是根据与帧中心和该点的深度的偏移量计算得出的。
  • 对于深度(Z),将考虑缩放边界框(ROI)内的每个像素。这将为我们提供一组深度值,然后对这些值进行平均以获得最终的深度值。

平均方法

  • 平均值/均值:ROI 的平均值用于计算。
  • 最小值:ROI 内的最小值用于计算。
  • 最大值:ROI 内的最大值用于计算。
  • 众数:ROI 内最频繁的值用于计算。
  • 中位数:ROI 内的中位数用于计算。
默认方法是中位数

常见错误

大多数错误源于边界框重叠不正确。缩放后的边界框可能包含背景部分,这会影响深度计算。
  • 细长物体(如杆)的空间坐标可能不准确,因为边界框只有一小部分实际位于检测到的物体上。在这种情况下,最好使用较小的 BoundingBoxScaleFactor(如果可能)。
  • 带有孔洞的物体 - 呼啦圈、戒指等。要获得正确的深度,边界框应包含整个物体。与其使用中位数深度,不如使用最小值深度方法来排除计算中的背景。或者,可以在静态环境中设置深度阈值来忽略背景。

用法

Python

Python
1pipeline = dai.Pipeline()
2yoloSpatial = pipeline.create(dai.node.YoloSpatialDetectionNetwork)
3yoloSpatial.setBlobPath(nnBlobPath)
4
5# Spatial detection specific parameters
6yoloSpatial.setConfidenceThreshold(0.5)
7yoloSpatial.input.setBlocking(False)
8yoloSpatial.setBoundingBoxScaleFactor(0.5)
9yoloSpatial.setDepthLowerThreshold(100) # Min 10 centimeters
10yoloSpatial.setDepthUpperThreshold(5000) # Max 5 meters
11
12# Yolo specific parameters
13yoloSpatial.setNumClasses(80)
14yoloSpatial.setCoordinateSize(4)
15yoloSpatial.setAnchors([10,14, 23,27, 37,58, 81,82, 135,169, 344,319])
16yoloSpatial.setAnchorMasks({ "side26": [1,2,3], "side13": [3,4,5] })
17yoloSpatial.setIouThreshold(0.5)

C++

C++
1dai::Pipeline pipeline;
2auto yoloSpatial = pipeline.create<dai::node::YoloSpatialDetectionNetwork>();
3yoloSpatial->setBlobPath(nnBlobPath);
4
5// Spatial detection specific parameters
6yoloSpatial->setConfidenceThreshold(0.5f);
7yoloSpatial->input.setBlocking(false);
8yoloSpatial->setBoundingBoxScaleFactor(0.5);
9yoloSpatial->setDepthLowerThreshold(100); // Min 10 centimeters
10yoloSpatial->setDepthUpperThreshold(5000); // Max 5 meters
11
12// yolo specific parameters
13yoloSpatial->setNumClasses(80);
14yoloSpatial->setCoordinateSize(4);
15yoloSpatial->setAnchors({10, 14, 23, 27, 37, 58, 81, 82, 135, 169, 344, 319});
16yoloSpatial->setAnchorMasks({{"side13", {3, 4, 5}}, {"side26", {1, 2, 3}}});
17yoloSpatial->setIouThreshold(0.5f);

功能示例

空间坐标系

OAK 相机使用左手(笛卡尔)坐标系来表示所有空间坐标。
空间坐标系

参考

需要帮助?

请前往 Discussion Forum 获取技术支持或提出您可能有的任何其他问题。