# 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 ` : ONNX model filename (relative to executable directory) - `-c, --config ` : JSON configuration filename (relative to executable directory) ### Optional Arguments - `-i, --input_image ` : Input image file (default: `input_image.png`) - `-o, --output_image ` : Output image file (default: `output_image.png`) - `-k, --cache_key ` : Cache key for VitisAI EP (default: empty) - `-d, --cache_dir ` : Cache directory for VitisAI EP (default: empty) - `-x, --xclbin ` : 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)