# 性能优化

本节致力于优化和评估AI模型在Luxonis设备（如OAK-D系列）上部署时的性能。

通过量化和硬件加速来优化AI模型性能，对于强大但资源受限的Luxonis边缘设备至关重要。这确保了适用于实际场景的响应迅速且可扩展的AI应用。

## 理解性能指标

延迟、吞吐量和准确性是三个不同的指标，用于评估各种系统在不同方面的性能。

 * 延迟：指输入（如图像或视频帧）与神经网络相应输出或响应之间的延迟或滞后。
 * 吞吐量：指计算机视觉系统在给定时间内可以处理的数据量或任务数。
 * 准确性：衡量系统或模型在正确性方面的表现。

## 硬件考量

目前，我们的设备基于第二代或第三代机器人视觉核心（RVC2和RVC3）。您可以在[RVC2](https://docs.luxonis.com/hardware/platform/rvc/rvc2.md)和[RVC3](https://docs.luxonis.com/hardware/platform/rvc/rvc3.md)的硬件章节中找到更多详细信息。

## RVC2 NN性能

| 模型名称 | 尺寸 | FPS | 延迟[毫秒] |
| --- | --- | --- | --- |
| MobileOne S0 | 224x224 | 165.5 | 11.1 |
| Resnet18 | 224x224 | 94.8 | 19.7 |
| DeepLab V3 | 256x256 | 36.5 | 48.1 |
| DeepLab V3 | 513x513 | 6.3 | 253.1 |
| YoloV6n R2 | 416x416 | 65.5 | 29.3 |
| YoloV6n R2 | 640x640 | 29.3 | 66.4 |
| YoloV6t R2 | 416x416 | 35.8 | 54.1 |
| YoloV6t R2 | 640x640 | 14.2 | 133.6 |
| YoloV6m R2 | 416x416 | 8.6 | 190.2 |
| YoloV7t | 416x416 | 46.7 | 37.6 |
| YoloV7t | 640x640 | 17.8 | 97.0 |
| YoloV8n | 416x416 | 31.3 | 56.9 |
| YoloV8n | 640x640 | 14.3 | 123.6 |
| YoloV8s | 416x416 | 15.2 | 111.9 |
| YoloV8m | 416x416 | 6.0 | 273.8 |

> 要查看更多RVC2 NN模型的性能，请参考
> [此电子表格](https://docs.google.com/spreadsheets/d/1yMD4L3gNTkv9d-CqwHTYkn1_on9qDwjeDSUiW2x_H8k/edit?usp=sharing)
> 。

## 模型优化技术

### Luxonis特定优化

#### SHAVES数量

当使用我们的工具导出给定模型时，设置正确的SHAVES数量可以提高性能。SHAVES是DepthAI/OAK中的向量处理器。这些SHAVES用于处理NCE（神经计算引擎）未实现的操作，也用于设备中的其他任务，如处理、重新格式化图像，执行一些ISP等。

有关在工具中设置SHAVES数量的信息，请参阅[此处](https://docs.luxonis.com/software/ai-inference/integrations/yolo.md)。

#### 降低相机FPS以匹配NN FPS

降低FPS使其不超过NN能力，通常能提供最佳的延迟性能，因为NN可以在新帧可用时立即开始推理。

#### NN输入队列大小和阻塞行为

默认情况下，DepthAI中的队列是阻塞的，因此当达到队列大小（可通过setQueueSize()方法设置）时，来自设备的任何额外消息都将被阻塞。库会等待直到能够向队列中添加新消息。
当队列为非阻塞时，在之前的场景中，库会丢弃最旧的消息，将新消息添加到队列，然后继续其处理循环。 如果您的网络具有较高延迟且无法处理那么多帧，将神经网络的输入队列设置为非阻塞可能会提高性能。

### 量化（仅适用于 RVC3 转换）

为了加速模型，可以对模型进行量化。量化是指将模型中的权重和激活值从高精度（例如 32 位浮点数）降低到低精度（例如 8 位整数），目的是在不显著影响模型性能的前提下，提升计算和内存效率。要了解更多关于量化模型的信息，请参考 OpenVINO
的[文档](https://docs.openvino.ai/2022.3/pot_default_quantization_usage.html)。

要对模型进行量化，可以使用[训练后优化工具（POT）](https://docs.openvino.ai/latest/pot_docs_FrequentlyAskedQuestions.html)。在进行快速测试时，我们推荐使用默认量化。为此，您需要一些图像，例如
coco128.zip（[从这里下载](https://ultralytics.com/assets/coco128.zip)）。但是，为了获得最佳量化效果和最低的精度损失，建议使用训练集或验证集中的图像。

安装 POT，请在 Python 环境中使用以下命令：

```bash
python -m pip install --upgrade pip
pip install openvino-dev==2022.1
```

接下来，定义一个 pot-config.json 文件：

```json
{
    "model": {
        "model_name": "yolov6n",
        "model": "path/to/model.xml",
        "weights": "path/to/model.bin"
    },
    "engine": {
        "device": "CPU",
        "type": "simplified",
        "data_source" : "/path/to/coco128/images/train2017/"
    },
    "compression": {
        "target_device" : "VPU",
        "algorithms": [
            {
                "name": "DefaultQuantization",
                "params": {
                    "stat_subset_size": 300
                 },
            }
        ]
    }
}
```

请记得指定 XML、BIN 和数据集的正确路径。

最后，运行：

```bash
pot -c pot-config.json -d
```

这将在结果目录中创建量化的 XML 和 BIN 文件。

## 性能分析与基准测试

通过启用 info 日志级别（或更低），depthai 将打印硬件资源的使用情况，特别是 CPU/RAM 消耗、温度、CMX 切片和 SHAVE 核心分配。

您可以像这样设置调试级别：

```bash
DEPTHAI_LEVEL=info python3 script.py
```

### DepthAI 管道图

[DepthAI Pipeline Graph](https://github.com/luxonis/depthai_pipeline_graph) 是一个出色的调试工具，能够深入洞察 DepthAI 管道及其内部工作原理。它可以可视化 DepthAI
管道并输出 FPS。

要安装它，请运行以下命令：

```bash
pip install git+https://github.com/luxonis/depthai_pipeline_graph.git
```

接下来，要可视化 main.py 脚本中定义的 DepthAI 管道，请使用以下命令：

```bash
pipeline_graph "python main.py -cam"
```

更多示例，请访问 [DepthAI Pipeline Graph 仓库](https://github.com/luxonis/depthai_pipeline_graph#run)。

## 常见性能问题故障排除

如果将 depthai 级别设置为 trace，depthai 将记录每个节点/进程的操作时间。

要可视化网络，可以使用 [netron.app](https://netron.app)。您可以调查可能导致瓶颈的操作，然后通过在该操作之前剪枝模型来验证假设。要剪枝模型，应将[模型优化器
(mo)](https://docs.luxonis.com/software/ai-inference/conversion.md) 的 --output
标志设置为指定节点。要了解更多关于剪枝的信息，请参阅[文档](https://docs.openvino.ai/2022.3/openvino_docs_MO_DG_prepare_model_convert_model_Cutting_Model.html#model-cutting)。剪枝模型后，编译它，测量其延迟，并与原始（未剪枝）模型的延迟进行比较，以验证您的假设是否正确。
