跳转到主要内容
SDK Version: 2.3.3

DX-APP C++ Post-processing

# DX-APP C++ Post-processing

Overview

This directory serves as the centralized repository for optimized C++ post-processing modules. These libraries provide the critical decoding logic required to transform raw NPU tensor outputs into actionable, human-readable data.

Key Features

  • Performance Optimization: Computational bottlenecks like Non-Maximum Suppression (NMS), segmentation mask resizing, and keypoint extraction are implemented in high-performance C++.
  • Logic Unification: By sharing the exact same codebase between C++ examples and Python bindings (dx_postprocess), the SDK ensures identical inference results across all development environments.
  • Modularity: Each model family (YOLO, DeepLab, etc.) is isolated into its own module, allowing for targeted updates and lightweight linking.

Architecture & Implementation

At a high level, these libraries manage the transition from DX-RT Tensors to Structured Data.

Core Processing Steps

  • Step 1. Tensor Decoding: Converting raw logits and offsets into coordinates (bounding boxes), confidence scores, and class IDs.
  • Step 2. Filtering & NMS: Applying Non-Maximum Suppression to remove redundant overlapping detections and filtering results based on user-defined confidence thresholds.
  • Step 3. Specialized Extraction
    : Pose: Extracting x, y coordinates and visibility scores for keypoint skeletons.
    : Segmentation: Decoding segmentation logits into per-pixel masks or class color maps.
  • Step 4. Hardware Adaptation: Finalizing and scaling coordinates for models that use the PPU to handle the initial stages of post-processing.

Implementation Examples

The principles above are applied across various model families as follows

  • yolov5_postprocess: Decodes YOLOv5 detection heads, runs NMS, and returns standard bounding boxes, scores, and class IDs.
  • yolov5pose_postprocess: In addition to boxes and scores, it extracts per-person keypoints and their corresponding confidence levels for skeletal mapping.
  • deeplabv3_postprocess: Converts segmentation logits into high-resolution per-pixel class labels or visual color maps.
  • *_ppu_postprocess: Designed for models compiled with PPU support. These modules receive data that has already been partially processed by the NPU, adapting and finalizing the outputs for the host CPU.

Directory Structure

The libraries are organized by model architecture. Modules appended with _ppu are specialized for models where partial post-processing is offloaded to the DEEPX PPU (Post-Processing Unit).

Module Components

Each subdirectory follows a standardized pattern

  • *_postprocess.h: Defines the class interface (e.g., YOLOv5PostProcess) and the result structures (e.g., YOLOv5Result).
  • *_postprocess.cpp: Implementation of decoding algorithms and mathematical filters.
  • CMakeLists.txt: Build configuration to compile the module into a standalone shared library.
src/postprocess/
├── CMakeLists.txt
├── README.md
├── centerpose/
├── classification/
├── damoyolo/
├── deeplabv3/
├── depth/
├── dncnn/
├── efficientdet/
├── embedding/
├── espcn/
├── face3d/
├── hand_landmark/
├── nanodet/
├── obb/
├── retinaface/
├── scrfd/
├── scrfd_ppu/
├── semantic_seg/
├── ssd/
├── ulfgfd/
├── yolact/
├── yolov5/
├── yolov5_ppu/
├── yolov5face/
├── yolov5pose/
├── yolov5pose_ppu/
├── yolov5seg/
├── yolov7/
├── yolov7_ppu/
├── yolov8/
├── yolov8_ppu/
├── yolov8pose/
├── yolov8seg/
├── yolov9/
├── yolov10/
├── yolov11/
├── yolov12/
├── yolov26/
├── yolox/
├── yolox_ppu/
├── yolov3tiny_ppu/
└── zero_dce/

Cross-Language Integration

Usage Methods

The SDK is designed so that C++ and Python developers utilize the same underlying engine, ensuring a seamless transition from prototyping to production.

Method A. C++ Usage

Include the header and instantiate the class directly within your inference loop.

#include "yolov5_postprocess.h"

auto post_processor = YOLOv5PostProcess(conf_threshold, nms_threshold);
auto final_results = post_processor.postprocess(npu_output_tensors);

Method B. Python Usage

Import the pybind11 wrapper via the dx_postprocess module to access the same C++ performance.

from dx_postprocess import YOLOv5PostProcess

post_processor = YOLOv5PostProcess(conf_threshold, nms_threshold)
final_results = post_processor.postprocess(npu_output_tensors)

Build Configuration

Compilation Guide

Post-processing libraries are compiled automatically during the main SDK build process.

# Execute from the dx_app/ root directory
./build.sh

The resulting shared libraries and headers are staged in the project build output directories and are then used by the C++ examples and Python binding build flow.