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_PATHenvironment variable set
- Visual Studio 2019/2022 with C++17 support
- CMake 3.5 or higher
Option 1: Using the Build Script (Recommended)
- Set the Ryzen AI SDK environment variable: - set RYZEN_AI_INSTALLATION_PATH=C:\Program Files\RyzenAI\1.4.0
- Run the build script: - compile.bat
Option 2: Manual Build
- Set the environment variable: - set RYZEN_AI_INSTALLATION_PATH=C:\Program Files\RyzenAI\1.4.0
- Generate build files with CMake: - cmake -DCMAKE_CONFIGURATION_TYPES=Release -A x64 -T host=x64 -B build -S . -G "Visual Studio 17 2022"
- Build the project: - 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/(includingopencv_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
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
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
- NPU Utilities: src/npu_util.cpp,src/npu_util.h
- Command-Line Parsing: src/cxxopts.hpp
- Build Configuration: CMakeLists.txt
- Build Script: compile.bat
