# 后处理

后处理是推理过程中的一个关键阶段。它涉及对模型的原始输出进行优化，以提取有意义的见解和可操作的数据。

## 输出解释与转换

在DepthAI库中，我们支持一系列预定义模型以及自定义模型。本节将指导您如何解释和解析这两种模型的输出。

### 预定义模型

#### 目标检测

我们为一些预定义模型提供解码支持，其输出可轻松通过Python API进行解析。这些模型为每个检测到的目标提供一组数据，包括：

 * 边界框坐标 (xmin, ymin, xmax, ymax): 定义检测到的目标在图像中所处的矩形区域。坐标是归一化的，即相对于图像尺寸表示为0到1之间的值。
 * 置信度分数: 表示模型对检测结果的确定程度。分数越高，表明对检测准确性的信心越大。
 * 类别标签: 指示检测目标的类别，由模型在训练过程中学习得到。

支持的预定义模型包括：

 * MobileNet: 可通过
   [MobileNetDetectionNetwork](https://docs.luxonis.com/software/depthai-components/nodes/mobilenet_detection_network.md#mobilenetdetectionnetwork)
   节点使用。
 * Yolo: 可通过
   [YoloDetectionNetwork](https://docs.luxonis.com/software/depthai-components/nodes/yolo_detection_network.md#yolodetectionnetwork)
   节点使用。可通过 [Luxonis Tools](https://tools.luxonis.com/) 导出。 我们支持多个Yolo模型版本，每个版本针对不同的检测需求进行了优化：
   * YoloV5
   * YoloV6 (R1, R2, R3, R4)
   * YoloV7
   * YoloV8
   * GoldYolo

有关模型输出和预定义模型节点的更详细说明，请参考
[ImgDetections](https://docs.luxonis.com/software/depthai-components/messages/img_detections.md#imgdetections) 文档。 解析数据的示例如下：

```python
import depthai as dai

# 假设管道和模型设置已完成
# 有关管道创建的详细信息，请参考DepthAI文档

# 连接设备并启动管道
with dai.Device(pipeline) as device:

    # 从输出队列中获取检测结果
    qDet = device.getOutputQueue(name="network_node_name", maxSize=4, blocking=False)
    detections = qDet.get().detections

    # 解析每个检测结果
    for detection in detections:
        xmin, ymin, xmax, ymax = detection.bbox
        confidence = detection.confidence
        class_id = detection.label
        # 进一步处理或使用...
```

### 自定义模型

对于自定义模型，仍然可以使用getLayerFp16(layer_name)或getLayerInt8(layer_name)等方法获取输出， 您需要提供特定层的名称。由于这些方法返回的是所选层的扁平化输出， 因此需要对其形状进行重塑以便后续使用。您可以在
[EfficientDet实验](https://github.com/luxonis/oak-examples/tree/master/gen2-efficientDet/main.py#L67) 中找到示例。 以下代码片段简要说明了该过程：

```python
import depthai as dai
import numpy as np

# 假设管道和模型设置已完成
# 有关管道创建的详细信息，请参考DepthAI文档
output_shape=(1,1000) # 替换为您自己的形状

# 连接设备并启动管道
with dai.Device(pipeline) as device:

    # 定义队列
    qDet = device.getOutputQueue(name="network_node_name", maxSize=4, blocking=False)

    # 获取输出列表并重塑为所需尺寸
    outputs = in_nn.getLayerFp16('network_output_name')
    outputs = np.array(outputs).reshape(output_shape)

    # 进一步解析、处理或使用...
```

## 实际应用展示

模型输出被解析后，生成的数据可以以多种有意义的方式使用：

 * 视觉反馈: 使用边界框坐标在实时视频流中绘制检测到目标的矩形。您可以在
   [我们的YOLO实验](https://github.com/luxonis/oak-examples/tree/master/gen2-yolo/device-decoding/main_api.py#L116) 中找到示例。
 * 数据分析: [人员追踪实验](https://github.com/luxonis/oak-examples/tree/master/gen2-people-tracker)
   展示了如何利用数据进行跟踪、分析移动趋势以及统计人数。这对于零售空间、公共场所或交通枢纽等环境非常有用，在这些环境中，了解人流量模式和密度对于运营效率、安全性和客户体验优化至关重要。
 * 异常检测: [该实验](https://github.com/luxonis/oak-examples/tree/master/gen2-anomaly-detection)
   展示了实时异常检测能力。这在制造过程中的质量控制等场景中特别有用，检测产品或过程中的偏差至关重要。
