本页目录

  • 输入帧宽高比不匹配
  • 裁剪
  • 黑边
  • 拉伸
  • 在高分辨率下显示检测结果
  • 直通
  • 裁剪高分辨率帧
  • 拉伸帧
  • 编辑边界框

NN的分辨率技术

在运行NN时,如果输入帧与NN模型的宽高比(AR)不匹配,通常会遇到两个主要挑战:
  • 输入帧宽高比不匹配——当你的NN模型期望的宽高比与传感器的宽高比不同时
  • NN输出的可视化——当你想要在高分辨率下可视化NN输出时

输入帧宽高比不匹配

当你的NN模型期望的宽高比(例如 1:1)与传感器的宽高比(例如 4:3)不同,且我们希望在传感器的全视场角(FOV)上运行NN推理时,就会出现挑战。假设我们有一个MobileNet-SSD,它期望300x300的输入帧(1:1宽高比),而我们希望在传感器的全FOV上运行推理——我们有几种选择:
  1. 将ISP帧裁剪为1:1宽高比,但会损失部分FOV
  2. 将ISP帧拉伸为NN的1:1宽高比
  3. 对ISP帧应用黑边(letterboxing),得到1:1宽高比的帧
这三种变换都可以通过ImageManip节点进行配置,只需设置适当的ResizeMode即可。

裁剪

优点:NN精度不降低。缺点:帧被裁剪,因此不是全FOV。将全FOV(isp)帧裁剪为匹配NN宽高比,可以获得最佳的NN精度,但这会降低FOV。可以通过以下方式设置:
Python
1manip.initialConfig.setOutputSize(width, height, dai.ImageManipConfigV2.ResizeMode.CENTER_CROP)

黑边

优点:保留全FOV。缺点:较小的“帧”意味着更少的特征,可能降低NN精度。黑边(Letterboxing)方法会在全FOV(isp)帧的上方和下方添加“黑条”,从而保留宽高比。使用此方法的缺点是实际图像会变小,因此某些特征可能无法保留,这可能导致NN精度下降。可以通过以下方式设置:
Python
1manip.initialConfig.setOutputSize(width, height, dai.ImageManipConfigV2.ResizeMode.LETTERBOX)

拉伸

优点:保留全FOV。缺点:由于帧被拉伸,NN精度可能降低。拉伸是通过改变宽高比来实现的。这意味着宽高比不会被保留,图像会被“拉伸”。这可能会对一些现成的NN模型造成问题,因此可能需要一些微调。可以通过以下方式配置:
Python
1manip.initialConfig.setOutputSize(width, height, dai.ImageManipConfigV2.ResizeMode.STRETCH)
使用示例

在高分辨率下显示检测结果

要在RVC2上以实时速度(约30FPS)运行目标检测模型,通常使用较低的输入帧进行推理(例如 300x300416x416)。与其在这样的小帧上显示边界框,你还可以流式传输更高分辨率的帧(例如来自ColorCameravideo输出),并在这些高分辨率帧上显示边界框。有几种方法可以实现这一点,本部分将逐一介绍。

直通

直接使用较小的推理帧。这里我们使用DetectionNetwork输出的passthrough帧,因此边界框与帧同步。另一种选择是从ColorCamera流式传输preview帧,并在主机上同步(或者根本不同步)。下面是300x300帧带检测结果。 示例代码

裁剪高分辨率帧

一个简单的解决低分辨率帧的方法是流式传输高分辨率帧(例如来自ColorCameravideo输出)到主机,并在其上绘制边界框。为了使边界框与帧匹配,previewvideo的尺寸应具有相同的宽高比,例如1:1。在示例中,我们将4K分辨率降采样到720P,因此最大分辨率为720x720,这正是我们使用的分辨率(camRgb.setVideoSize(720,720))。我们也可以使用1080P分辨率并流式传输1080x1080帧回到主机。 示例代码

拉伸帧

我们在模型中经常遇到的一个问题是,它们的宽高比是1:1,而不是像我们相机分辨率那样的16:9。这意味着部分FOV会丢失。在上文(输入帧宽高比不匹配)中,我们展示了改变宽高比会保留相机的全部FOV,但会导致帧“挤压”/“拉伸”,如下所示。 示例代码

编辑边界框

为了避免拉伸帧(这可能会影响NN精度),我们也可以从设备流式传输全FOV的video,并在300x300帧上进行推理。然而,这意味着我们必须重新计算边界框,以匹配图像的不同宽高比。这种方法不会保留整个宽高比,它只是在全FOV的video帧上显示边界框。 示例代码