| # ESRGAN Inference (C++) |
|
|
| A C++ command-line tool for running ESRGAN (Enhanced Super-Resolution Generative Adversarial Networks) inference using ONNX Runtime with support for both CPU and AMD NPU (Neural Processing Unit) execution via VitisAI Execution Provider. |
|
|
| ## Overview |
|
|
| This tool performs image super-resolution using pre-trained ESRGAN models, taking low-resolution images as input and producing high-resolution upscaled outputs. It supports execution on both CPU and AMD Ryzen AI NPUs for accelerated inference. |
|
|
| ## Prerequisites |
|
|
| ### Required Software |
| - **Windows 10/11** (x64 architecture) |
| - **Visual Studio 2019/2022** with C++17 support |
| - **CMake 3.5** or higher |
| - **AMD Ryzen AI SDK 1.4** (for NPU support) |
| - **OpenCV 4.12** (included in project at `./opencv/build`) |
|
|
| ### Required Files |
| - **ONNX Model**: ESRGAN model file (`esrgan_fp32_qdq.onnx`) |
| - **Config JSON**: VitisAI configuration file (`esrgan_config.json`) |
| - **Runtime DLLs**: Ryzen AI runtime libraries (automatically copied from Ryzen AI SDK during build) |
| - **XCLBIN Files**: NPU binary files (automatically copied from Ryzen AI SDK during build) |
| - **OpenCV Dependencies**: OpenCV DLLs (included in `opencv/build/x64/vc16/bin/`) |
|
|
| ### Hardware Requirements |
| - For NPU acceleration: AMD Ryzen AI compatible processor (Phoenix 0x1503 or Strix 0x17F0) |
| - Minimum 8GB RAM recommended |
| - Sufficient disk space for models and output images |
|
|
| ## Building the Project |
|
|
| The build process automatically copies all required dependencies to the output directory, making the executable completely self-contained for distribution. |
|
|
| ### Prerequisites for Building |
| - Ryzen AI SDK 1.4 must be installed and the `RYZEN_AI_INSTALLATION_PATH` environment variable set |
| - Visual Studio 2019/2022 with C++17 support |
| - CMake 3.5 or higher |
|
|
| ### Option 1: Using the Build Script (Recommended) |
| 1. Set the Ryzen AI SDK environment variable: |
| ```cmd |
| set RYZEN_AI_INSTALLATION_PATH=C:\Program Files\RyzenAI\1.4.0 |
| ``` |
|
|
| 2. Run the build script: |
| ```cmd |
| compile.bat |
| ``` |
|
|
| ### Option 2: Manual Build |
| 1. Set the environment variable: |
| ```cmd |
| set RYZEN_AI_INSTALLATION_PATH=C:\Program Files\RyzenAI\1.4.0 |
| ``` |
|
|
| 2. Generate build files with CMake: |
| ```cmd |
| cmake -DCMAKE_CONFIGURATION_TYPES=Release -A x64 -T host=x64 -B build -S . -G "Visual Studio 17 2022" |
| ``` |
|
|
| 3. Build the project: |
| ```cmd |
| cmake --build .\build --config Release |
| ``` |
|
|
| ## Files Automatically Copied During Build |
|
|
| The CMakeLists.txt configuration automatically copies the following files to `build/Release/`, creating a fully self-contained executable directory: |
|
|
| ### Model and Configuration Files |
| - **esrgan_config.json** - VitisAI configuration file |
| - **esrgan_fp32_qdq.onnx** - ONNX model file |
| |
| ### NPU Binary Files |
| - **xclbins/** directory structure containing NPU binaries for different device types: |
| - Phoenix NPUs (device ID: 0x1503) |
| - Strix NPUs (device ID: 0x17F0) |
| - Copied from: `${RYZEN_AI_INSTALLATION_PATH}/voe-4.0-win_amd64/xclbins/` |
| |
| ### Runtime Dependencies |
| - **OpenCV DLLs** from `opencv/build/x64/vc16/bin/` (including `opencv_world412.dll`) |
| - **Ryzen AI DLLs** from local `RAI_dll/` directory: |
| - `onnxruntime.dll` - Core ONNX Runtime engine |
| - `onnxruntime_providers_vitisai.dll` - VitisAI execution provider |
| - `onnxruntime_vitisai_ep.dll` - VitisAI EP interface layer |
| - `onnxruntime_vitis_ai_custom_ops.dll` - Custom operations support |
| - `DirectML.dll` - DirectML runtime support |
| - `xclbin.dll` - XCLBIN file handling utilities |
| - `transaction.dll` - Transaction management |
| - `dyn_dispatch_core.dll` - Dynamic dispatch core |
| - **VitisAI Runtime** files from `${RYZEN_AI_INSTALLATION_PATH}/deployment/voe` |
|
|
|
|
| ## Project Structure |
|
|
| ### Source Files |
| ``` |
| src/ |
| βββ main.cpp # Main application logic |
| βββ npu_util.cpp # NPU utility functions |
| βββ npu_util.h # NPU utility headers |
| βββ cxxopts.hpp # Command-line argument parsing (header-only library) |
| ``` |
|
|
| ### Project Root |
| ``` |
| ./ |
| βββ bird_input.png # Sample input image |
| βββ CMakeLists.txt # Build configuration |
| βββ compile.bat # Build script for Windows |
| βββ esrgan_config.json # VitisAI EP configuration |
| βββ esrgan_fp32_qdq.onnx # ONNX model file |
| βββ esrgan_cache/ # VitisAI compilation cache (generated after first run) |
| βββ opencv/ # Local OpenCV installation |
| β βββ build/ # Pre-built OpenCV binaries and headers |
| βββ src/ # Source code directory |
| ``` |
|
|
| ### After Build (`build/Release/`) |
| ``` |
| build/Release/ |
| βββ esrgan_inference.exe # Main executable |
| βββ esrgan_fp32_qdq.onnx # ONNX model (copied from root) |
| βββ esrgan_config.json # Configuration (copied from root) |
| βββ opencv_world412.dll # OpenCV runtime (from opencv/build/x64/vc16/bin/) |
| βββ onnxruntime.dll # ONNX Runtime core (from RAI_dll/) |
| βββ onnxruntime_providers_vitisai.dll # VitisAI provider (from RAI_dll/) |
| βββ onnxruntime_vitisai_ep.dll # VitisAI EP interface (from RAI_dll/) |
| βββ onnxruntime_vitis_ai_custom_ops.dll # Custom ops support (from RAI_dll/) |
| βββ DirectML.dll # DirectML runtime (from RAI_dll/) |
| βββ xclbin.dll # XCLBIN utilities (from RAI_dll/) |
| βββ transaction.dll # Transaction management (from RAI_dll/) |
| βββ dyn_dispatch_core.dll # Dynamic dispatch (from RAI_dll/) |
| βββ [additional VitisAI files] # Other runtime components from SDK deployment |
| βββ xclbins/ # NPU binaries (from Ryzen AI SDK) |
| βββ phoenix/ # Phoenix NPU binaries (device ID: 0x1503) |
| βββ strix/ # Strix NPU binaries (device ID: 0x17F0) |
| ``` |
|
|
| **Note**: The build output directory is completely self-contained and portable. It can be copied to other compatible systems and run without additional installation requirements. |
|
|
| ## Usage |
|
|
| ### Command-Line Syntax |
| ```cmd |
| esrgan_inference.exe [OPTIONS] |
| ``` |
|
|
| ### Required Arguments |
| - `-m, --model <file>` : ONNX model filename (relative to executable directory) |
| - `-c, --config <file>` : JSON configuration filename (relative to executable directory) |
|
|
| ### Optional Arguments |
| - `-i, --input_image <file>` : Input image file (default: `input_image.png`) |
| - `-o, --output_image <file>` : Output image file (default: `output_image.png`) |
| - `-k, --cache_key <string>` : Cache key for VitisAI EP (default: empty) |
| - `-d, --cache_dir <string>` : Cache directory for VitisAI EP (default: empty) |
| - `-x, --xclbin <file>` : XCLBIN filename for NPU (default: auto-selected) |
| - `-h, --help` : Show help message |
|
|
| ### Example Usage |
|
|
| ```cmd |
| esrgan_inference.exe ^ |
| -m esrgan_fp32_qdq.onnx ^ |
| -c esrgan_config.json ^ |
| -i ..\..\bird_input.png ^ |
| -o bird_output.png ^ |
| -d ..\..\esrgan_cache ^ |
| -k esrgan_cache |
| ``` |
|
|
| This example demonstrates: |
| - Using model and config files from the build directory (automatically copied) |
| - Relative paths for input images (from project root) |
| - Using the existing VitisAI cache directory for faster subsequent runs |
|
|
| **Note**: The `esrgan_cache/` directory is created automatically during the first NPU inference run. It contains compiled model artifacts that significantly speed up subsequent runs. You can point to this existing cache using the `-d` and `-k` parameters. |
|
|
|
|
| ## Console Output Example |
|
|
| ``` |
| ------------------------------------------------------- |
| Configuration Parameters: |
| ------------------------------------------------------- |
| Executable Directory: C:\Users\user\Desktop\QuickTest\ESRGAN_Inference_cpp\build\Release |
| Model Path : C:\Users\user\Desktop\QuickTest\ESRGAN_Inference_cpp\build\Release\esrgan_fp32_qdq.onnx |
| Config JSON Path : C:\Users\user\Desktop\QuickTest\ESRGAN_Inference_cpp\build\Release\esrgan_config.json |
| Cache Key : esrgan_cache |
| Cache Directory : ..\..\ |
| Input image : ..\..\bird_input.png |
| Output image : bird_output.png |
| ------------------------------------------------------- |
|
|
| [INFO] Model input name: input |
| [INFO] Input data type: 1 |
| [INFO] Input dims: [ 1 250 250 3 ] |
| [INFO] Model output name: output |
| [INFO] Output data type: 1 |
| [INFO] Output dims: [ 1 1000 1000 3 ] |
| [INFO] Running inference... |
|
|
| ------------------------------------------------------- |
| Performing compatibility check for VitisAI EP 1.4 |
| ------------------------------------------------------- |
| - NPU Device ID : 0x1503 |
| - NPU Device Name : AMD IPU Device |
| - NPU Driver Version: 32.0.203.257 |
| Environment compatible for VitisAI EP |
|
|
| [INFO] Writing upscaled image to: bird_output.png |
| [INFO] Done. |
| ``` |
| |
| |
| MIT License - See source files for full license text. |
| |
| ## Dependencies and Attribution |
| |
| This project includes and uses the following components: |
| |
| - **AMD Ryzen AI SDK 1.4** - NPU acceleration support |
| - **ONNX Runtime** - Model inference engine (runtime DLLs included in `RAI_dll/`) |
| - **OpenCV 4.12** - Image processing (pre-built binaries included in `opencv/build/`) |
| - **cxxopts** - Command-line argument parsing (header-only, included in `src/`) |
|
|
| **Note**: This project is largely self-contained. The required ONNX Runtime and VitisAI provider DLLs are included in the `RAI_dll/` directory, and OpenCV binaries are included in the `opencv/` directory. The only external dependency is the Ryzen AI SDK installation for XCLBIN files and additional runtime components. |
|
|
| ## Source Code References |
|
|
| - **Main Application**: [`src/main.cpp`](src/main.cpp) |
| - **NPU Utilities**: [`src/npu_util.cpp`](src/npu_util.cpp), [`src/npu_util.h`](src/npu_util.h) |
| - **Command-Line Parsing**: [`src/cxxopts.hpp`](src/cxxopts.hpp) |
| - **Build Configuration**: [`CMakeLists.txt`](CMakeLists.txt) |
| - **Build Script**: [`compile.bat`](compile.bat) |