# 神经网络分辨率技术

在运行与输入帧宽高比不同的神经网络时，存在两个主要挑战：

 * 输入帧宽高比不匹配 - 当你的神经网络模型期望的宽高比与传感器的宽高比不同时
 * 神经网络输出的可视化 - 当你想在更高分辨率下可视化神经网络输出时

## 输入帧宽高比不匹配

当你的神经网络模型期望不同的宽高比（例如 1:1）而传感器的宽高比（例如 4:3）不同时，并且在传感器的全部视场（FOV）上运行神经网络推理，就会出现一个挑战。假设我们有一个 MobileNet-SSD 模型，它期望 300x300 的输入帧（1:1
宽高比），并且我们希望在传感器的完整视场上运行推理，那么我们有几个选择：

 1. 将 ISP 帧裁剪为 1:1 宽高比，从而损失部分视场
 2. 将 ISP 帧拉伸为神经网络的 1:1 宽高比
 3. 对 ISP 帧应用 letterboxing 以获得 1:1 宽高比的帧

### 裁剪

优点：不会降低神经网络精度。缺点：帧被裁剪，因此不是完整视场。

将完整视场（isp）帧裁剪成神经网络的宽高比可以获得最佳的神经网络精度，但这会减少视场。
[使用示例在此](https://github.com/luxonis/oak-examples/blob/master/gen2-full-fov-nn/cropping.py)。

### Letterbox

优点：保留完整视场。缺点：较小的"帧"意味着特征减少，可能降低神经网络精度。

[Letterboxing](https://en.wikipedia.org/wiki/Letterboxing_%28filming%29) 方法会在完整视场（isp）帧的上方和下方添加"黑边"，从而保留宽高比。你可以通过使用
manip.setResizeThumbnail(x,y) 的 ImageManip 来实现这一点。使用此方法的缺点是你的实际图像会变小，因此某些特征可能无法保留，这可能导致神经网络精度下降。
[使用示例在此](https://github.com/luxonis/oak-examples/blob/master/gen2-full-fov-nn/letterboxing.py)。

### 拉伸

优点：保留完整视场。缺点：由于帧被拉伸，神经网络精度可能会下降。

拉伸是通过改变宽高比完成的。可以通过 camRgb.setPreviewKeepAspectRatio(False) 进行配置。这意味着宽高比不会被保留，图像会被"拉伸"。对于某些现成的神经网络模型来说，这可能会有问题，因此可能需要进行微调。
[使用示例在此](https://github.com/luxonis/oak-examples/blob/master/gen2-full-fov-nn/stretching.py)。

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

要在 RVC2 上以实时速度（约 30FPS）运行目标检测模型，你通常会使用较低分辨率的输入帧进行推理（例如 300x300 或 416x416）。与其在这样的低分辨率帧上显示边界框，你还可以流式传输更高分辨率的帧（例如来自 ColorCamera 的
video 输出），并在这些高分辨率帧上显示边界框。有几种方法可以实现这一点，在本节中我们将逐一探讨。

### 直通

只使用低分辨率的推理帧。这里我们使用了
[MobileNetDetectionNetwork](https://docs.luxonis.com/software/depthai-components/nodes/mobilenet_detection_network.md) 输出的
passthrough 帧，因此边界框与帧同步。另一种选择是从 [ColorCamera](https://docs.luxonis.com/software/depthai-components/nodes/color_camera.md) 流式传输
preview 帧，并在主机上同步（或不同步）。下方是带有检测结果的 300x300
帧。[演示代码在此](https://github.com/luxonis/oak-examples/blob/master/gen2-display-detections/1-passthrough.py)。

### 裁剪高分辨率帧

一个简单的解决低分辨率帧的方法是将高分辨率帧（例如来自 [ColorCamera](https://docs.luxonis.com/software/depthai-components/nodes/color_camera.md) 的 video
输出）流式传输到主机，并在其上绘制边界框。为了使边界框与帧匹配，preview 和 video 的分辨率应具有相同的宽高比，即 1:1。在示例中，我们将 4K 分辨率降采样到 720P，因此最大分辨率为
720x720，这正是我们使用的分辨率（camRgb.setVideoSize(720,720)）。我们也可以使用 1080P 分辨率，并将 1080x1080
帧流式传输回主机。[演示代码在此](https://github.com/luxonis/oak-examples/blob/master/gen2-display-detections/2-crop_highres.py)。

### 拉伸帧

我们经常遇到的模型问题是它们的宽高比是 1:1，而不是像相机分辨率的
16:9。这意味着部分视场将会丢失。上面（[输入帧宽高比不匹配](#Input%20frame%20AR%20missmatch)）我们展示了改变宽高比将保留相机的完整视场，但会"挤压"/"拉伸"帧，如下所示。[演示代码在此](https://github.com/luxonis/oak-examples/blob/master/gen2-display-detections/3-stretch_img.py)。

### 编辑边界框

为了避免拉伸帧（这可能会影响神经网络精度），我们还可以从设备流式传输完整视场的 video 帧，并在 300x300 帧上进行推理。然而，这意味着我们必须重新计算边界框以匹配不同宽高比的图像。这种方法并不能保留完整的宽高比，它只是在完整视场的 video
帧上显示边界框。[演示代码在此](https://github.com/luxonis/oak-examples/blob/master/gen2-display-detections/4-edit_bb.py)。
