# 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](https://docs.luxonis.com/software-v3/depthai/depthai-components/nodes/image_manip.md)节点进行配置，只需设置适当的ResizeMode即可。

### 裁剪

优点：NN精度不降低。缺点：帧被裁剪，因此不是全FOV。

将全FOV（isp）帧裁剪为匹配NN宽高比，可以获得最佳的NN精度，但这会降低FOV。可以通过以下方式设置：

```python
manip.initialConfig.setOutputSize(width, height, dai.ImageManipConfigV2.ResizeMode.CENTER_CROP)
```

### 黑边

优点：保留全FOV。缺点：较小的“帧”意味着更少的特征，可能降低NN精度。

[黑边（Letterboxing）](https://en.wikipedia.org/wiki/Letterboxing_%28filming%29)方法会在全FOV（isp）帧的上方和下方添加“黑条”，从而保留宽高比。使用此方法的缺点是实际图像会变小，因此某些特征可能无法保留，这可能导致NN精度下降。可以通过以下方式设置：

```python
manip.initialConfig.setOutputSize(width, height, dai.ImageManipConfigV2.ResizeMode.LETTERBOX)
```

### 拉伸

优点：保留全FOV。缺点：由于帧被拉伸，NN精度可能降低。

拉伸是通过改变宽高比来实现的。这意味着宽高比不会被保留，图像会被“拉伸”。这可能会对一些现成的NN模型造成问题，因此可能需要一些微调。可以通过以下方式配置：

```python
manip.initialConfig.setOutputSize(width, height, dai.ImageManipConfigV2.ResizeMode.STRETCH)
```

[使用示例](https://docs.luxonis.com/software-v3/depthai/examples/image_manip/image_manip_resize.md)

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

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

### 直通

直接使用较小的推理帧。这里我们使用[DetectionNetwork](https://docs.luxonis.com/software-v3/depthai/depthai-components/nodes/detection_network.md)输出的passthrough帧，因此边界框与帧同步。另一种选择是从[ColorCamera](https://docs.luxonis.com/software-v3/depthai/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-v3/depthai/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。这意味着部分FOV会丢失。在上文（[输入帧宽高比不匹配](#Input%20frame%20AR%20mismatch)）中，我们展示了改变宽高比会保留相机的全部FOV，但会导致帧“挤压”/“拉伸”，如下所示。
[示例代码](https://github.com/luxonis/oak-examples/blob/master/gen2-display-detections/3-stretch_img.py)。

### 编辑边界框

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