|
--- |
|
license: apache-2.0 |
|
datasets: |
|
- Set5 |
|
- Div2K |
|
language: |
|
- en |
|
tags: |
|
- RyzenAI |
|
- PAN |
|
- Pytorch |
|
- Super Resolution |
|
- Vision |
|
pipeline_tag: image-to-image |
|
--- |
|
|
|
## Model description |
|
|
|
PAN is an lightwight image super-resolution method with pixel pttention. It was introduced in the paper [Efficient Image Super-Resolution Using Pixel Attention](https://arxiv.org/abs/2010.01073) by Hengyuan Zhao et al. and first released in [this repository](https://github.com/zhaohengyuan1/PAN). |
|
|
|
We changed the negative slope of the leaky ReLU of the original model and replaced the sigmoid activation with hard sigmoid to make the model compatible with [AMD Ryzen AI](https://onnxruntime.ai/docs/execution-providers/Vitis-AI-ExecutionProvider.html). We loaded the published model parameters and fine-tuned them on the DIV2K dataset. |
|
|
|
|
|
## Intended uses & limitations |
|
|
|
You can use the raw model for super resolution. See the [model hub](https://huggingface.co/models?search=amd/pan) to look for all available PAN models. |
|
|
|
|
|
## How to use |
|
|
|
### Installation |
|
|
|
Follow [Ryzen AI Installation](https://ryzenai.docs.amd.com/en/latest/inst.html) to prepare the environment for Ryzen AI. |
|
Run the following script to install pre-requisites for this model. |
|
```bash |
|
pip install -r requirements.txt |
|
``` |
|
|
|
|
|
### Data Preparation (optional: for accuracy evaluation) |
|
|
|
1. Download the benchmark(https://cv.snu.ac.kr/research/EDSR/benchmark.tar) dataset. |
|
3. Unzip the dataset and put it under the project folder. Organize the dataset directory as follows: |
|
```Plain |
|
PAN |
|
βββ dataset |
|
βββ benchmark |
|
βββ Set5 |
|
βββ HR |
|
| βββ baby.png |
|
| βββ ... |
|
βββ LR_bicubic |
|
βββX2 |
|
βββbabyx2.png |
|
βββ ... |
|
βββ Set14 |
|
βββ ... |
|
``` |
|
|
|
### Test & Evaluation |
|
|
|
- Code snippet from [`infer_onnx.py`](infer_onnx.py) on how to use |
|
```python |
|
parser = argparse.ArgumentParser(description='PAN SR') |
|
parser.add_argument('--onnx_path', |
|
type=str, |
|
default='PAN_int8.onnx', |
|
help='Onnx path') |
|
parser.add_argument('--image_path', |
|
type=str, |
|
default='test_data/test.png', |
|
help='Path to your input image.') |
|
parser.add_argument('--output_path', |
|
type=str, |
|
default='test_data/sr.png', |
|
help='Path to your output image.') |
|
parser.add_argument('--provider_config', |
|
type=str, |
|
default="vaip_config.json", |
|
help="Path of the config file for seting provider_options.") |
|
parser.add_argument('--ipu', action='store_true', help='Use Ipu for interence.') |
|
|
|
args = parser.parse_args() |
|
|
|
onnx_file_name = args.onnx_path |
|
image_path = args.image_path |
|
output_path = args.output_path |
|
|
|
if args.ipu: |
|
providers = ["VitisAIExecutionProvider"] |
|
provider_options = [{"config_file": args.provider_config}] |
|
else: |
|
providers = ['CPUExecutionProvider'] |
|
provider_options = None |
|
ort_session = onnxruntime.InferenceSession(onnx_file_name, providers=providers, provider_options=provider_options) |
|
|
|
lr = cv2.imread(image_path)[np.newaxis,:,:,:].transpose((0,3,1,2)).astype(np.float32) |
|
sr = tiling_inference(ort_session, lr, 8, (56, 56)) |
|
sr = np.clip(sr, 0, 255) |
|
sr = sr.squeeze().transpose((1,2,0)).astype(np.uint8) |
|
sr = cv2.imwrite(output_path, sr) |
|
``` |
|
|
|
- Run inference for a single image |
|
```python |
|
python infer_onnx.py --onnx_path PAN_int8.onnx --image_path /Path/To/Your/Image --ipu --provider_config Path\To\vaip_config.json |
|
``` |
|
|
|
- Test accuracy of the quantized model |
|
```python |
|
python eval_onnx.py --onnx_path PAN_int8.onnx --data_test Set5 --ipu --provider_config Path\To\vaip_config.json |
|
``` |
|
|
|
Note: **vaip_config.json** is located at the setup package of Ryzen AI (refer to [Installation](https://huggingface.co/amd/yolox-s#installation)) |
|
|
|
### Performance |
|
|
|
| Method | Scale | Flops | Set5 | |
|
|------------|-------|-------|--------------| |
|
|PAN (float) |X2 |141G |38.00 / 0.961| |
|
|PAN_amd (float) |X2 |141G |37.859 / 0.960| |
|
|PAN_amd (int8) |X2 |141G |37.18 / 0.952| |
|
- Note: the Flops is calculated with the output resolution is 360x640 |
|
|
|
```bibtex |
|
@inproceedings{zhao2020efficient, |
|
title={Efficient image super-resolution using pixel attention}, |
|
author={Zhao, Hengyuan and Kong, Xiangtao and He, Jingwen and Qiao, Yu and Dong, Chao}, |
|
booktitle={European Conference on Computer Vision}, |
|
pages={56--72}, |
|
year={2020}, |
|
organization={Springer} |
|
} |
|
``` |