Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bfa4678bef | ||
|
|
68f9f2445e | ||
|
|
7840a3d16a | ||
|
|
b28958cdf2 | ||
|
|
667e34e7ca | ||
|
|
978def19a6 | ||
|
|
a7153c7fce | ||
|
|
00116244cb | ||
|
|
571b89257a | ||
|
|
bed7df7d99 | ||
|
|
fb3ff055e4 | ||
|
|
9ef97853f9 | ||
|
|
58fea8db69 | ||
|
|
3c6cf5290e | ||
|
|
64ad194dda | ||
|
|
5745599813 | ||
|
|
3ce0c97e89 |
34
.github/workflows/no-response.yml
vendored
Normal file
34
.github/workflows/no-response.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: No Response
|
||||||
|
|
||||||
|
# Modified from: https://raw.githubusercontent.com/github/docs/main/.github/workflows/no-response.yaml
|
||||||
|
|
||||||
|
# **What it does**: Closes issues that don't have enough information to be
|
||||||
|
# actionable.
|
||||||
|
# **Why we have it**: To remove the need for maintainers to remember to check
|
||||||
|
# back on issues periodically to see if contributors have
|
||||||
|
# responded.
|
||||||
|
# **Who does it impact**: Everyone that works on docs or docs-internal.
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
schedule:
|
||||||
|
# Schedule for five minutes after the hour every hour
|
||||||
|
- cron: '5 * * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
noResponse:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: lee-dohm/no-response@v0.5.0
|
||||||
|
with:
|
||||||
|
token: ${{ github.token }}
|
||||||
|
closeComment: >
|
||||||
|
This issue has been automatically closed because there has been no response
|
||||||
|
to our request for more information from the original author. With only the
|
||||||
|
information that is currently in the issue, we don't have enough information
|
||||||
|
to take action. Please reach out if you have or find the answers we need so
|
||||||
|
that we can investigate further.
|
||||||
|
If you still have questions, please improve your description and re-open it.
|
||||||
|
Thanks :-)
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,9 +5,9 @@ results/*
|
|||||||
tb_logger/*
|
tb_logger/*
|
||||||
wandb/*
|
wandb/*
|
||||||
tmp/*
|
tmp/*
|
||||||
|
realesrgan/weights/*
|
||||||
|
|
||||||
version.py
|
version.py
|
||||||
.vscode
|
|
||||||
|
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|||||||
19
.vscode/settings.json
vendored
Normal file
19
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"files.trimTrailingWhitespace": true,
|
||||||
|
"editor.wordWrap": "on",
|
||||||
|
"editor.rulers": [
|
||||||
|
80,
|
||||||
|
120
|
||||||
|
],
|
||||||
|
"editor.renderWhitespace": "all",
|
||||||
|
"editor.renderControlCharacters": true,
|
||||||
|
"python.formatting.provider": "yapf",
|
||||||
|
"python.formatting.yapfArgs": [
|
||||||
|
"--style",
|
||||||
|
"{BASED_ON_STYLE = pep8, BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF = true, SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN = true, COLUMN_LIMIT = 120}"
|
||||||
|
],
|
||||||
|
"python.linting.flake8Enabled": true,
|
||||||
|
"python.linting.flake8Args": [
|
||||||
|
"max-line-length=120"
|
||||||
|
],
|
||||||
|
}
|
||||||
9
FAQ.md
Normal file
9
FAQ.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# FAQ
|
||||||
|
|
||||||
|
1. **What is the difference of `--netscale` and `outscale`?**
|
||||||
|
|
||||||
|
A: TODO.
|
||||||
|
|
||||||
|
1. **How to select models?**
|
||||||
|
|
||||||
|
A: TODO.
|
||||||
25
README.md
25
README.md
@@ -1,21 +1,32 @@
|
|||||||
# Real-ESRGAN
|
# Real-ESRGAN
|
||||||
|
|
||||||
[](https://github.com/xinntao/Real-ESRGAN/releases)
|
[](https://github.com/xinntao/Real-ESRGAN/releases)
|
||||||
|
[](https://pypi.org/project/realesrgan/)
|
||||||
[](https://github.com/xinntao/Real-ESRGAN/issues)
|
[](https://github.com/xinntao/Real-ESRGAN/issues)
|
||||||
[](https://github.com/xinntao/Real-ESRGAN/blob/master/LICENSE)
|
[](https://github.com/xinntao/Real-ESRGAN/blob/master/LICENSE)
|
||||||
[](https://github.com/xinntao/Real-ESRGAN/blob/master/.github/workflows/pylint.yml)
|
[](https://github.com/xinntao/Real-ESRGAN/blob/master/.github/workflows/pylint.yml)
|
||||||
|
[](https://github.com/xinntao/Real-ESRGAN/blob/master/.github/workflows/publish-pip.yml)
|
||||||
|
|
||||||
1. [Colab Demo](https://colab.research.google.com/drive/1k2Zod6kSHEvraybHl50Lys0LerhyTMCo?usp=sharing) for Real-ESRGAN <a href="https://colab.research.google.com/drive/1k2Zod6kSHEvraybHl50Lys0LerhyTMCo?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="google colab logo"></a>.
|
1. [Colab Demo](https://colab.research.google.com/drive/1k2Zod6kSHEvraybHl50Lys0LerhyTMCo?usp=sharing) for Real-ESRGAN <a href="https://colab.research.google.com/drive/1k2Zod6kSHEvraybHl50Lys0LerhyTMCo?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="google colab logo"></a>.
|
||||||
2. [Portable Windows/Linux/MacOS executable files for Intel/AMD/Nvidia GPU](https://github.com/xinntao/Real-ESRGAN/releases). You can find more information [here](#Portable-executable-files).
|
2. Portable [Windows](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.2/realesrgan-ncnn-vulkan-20210801-windows.zip) / [Linux](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.2/realesrgan-ncnn-vulkan-20210801-ubuntu.zip) / [MacOS](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.2/realesrgan-ncnn-vulkan-20210801-macos.zip) **executable files for Intel/AMD/Nvidia GPU**. You can find more information [here](#Portable-executable-files).
|
||||||
|
|
||||||
Real-ESRGAN aims at developing **Practical Algorithms for General Image Restoration**.<br>
|
Real-ESRGAN aims at developing **Practical Algorithms for General Image Restoration**.<br>
|
||||||
We extend the powerful ESRGAN to a practical restoration application (namely, Real-ESRGAN), which is trained with pure synthetic data.
|
We extend the powerful ESRGAN to a practical restoration application (namely, Real-ESRGAN), which is trained with pure synthetic data.
|
||||||
|
|
||||||
:triangular_flag_on_post: **Updates**
|
:question: Frequently Asked Questions can be found in [FAQ.md](FAQ.md).
|
||||||
|
|
||||||
|
:triangular_flag_on_post: **Updates**
|
||||||
|
- :white_check_mark: Integrate [GFPGAN](https://github.com/TencentARC/GFPGAN) to support **face enhancement**.
|
||||||
|
- :white_check_mark: Integrated to [Huggingface Spaces](https://huggingface.co/spaces) with [Gradio](https://github.com/gradio-app/gradio). See [Gradio Web Demo](https://huggingface.co/spaces/akhaliq/Real-ESRGAN).
|
||||||
|
- :white_check_mark: Support arbitrary scale with `--outscale` (It actually further resizes outputs with `LANCZOS4`). Add *RealESRGAN_x2plus.pth* model.
|
||||||
- :white_check_mark: [The inference code](inference_realesrgan.py) supports: 1) **tile** options; 2) images with **alpha channel**; 3) **gray** images; 4) **16-bit** images.
|
- :white_check_mark: [The inference code](inference_realesrgan.py) supports: 1) **tile** options; 2) images with **alpha channel**; 3) **gray** images; 4) **16-bit** images.
|
||||||
- :white_check_mark: The training codes have been released. A detailed guide can be found in [Training.md](Training.md).
|
- :white_check_mark: The training codes have been released. A detailed guide can be found in [Training.md](Training.md).
|
||||||
|
|
||||||
|
If Real-ESRGAN is helpful in your photos/projects, please help to :star: this repo. Thanks:blush: <br>
|
||||||
|
Other recommended projects:   :arrow_forward: [GFPGAN](https://github.com/TencentARC/GFPGAN)   :arrow_forward: [BasicSR](https://github.com/xinntao/BasicSR)   :arrow_forward: [facexlib](https://github.com/xinntao/facexlib)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### :book: Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data
|
### :book: Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data
|
||||||
|
|
||||||
> [[Paper](https://arxiv.org/abs/2107.10833)]   [Project Page]   [Demo] <br>
|
> [[Paper](https://arxiv.org/abs/2107.10833)]   [Project Page]   [Demo] <br>
|
||||||
@@ -41,7 +52,7 @@ Here is a TODO list in the near future:
|
|||||||
|
|
||||||
- [ ] optimize for human faces
|
- [ ] optimize for human faces
|
||||||
- [ ] optimize for texts
|
- [ ] optimize for texts
|
||||||
- [ ] optimize for animation images
|
- [ ] optimize for anime images [in progress]
|
||||||
- [ ] support more scales
|
- [ ] support more scales
|
||||||
- [ ] support controllable restoration strength
|
- [ ] support controllable restoration strength
|
||||||
|
|
||||||
@@ -52,7 +63,7 @@ If you have some images that Real-ESRGAN could not well restored, please also op
|
|||||||
|
|
||||||
### Portable executable files
|
### Portable executable files
|
||||||
|
|
||||||
You can download **Windows/Linux/MacOS executable files for Intel/AMD/Nvidia GPU** from https://github.com/xinntao/Real-ESRGAN/releases
|
You can download [Windows](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.2/realesrgan-ncnn-vulkan-20210801-windows.zip) / [Linux](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.2/realesrgan-ncnn-vulkan-20210801-ubuntu.zip) / [MacOS](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.2/realesrgan-ncnn-vulkan-20210801-macos.zip) **executable files for Intel/AMD/Nvidia GPU**.
|
||||||
|
|
||||||
This executable file is **portable** and includes all the binaries and models required. No CUDA or PyTorch environment is needed.<br>
|
This executable file is **portable** and includes all the binaries and models required. No CUDA or PyTorch environment is needed.<br>
|
||||||
|
|
||||||
@@ -96,6 +107,9 @@ This executable file is based on the wonderful [Tencent/ncnn](https://github.com
|
|||||||
# Install basicsr - https://github.com/xinntao/BasicSR
|
# Install basicsr - https://github.com/xinntao/BasicSR
|
||||||
# We use BasicSR for both training and inference
|
# We use BasicSR for both training and inference
|
||||||
pip install basicsr
|
pip install basicsr
|
||||||
|
# facexlib and gfpgan are for face enhancement
|
||||||
|
pip install facexlib
|
||||||
|
pip install gfpgan
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
python setup.py develop
|
python setup.py develop
|
||||||
```
|
```
|
||||||
@@ -113,7 +127,7 @@ wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_
|
|||||||
Inference!
|
Inference!
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python inference_realesrgan.py --model_path experiments/pretrained_models/RealESRGAN_x4plus.pth --input inputs
|
python inference_realesrgan.py --model_path experiments/pretrained_models/RealESRGAN_x4plus.pth --input inputs --face_enhance
|
||||||
```
|
```
|
||||||
|
|
||||||
Results are in the `results` folder
|
Results are in the `results` folder
|
||||||
@@ -122,6 +136,7 @@ Results are in the `results` folder
|
|||||||
|
|
||||||
- [RealESRGAN-x4plus](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth)
|
- [RealESRGAN-x4plus](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth)
|
||||||
- [RealESRNet-x4plus](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.1/RealESRNet_x4plus.pth)
|
- [RealESRNet-x4plus](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.1/RealESRNet_x4plus.pth)
|
||||||
|
- [RealESRGAN-x2plus](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.1/RealESRGAN_x2plus.pth)
|
||||||
- [official ESRGAN-x4](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.1/ESRGAN_SRx4_DF2KOST_official-ff704c30.pth)
|
- [official ESRGAN-x4](https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.1/ESRGAN_SRx4_DF2KOST_official-ff704c30.pth)
|
||||||
|
|
||||||
## :computer: Training
|
## :computer: Training
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# :computer: How to Train Real-ESRGAN
|
# :computer: How to Train Real-ESRGAN
|
||||||
|
|
||||||
The training codes have been released. <br>
|
The training codes have been released. <br>
|
||||||
Note that the codes have a lot of refactoring. So there may be some bugs/performance drops. Welcome to report issues and I will also retrain the models.
|
Note that the codes have a lot of refactoring. So there may be some bugs/performance drops. Welcome to report bugs/issues.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
|||||||
BIN
assets/teaser-text.png
Normal file
BIN
assets/teaser-text.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 546 KiB |
@@ -15,11 +15,13 @@ def main():
|
|||||||
default='experiments/pretrained_models/RealESRGAN_x4plus.pth',
|
default='experiments/pretrained_models/RealESRGAN_x4plus.pth',
|
||||||
help='Path to the pre-trained model')
|
help='Path to the pre-trained model')
|
||||||
parser.add_argument('--output', type=str, default='results', help='Output folder')
|
parser.add_argument('--output', type=str, default='results', help='Output folder')
|
||||||
parser.add_argument('--scale', type=int, default=4, help='Upsample scale factor')
|
parser.add_argument('--netscale', type=int, default=4, help='Upsample scale factor of the network')
|
||||||
|
parser.add_argument('--outscale', type=float, default=4, help='The final upsampling scale of the image')
|
||||||
parser.add_argument('--suffix', type=str, default='out', help='Suffix of the restored image')
|
parser.add_argument('--suffix', type=str, default='out', help='Suffix of the restored image')
|
||||||
parser.add_argument('--tile', type=int, default=0, help='Tile size, 0 for no tile during testing')
|
parser.add_argument('--tile', type=int, default=800, help='Tile size, 0 for no tile during testing')
|
||||||
parser.add_argument('--tile_pad', type=int, default=10, help='Tile padding')
|
parser.add_argument('--tile_pad', type=int, default=10, help='Tile padding')
|
||||||
parser.add_argument('--pre_pad', type=int, default=0, help='Pre padding size at each border')
|
parser.add_argument('--pre_pad', type=int, default=0, help='Pre padding size at each border')
|
||||||
|
parser.add_argument('--face_enhance', action='store_true', help='Use GFPGAN to enhance face')
|
||||||
parser.add_argument('--half', action='store_true', help='Use half precision during inference')
|
parser.add_argument('--half', action='store_true', help='Use half precision during inference')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--alpha_upsampler',
|
'--alpha_upsampler',
|
||||||
@@ -34,13 +36,23 @@ def main():
|
|||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
upsampler = RealESRGANer(
|
upsampler = RealESRGANer(
|
||||||
scale=args.scale,
|
scale=args.netscale,
|
||||||
model_path=args.model_path,
|
model_path=args.model_path,
|
||||||
tile=args.tile,
|
tile=args.tile,
|
||||||
tile_pad=args.tile_pad,
|
tile_pad=args.tile_pad,
|
||||||
pre_pad=args.pre_pad,
|
pre_pad=args.pre_pad,
|
||||||
half=args.half)
|
half=args.half)
|
||||||
|
|
||||||
|
if args.face_enhance:
|
||||||
|
from gfpgan import GFPGANer
|
||||||
|
face_enhancer = GFPGANer(
|
||||||
|
model_path='https://github.com/TencentARC/GFPGAN/releases/download/v0.2.0/GFPGANCleanv1-NoCE-C2.pth',
|
||||||
|
upscale=args.outscale,
|
||||||
|
arch='clean',
|
||||||
|
channel_multiplier=2,
|
||||||
|
bg_upsampler=upsampler)
|
||||||
os.makedirs(args.output, exist_ok=True)
|
os.makedirs(args.output, exist_ok=True)
|
||||||
|
|
||||||
if os.path.isfile(args.input):
|
if os.path.isfile(args.input):
|
||||||
paths = [args.input]
|
paths = [args.input]
|
||||||
else:
|
else:
|
||||||
@@ -51,15 +63,36 @@ def main():
|
|||||||
print('Testing', idx, imgname)
|
print('Testing', idx, imgname)
|
||||||
|
|
||||||
img = cv2.imread(path, cv2.IMREAD_UNCHANGED)
|
img = cv2.imread(path, cv2.IMREAD_UNCHANGED)
|
||||||
output, img_mode = upsampler.enhance(img)
|
if len(img.shape) == 3 and img.shape[2] == 4:
|
||||||
if args.ext == 'auto':
|
img_mode = 'RGBA'
|
||||||
extension = extension[1:]
|
|
||||||
else:
|
else:
|
||||||
extension = args.ext
|
img_mode = None
|
||||||
if img_mode == 'RGBA': # RGBA images should be saved in png format
|
|
||||||
extension = 'png'
|
h, w = img.shape[0:2]
|
||||||
save_path = os.path.join(args.output, f'{imgname}_{args.suffix}.{extension}')
|
if max(h, w) > 1000 and args.netscale == 4:
|
||||||
cv2.imwrite(save_path, output)
|
import warnings
|
||||||
|
warnings.warn('The input image is large, try X2 model for better performace.')
|
||||||
|
if max(h, w) < 500 and args.netscale == 2:
|
||||||
|
import warnings
|
||||||
|
warnings.warn('The input image is small, try X4 model for better performace.')
|
||||||
|
|
||||||
|
try:
|
||||||
|
if args.face_enhance:
|
||||||
|
_, _, output = face_enhancer.enhance(img, has_aligned=False, only_center_face=False, paste_back=True)
|
||||||
|
else:
|
||||||
|
output, _ = upsampler.enhance(img, outscale=args.outscale)
|
||||||
|
except Exception as error:
|
||||||
|
print('Error', error)
|
||||||
|
print('If you encounter CUDA out of memory, try to set --tile with a smaller number.')
|
||||||
|
else:
|
||||||
|
if args.ext == 'auto':
|
||||||
|
extension = extension[1:]
|
||||||
|
else:
|
||||||
|
extension = args.ext
|
||||||
|
if img_mode == 'RGBA': # RGBA images should be saved in png format
|
||||||
|
extension = 'png'
|
||||||
|
save_path = os.path.join(args.output, f'{imgname}_{args.suffix}.{extension}')
|
||||||
|
cv2.imwrite(save_path, output)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
189
options/finetune_realesrgan_x4plus.yml
Normal file
189
options/finetune_realesrgan_x4plus.yml
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
# general settings
|
||||||
|
name: finetune_RealESRGANx4plus_400k_B12G4
|
||||||
|
model_type: RealESRGANModel
|
||||||
|
scale: 4
|
||||||
|
num_gpu: 4
|
||||||
|
manual_seed: 0
|
||||||
|
|
||||||
|
# ----------------- options for synthesizing training data in RealESRGANModel ----------------- #
|
||||||
|
# USM the ground-truth
|
||||||
|
l1_gt_usm: True
|
||||||
|
percep_gt_usm: True
|
||||||
|
gan_gt_usm: False
|
||||||
|
|
||||||
|
# the first degradation process
|
||||||
|
resize_prob: [0.2, 0.7, 0.1] # up, down, keep
|
||||||
|
resize_range: [0.15, 1.5]
|
||||||
|
gaussian_noise_prob: 0.5
|
||||||
|
noise_range: [1, 30]
|
||||||
|
poisson_scale_range: [0.05, 3]
|
||||||
|
gray_noise_prob: 0.4
|
||||||
|
jpeg_range: [30, 95]
|
||||||
|
|
||||||
|
# the second degradation process
|
||||||
|
second_blur_prob: 0.8
|
||||||
|
resize_prob2: [0.3, 0.4, 0.3] # up, down, keep
|
||||||
|
resize_range2: [0.3, 1.2]
|
||||||
|
gaussian_noise_prob2: 0.5
|
||||||
|
noise_range2: [1, 25]
|
||||||
|
poisson_scale_range2: [0.05, 2.5]
|
||||||
|
gray_noise_prob2: 0.4
|
||||||
|
jpeg_range2: [30, 95]
|
||||||
|
|
||||||
|
gt_size: 256
|
||||||
|
queue_size: 180
|
||||||
|
|
||||||
|
# dataset and data loader settings
|
||||||
|
datasets:
|
||||||
|
train:
|
||||||
|
name: DF2K+OST
|
||||||
|
type: RealESRGANDataset
|
||||||
|
dataroot_gt: datasets/DF2K
|
||||||
|
meta_info: datasets/DF2K/meta_info/meta_info_DF2Kmultiscale+OST_sub.txt
|
||||||
|
io_backend:
|
||||||
|
type: disk
|
||||||
|
|
||||||
|
blur_kernel_size: 21
|
||||||
|
kernel_list: ['iso', 'aniso', 'generalized_iso', 'generalized_aniso', 'plateau_iso', 'plateau_aniso']
|
||||||
|
kernel_prob: [0.45, 0.25, 0.12, 0.03, 0.12, 0.03]
|
||||||
|
sinc_prob: 0.1
|
||||||
|
blur_sigma: [0.2, 3]
|
||||||
|
betag_range: [0.5, 4]
|
||||||
|
betap_range: [1, 2]
|
||||||
|
|
||||||
|
blur_kernel_size2: 21
|
||||||
|
kernel_list2: ['iso', 'aniso', 'generalized_iso', 'generalized_aniso', 'plateau_iso', 'plateau_aniso']
|
||||||
|
kernel_prob2: [0.45, 0.25, 0.12, 0.03, 0.12, 0.03]
|
||||||
|
sinc_prob2: 0.1
|
||||||
|
blur_sigma2: [0.2, 1.5]
|
||||||
|
betag_range2: [0.5, 4]
|
||||||
|
betap_range2: [1, 2]
|
||||||
|
|
||||||
|
final_sinc_prob: 0.8
|
||||||
|
|
||||||
|
gt_size: 256
|
||||||
|
use_hflip: True
|
||||||
|
use_rot: False
|
||||||
|
|
||||||
|
# data loader
|
||||||
|
use_shuffle: true
|
||||||
|
num_worker_per_gpu: 5
|
||||||
|
batch_size_per_gpu: 12
|
||||||
|
dataset_enlarge_ratio: 1
|
||||||
|
prefetch_mode: ~
|
||||||
|
|
||||||
|
# Uncomment these for validation
|
||||||
|
# val:
|
||||||
|
# name: validation
|
||||||
|
# type: PairedImageDataset
|
||||||
|
# dataroot_gt: path_to_gt
|
||||||
|
# dataroot_lq: path_to_lq
|
||||||
|
# io_backend:
|
||||||
|
# type: disk
|
||||||
|
|
||||||
|
# network structures
|
||||||
|
network_g:
|
||||||
|
type: RRDBNet
|
||||||
|
num_in_ch: 3
|
||||||
|
num_out_ch: 3
|
||||||
|
num_feat: 64
|
||||||
|
num_block: 23
|
||||||
|
num_grow_ch: 32
|
||||||
|
|
||||||
|
|
||||||
|
network_d:
|
||||||
|
type: UNetDiscriminatorSN
|
||||||
|
num_in_ch: 3
|
||||||
|
num_feat: 64
|
||||||
|
skip_connection: True
|
||||||
|
|
||||||
|
# path
|
||||||
|
path:
|
||||||
|
# use the pre-trained Real-ESRNet model
|
||||||
|
pretrain_network_g: experiments/pretrained_models/RealESRNet_x4plus.pth
|
||||||
|
param_key_g: params_ema
|
||||||
|
strict_load_g: true
|
||||||
|
pretrain_network_d: experiments/pretrained_models/RealESRGAN_x4plus_netD.pth
|
||||||
|
param_key_d: params
|
||||||
|
strict_load_d: true
|
||||||
|
resume_state: ~
|
||||||
|
|
||||||
|
# training settings
|
||||||
|
train:
|
||||||
|
ema_decay: 0.999
|
||||||
|
optim_g:
|
||||||
|
type: Adam
|
||||||
|
lr: !!float 1e-4
|
||||||
|
weight_decay: 0
|
||||||
|
betas: [0.9, 0.99]
|
||||||
|
optim_d:
|
||||||
|
type: Adam
|
||||||
|
lr: !!float 1e-4
|
||||||
|
weight_decay: 0
|
||||||
|
betas: [0.9, 0.99]
|
||||||
|
|
||||||
|
scheduler:
|
||||||
|
type: MultiStepLR
|
||||||
|
milestones: [400000]
|
||||||
|
gamma: 0.5
|
||||||
|
|
||||||
|
total_iter: 400000
|
||||||
|
warmup_iter: -1 # no warm up
|
||||||
|
|
||||||
|
# losses
|
||||||
|
pixel_opt:
|
||||||
|
type: L1Loss
|
||||||
|
loss_weight: 1.0
|
||||||
|
reduction: mean
|
||||||
|
# perceptual loss (content and style losses)
|
||||||
|
perceptual_opt:
|
||||||
|
type: PerceptualLoss
|
||||||
|
layer_weights:
|
||||||
|
# before relu
|
||||||
|
'conv1_2': 0.1
|
||||||
|
'conv2_2': 0.1
|
||||||
|
'conv3_4': 1
|
||||||
|
'conv4_4': 1
|
||||||
|
'conv5_4': 1
|
||||||
|
vgg_type: vgg19
|
||||||
|
use_input_norm: true
|
||||||
|
perceptual_weight: !!float 1.0
|
||||||
|
style_weight: 0
|
||||||
|
range_norm: false
|
||||||
|
criterion: l1
|
||||||
|
# gan loss
|
||||||
|
gan_opt:
|
||||||
|
type: GANLoss
|
||||||
|
gan_type: vanilla
|
||||||
|
real_label_val: 1.0
|
||||||
|
fake_label_val: 0.0
|
||||||
|
loss_weight: !!float 1e-1
|
||||||
|
|
||||||
|
net_d_iters: 1
|
||||||
|
net_d_init_iters: 0
|
||||||
|
|
||||||
|
# Uncomment these for validation
|
||||||
|
# validation settings
|
||||||
|
# val:
|
||||||
|
# val_freq: !!float 5e3
|
||||||
|
# save_img: True
|
||||||
|
|
||||||
|
# metrics:
|
||||||
|
# psnr: # metric name, can be arbitrary
|
||||||
|
# type: calculate_psnr
|
||||||
|
# crop_border: 4
|
||||||
|
# test_y_channel: false
|
||||||
|
|
||||||
|
# logging settings
|
||||||
|
logger:
|
||||||
|
print_freq: 100
|
||||||
|
save_checkpoint_freq: !!float 5e3
|
||||||
|
use_tb_logger: true
|
||||||
|
wandb:
|
||||||
|
project: ~
|
||||||
|
resume_id: ~
|
||||||
|
|
||||||
|
# dist training settings
|
||||||
|
dist_params:
|
||||||
|
backend: nccl
|
||||||
|
port: 29500
|
||||||
187
options/train_realesrgan_x2plus.yml
Normal file
187
options/train_realesrgan_x2plus.yml
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
# general settings
|
||||||
|
name: train_RealESRGANx2plus_400k_B12G4
|
||||||
|
model_type: RealESRGANModel
|
||||||
|
scale: 2
|
||||||
|
num_gpu: 4
|
||||||
|
manual_seed: 0
|
||||||
|
|
||||||
|
# ----------------- options for synthesizing training data in RealESRGANModel ----------------- #
|
||||||
|
# USM the ground-truth
|
||||||
|
l1_gt_usm: True
|
||||||
|
percep_gt_usm: True
|
||||||
|
gan_gt_usm: False
|
||||||
|
|
||||||
|
# the first degradation process
|
||||||
|
resize_prob: [0.2, 0.7, 0.1] # up, down, keep
|
||||||
|
resize_range: [0.15, 1.5]
|
||||||
|
gaussian_noise_prob: 0.5
|
||||||
|
noise_range: [1, 30]
|
||||||
|
poisson_scale_range: [0.05, 3]
|
||||||
|
gray_noise_prob: 0.4
|
||||||
|
jpeg_range: [30, 95]
|
||||||
|
|
||||||
|
# the second degradation process
|
||||||
|
second_blur_prob: 0.8
|
||||||
|
resize_prob2: [0.3, 0.4, 0.3] # up, down, keep
|
||||||
|
resize_range2: [0.3, 1.2]
|
||||||
|
gaussian_noise_prob2: 0.5
|
||||||
|
noise_range2: [1, 25]
|
||||||
|
poisson_scale_range2: [0.05, 2.5]
|
||||||
|
gray_noise_prob2: 0.4
|
||||||
|
jpeg_range2: [30, 95]
|
||||||
|
|
||||||
|
gt_size: 256
|
||||||
|
queue_size: 180
|
||||||
|
|
||||||
|
# dataset and data loader settings
|
||||||
|
datasets:
|
||||||
|
train:
|
||||||
|
name: DF2K+OST
|
||||||
|
type: RealESRGANDataset
|
||||||
|
dataroot_gt: datasets/DF2K
|
||||||
|
meta_info: datasets/DF2K/meta_info/meta_info_DF2Kmultiscale+OST_sub.txt
|
||||||
|
io_backend:
|
||||||
|
type: disk
|
||||||
|
|
||||||
|
blur_kernel_size: 21
|
||||||
|
kernel_list: ['iso', 'aniso', 'generalized_iso', 'generalized_aniso', 'plateau_iso', 'plateau_aniso']
|
||||||
|
kernel_prob: [0.45, 0.25, 0.12, 0.03, 0.12, 0.03]
|
||||||
|
sinc_prob: 0.1
|
||||||
|
blur_sigma: [0.2, 3]
|
||||||
|
betag_range: [0.5, 4]
|
||||||
|
betap_range: [1, 2]
|
||||||
|
|
||||||
|
blur_kernel_size2: 21
|
||||||
|
kernel_list2: ['iso', 'aniso', 'generalized_iso', 'generalized_aniso', 'plateau_iso', 'plateau_aniso']
|
||||||
|
kernel_prob2: [0.45, 0.25, 0.12, 0.03, 0.12, 0.03]
|
||||||
|
sinc_prob2: 0.1
|
||||||
|
blur_sigma2: [0.2, 1.5]
|
||||||
|
betag_range2: [0.5, 4]
|
||||||
|
betap_range2: [1, 2]
|
||||||
|
|
||||||
|
final_sinc_prob: 0.8
|
||||||
|
|
||||||
|
gt_size: 256
|
||||||
|
use_hflip: True
|
||||||
|
use_rot: False
|
||||||
|
|
||||||
|
# data loader
|
||||||
|
use_shuffle: true
|
||||||
|
num_worker_per_gpu: 5
|
||||||
|
batch_size_per_gpu: 12
|
||||||
|
dataset_enlarge_ratio: 1
|
||||||
|
prefetch_mode: ~
|
||||||
|
|
||||||
|
# Uncomment these for validation
|
||||||
|
# val:
|
||||||
|
# name: validation
|
||||||
|
# type: PairedImageDataset
|
||||||
|
# dataroot_gt: path_to_gt
|
||||||
|
# dataroot_lq: path_to_lq
|
||||||
|
# io_backend:
|
||||||
|
# type: disk
|
||||||
|
|
||||||
|
# network structures
|
||||||
|
network_g:
|
||||||
|
type: RRDBNet
|
||||||
|
num_in_ch: 3
|
||||||
|
num_out_ch: 3
|
||||||
|
num_feat: 64
|
||||||
|
num_block: 23
|
||||||
|
num_grow_ch: 32
|
||||||
|
scale: 2
|
||||||
|
|
||||||
|
|
||||||
|
network_d:
|
||||||
|
type: UNetDiscriminatorSN
|
||||||
|
num_in_ch: 3
|
||||||
|
num_feat: 64
|
||||||
|
skip_connection: True
|
||||||
|
|
||||||
|
# path
|
||||||
|
path:
|
||||||
|
# use the pre-trained Real-ESRNet model
|
||||||
|
pretrain_network_g: experiments/pretrained_models/RealESRNet_x2plus.pth
|
||||||
|
param_key_g: params_ema
|
||||||
|
strict_load_g: true
|
||||||
|
resume_state: ~
|
||||||
|
|
||||||
|
# training settings
|
||||||
|
train:
|
||||||
|
ema_decay: 0.999
|
||||||
|
optim_g:
|
||||||
|
type: Adam
|
||||||
|
lr: !!float 1e-4
|
||||||
|
weight_decay: 0
|
||||||
|
betas: [0.9, 0.99]
|
||||||
|
optim_d:
|
||||||
|
type: Adam
|
||||||
|
lr: !!float 1e-4
|
||||||
|
weight_decay: 0
|
||||||
|
betas: [0.9, 0.99]
|
||||||
|
|
||||||
|
scheduler:
|
||||||
|
type: MultiStepLR
|
||||||
|
milestones: [400000]
|
||||||
|
gamma: 0.5
|
||||||
|
|
||||||
|
total_iter: 400000
|
||||||
|
warmup_iter: -1 # no warm up
|
||||||
|
|
||||||
|
# losses
|
||||||
|
pixel_opt:
|
||||||
|
type: L1Loss
|
||||||
|
loss_weight: 1.0
|
||||||
|
reduction: mean
|
||||||
|
# perceptual loss (content and style losses)
|
||||||
|
perceptual_opt:
|
||||||
|
type: PerceptualLoss
|
||||||
|
layer_weights:
|
||||||
|
# before relu
|
||||||
|
'conv1_2': 0.1
|
||||||
|
'conv2_2': 0.1
|
||||||
|
'conv3_4': 1
|
||||||
|
'conv4_4': 1
|
||||||
|
'conv5_4': 1
|
||||||
|
vgg_type: vgg19
|
||||||
|
use_input_norm: true
|
||||||
|
perceptual_weight: !!float 1.0
|
||||||
|
style_weight: 0
|
||||||
|
range_norm: false
|
||||||
|
criterion: l1
|
||||||
|
# gan loss
|
||||||
|
gan_opt:
|
||||||
|
type: GANLoss
|
||||||
|
gan_type: vanilla
|
||||||
|
real_label_val: 1.0
|
||||||
|
fake_label_val: 0.0
|
||||||
|
loss_weight: !!float 1e-1
|
||||||
|
|
||||||
|
net_d_iters: 1
|
||||||
|
net_d_init_iters: 0
|
||||||
|
|
||||||
|
# Uncomment these for validation
|
||||||
|
# validation settings
|
||||||
|
# val:
|
||||||
|
# val_freq: !!float 5e3
|
||||||
|
# save_img: True
|
||||||
|
|
||||||
|
# metrics:
|
||||||
|
# psnr: # metric name, can be arbitrary
|
||||||
|
# type: calculate_psnr
|
||||||
|
# crop_border: 4
|
||||||
|
# test_y_channel: false
|
||||||
|
|
||||||
|
# logging settings
|
||||||
|
logger:
|
||||||
|
print_freq: 100
|
||||||
|
save_checkpoint_freq: !!float 5e3
|
||||||
|
use_tb_logger: true
|
||||||
|
wandb:
|
||||||
|
project: ~
|
||||||
|
resume_id: ~
|
||||||
|
|
||||||
|
# dist training settings
|
||||||
|
dist_params:
|
||||||
|
backend: nccl
|
||||||
|
port: 29500
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# general settings
|
# general settings
|
||||||
name: train_RealESRGANx4plus_400k_B12G4_fromRealESRNet
|
name: train_RealESRGANx4plus_400k_B12G4
|
||||||
model_type: RealESRGANModel
|
model_type: RealESRGANModel
|
||||||
scale: 4
|
scale: 4
|
||||||
num_gpu: 4
|
num_gpu: 4
|
||||||
@@ -39,7 +39,7 @@ datasets:
|
|||||||
name: DF2K+OST
|
name: DF2K+OST
|
||||||
type: RealESRGANDataset
|
type: RealESRGANDataset
|
||||||
dataroot_gt: datasets/DF2K
|
dataroot_gt: datasets/DF2K
|
||||||
meta_info: realesrgan/data/meta_info/meta_info_DF2Kmultiscale+OST_sub.txt
|
meta_info: datasets/DF2K/meta_info/meta_info_DF2Kmultiscale+OST_sub.txt
|
||||||
io_backend:
|
io_backend:
|
||||||
type: disk
|
type: disk
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ network_d:
|
|||||||
# path
|
# path
|
||||||
path:
|
path:
|
||||||
# use the pre-trained Real-ESRNet model
|
# use the pre-trained Real-ESRNet model
|
||||||
pretrain_network_g: experiments/train_RealESRNetx4plus_1000k_B12G4_fromESRGAN/models/net_g_1000000.pth
|
pretrain_network_g: experiments/pretrained_models/RealESRNet_x4plus.pth
|
||||||
param_key_g: params_ema
|
param_key_g: params_ema
|
||||||
strict_load_g: true
|
strict_load_g: true
|
||||||
resume_state: ~
|
resume_state: ~
|
||||||
|
|||||||
145
options/train_realesrnet_x2plus.yml
Normal file
145
options/train_realesrnet_x2plus.yml
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
# general settings
|
||||||
|
name: train_RealESRNetx2plus_1000k_B12G4
|
||||||
|
model_type: RealESRNetModel
|
||||||
|
scale: 2
|
||||||
|
num_gpu: 4
|
||||||
|
manual_seed: 0
|
||||||
|
|
||||||
|
# ----------------- options for synthesizing training data in RealESRNetModel ----------------- #
|
||||||
|
gt_usm: True # USM the ground-truth
|
||||||
|
|
||||||
|
# the first degradation process
|
||||||
|
resize_prob: [0.2, 0.7, 0.1] # up, down, keep
|
||||||
|
resize_range: [0.15, 1.5]
|
||||||
|
gaussian_noise_prob: 0.5
|
||||||
|
noise_range: [1, 30]
|
||||||
|
poisson_scale_range: [0.05, 3]
|
||||||
|
gray_noise_prob: 0.4
|
||||||
|
jpeg_range: [30, 95]
|
||||||
|
|
||||||
|
# the second degradation process
|
||||||
|
second_blur_prob: 0.8
|
||||||
|
resize_prob2: [0.3, 0.4, 0.3] # up, down, keep
|
||||||
|
resize_range2: [0.3, 1.2]
|
||||||
|
gaussian_noise_prob2: 0.5
|
||||||
|
noise_range2: [1, 25]
|
||||||
|
poisson_scale_range2: [0.05, 2.5]
|
||||||
|
gray_noise_prob2: 0.4
|
||||||
|
jpeg_range2: [30, 95]
|
||||||
|
|
||||||
|
gt_size: 256
|
||||||
|
queue_size: 180
|
||||||
|
|
||||||
|
# dataset and data loader settings
|
||||||
|
datasets:
|
||||||
|
train:
|
||||||
|
name: DF2K+OST
|
||||||
|
type: RealESRGANDataset
|
||||||
|
dataroot_gt: datasets/DF2K
|
||||||
|
meta_info: datasets/DF2K/meta_info/meta_info_DF2Kmultiscale+OST_sub.txt
|
||||||
|
io_backend:
|
||||||
|
type: disk
|
||||||
|
|
||||||
|
blur_kernel_size: 21
|
||||||
|
kernel_list: ['iso', 'aniso', 'generalized_iso', 'generalized_aniso', 'plateau_iso', 'plateau_aniso']
|
||||||
|
kernel_prob: [0.45, 0.25, 0.12, 0.03, 0.12, 0.03]
|
||||||
|
sinc_prob: 0.1
|
||||||
|
blur_sigma: [0.2, 3]
|
||||||
|
betag_range: [0.5, 4]
|
||||||
|
betap_range: [1, 2]
|
||||||
|
|
||||||
|
blur_kernel_size2: 21
|
||||||
|
kernel_list2: ['iso', 'aniso', 'generalized_iso', 'generalized_aniso', 'plateau_iso', 'plateau_aniso']
|
||||||
|
kernel_prob2: [0.45, 0.25, 0.12, 0.03, 0.12, 0.03]
|
||||||
|
sinc_prob2: 0.1
|
||||||
|
blur_sigma2: [0.2, 1.5]
|
||||||
|
betag_range2: [0.5, 4]
|
||||||
|
betap_range2: [1, 2]
|
||||||
|
|
||||||
|
final_sinc_prob: 0.8
|
||||||
|
|
||||||
|
gt_size: 256
|
||||||
|
use_hflip: True
|
||||||
|
use_rot: False
|
||||||
|
|
||||||
|
# data loader
|
||||||
|
use_shuffle: true
|
||||||
|
num_worker_per_gpu: 5
|
||||||
|
batch_size_per_gpu: 12
|
||||||
|
dataset_enlarge_ratio: 1
|
||||||
|
prefetch_mode: ~
|
||||||
|
|
||||||
|
# Uncomment these for validation
|
||||||
|
# val:
|
||||||
|
# name: validation
|
||||||
|
# type: PairedImageDataset
|
||||||
|
# dataroot_gt: path_to_gt
|
||||||
|
# dataroot_lq: path_to_lq
|
||||||
|
# io_backend:
|
||||||
|
# type: disk
|
||||||
|
|
||||||
|
# network structures
|
||||||
|
network_g:
|
||||||
|
type: RRDBNet
|
||||||
|
num_in_ch: 3
|
||||||
|
num_out_ch: 3
|
||||||
|
num_feat: 64
|
||||||
|
num_block: 23
|
||||||
|
num_grow_ch: 32
|
||||||
|
scale: 2
|
||||||
|
|
||||||
|
# path
|
||||||
|
path:
|
||||||
|
pretrain_network_g: experiments/pretrained_models/RealESRGAN_x4plus.pth
|
||||||
|
param_key_g: params_ema
|
||||||
|
strict_load_g: False
|
||||||
|
resume_state: ~
|
||||||
|
|
||||||
|
# training settings
|
||||||
|
train:
|
||||||
|
ema_decay: 0.999
|
||||||
|
optim_g:
|
||||||
|
type: Adam
|
||||||
|
lr: !!float 2e-4
|
||||||
|
weight_decay: 0
|
||||||
|
betas: [0.9, 0.99]
|
||||||
|
|
||||||
|
scheduler:
|
||||||
|
type: MultiStepLR
|
||||||
|
milestones: [1000000]
|
||||||
|
gamma: 0.5
|
||||||
|
|
||||||
|
total_iter: 1000000
|
||||||
|
warmup_iter: -1 # no warm up
|
||||||
|
|
||||||
|
# losses
|
||||||
|
pixel_opt:
|
||||||
|
type: L1Loss
|
||||||
|
loss_weight: 1.0
|
||||||
|
reduction: mean
|
||||||
|
|
||||||
|
# Uncomment these for validation
|
||||||
|
# validation settings
|
||||||
|
# val:
|
||||||
|
# val_freq: !!float 5e3
|
||||||
|
# save_img: True
|
||||||
|
|
||||||
|
# metrics:
|
||||||
|
# psnr: # metric name, can be arbitrary
|
||||||
|
# type: calculate_psnr
|
||||||
|
# crop_border: 4
|
||||||
|
# test_y_channel: false
|
||||||
|
|
||||||
|
# logging settings
|
||||||
|
logger:
|
||||||
|
print_freq: 100
|
||||||
|
save_checkpoint_freq: !!float 5e3
|
||||||
|
use_tb_logger: true
|
||||||
|
wandb:
|
||||||
|
project: ~
|
||||||
|
resume_id: ~
|
||||||
|
|
||||||
|
# dist training settings
|
||||||
|
dist_params:
|
||||||
|
backend: nccl
|
||||||
|
port: 29500
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# general settings
|
# general settings
|
||||||
name: train_RealESRNetx4plus_1000k_B12G4_fromESRGAN
|
name: train_RealESRNetx4plus_1000k_B12G4
|
||||||
model_type: RealESRNetModel
|
model_type: RealESRNetModel
|
||||||
scale: 4
|
scale: 4
|
||||||
num_gpu: 4
|
num_gpu: 4
|
||||||
@@ -36,7 +36,7 @@ datasets:
|
|||||||
name: DF2K+OST
|
name: DF2K+OST
|
||||||
type: RealESRGANDataset
|
type: RealESRGANDataset
|
||||||
dataroot_gt: datasets/DF2K
|
dataroot_gt: datasets/DF2K
|
||||||
meta_info: realesrgan/data/meta_info/meta_info_DF2Kmultiscale+OST_sub.txt
|
meta_info: datasets/DF2K/meta_info/meta_info_DF2Kmultiscale+OST_sub.txt
|
||||||
io_backend:
|
io_backend:
|
||||||
type: disk
|
type: disk
|
||||||
|
|
||||||
|
|||||||
@@ -63,12 +63,7 @@ class RealESRGANer():
|
|||||||
self.img = F.pad(self.img, (0, self.mod_pad_w, 0, self.mod_pad_h), 'reflect')
|
self.img = F.pad(self.img, (0, self.mod_pad_w, 0, self.mod_pad_h), 'reflect')
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
try:
|
self.output = self.model(self.img)
|
||||||
# inference
|
|
||||||
with torch.no_grad():
|
|
||||||
self.output = self.model(self.img)
|
|
||||||
except Exception as error:
|
|
||||||
print('Error', error)
|
|
||||||
|
|
||||||
def tile_process(self):
|
def tile_process(self):
|
||||||
"""Modified from: https://github.com/ata4/esrgan-launcher
|
"""Modified from: https://github.com/ata4/esrgan-launcher
|
||||||
@@ -143,10 +138,12 @@ class RealESRGANer():
|
|||||||
self.output = self.output[:, :, 0:h - self.pre_pad * self.scale, 0:w - self.pre_pad * self.scale]
|
self.output = self.output[:, :, 0:h - self.pre_pad * self.scale, 0:w - self.pre_pad * self.scale]
|
||||||
return self.output
|
return self.output
|
||||||
|
|
||||||
def enhance(self, img, tile=False, alpha_upsampler='realesrgan'):
|
@torch.no_grad()
|
||||||
|
def enhance(self, img, outscale=None, alpha_upsampler='realesrgan'):
|
||||||
|
h_input, w_input = img.shape[0:2]
|
||||||
# img: numpy
|
# img: numpy
|
||||||
img = img.astype(np.float32)
|
img = img.astype(np.float32)
|
||||||
if np.max(img) > 255: # 16-bit image
|
if np.max(img) > 256: # 16-bit image
|
||||||
max_range = 65535
|
max_range = 65535
|
||||||
print('\tInput is a 16-bit image')
|
print('\tInput is a 16-bit image')
|
||||||
else:
|
else:
|
||||||
@@ -203,6 +200,14 @@ class RealESRGANer():
|
|||||||
output = (output_img * 65535.0).round().astype(np.uint16)
|
output = (output_img * 65535.0).round().astype(np.uint16)
|
||||||
else:
|
else:
|
||||||
output = (output_img * 255.0).round().astype(np.uint8)
|
output = (output_img * 255.0).round().astype(np.uint8)
|
||||||
|
|
||||||
|
if outscale is not None and outscale != float(self.scale):
|
||||||
|
output = cv2.resize(
|
||||||
|
output, (
|
||||||
|
int(w_input * outscale),
|
||||||
|
int(h_input * outscale),
|
||||||
|
), interpolation=cv2.INTER_LANCZOS4)
|
||||||
|
|
||||||
return output, img_mode
|
return output, img_mode
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
basicsr
|
basicsr>=1.3.3.11
|
||||||
|
facexlib>=0.2.0.3
|
||||||
|
gfpgan>=0.2.1
|
||||||
numpy
|
numpy
|
||||||
opencv-python
|
opencv-python
|
||||||
|
Pillow
|
||||||
torch>=1.7
|
torch>=1.7
|
||||||
|
|||||||
40
scripts/generate_meta_info.py
Normal file
40
scripts/generate_meta_info.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import argparse
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def main(args):
|
||||||
|
txt_file = open(args.meta_info, 'w')
|
||||||
|
for folder, root in zip(args.input, args.root):
|
||||||
|
img_paths = sorted(glob.glob(os.path.join(folder, '*')))
|
||||||
|
for img_path in img_paths:
|
||||||
|
img_name = os.path.relpath(img_path, root)
|
||||||
|
print(img_name)
|
||||||
|
txt_file.write(f'{img_name}\n')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
"""Generate meta info (txt file) for only Ground-Truth images.
|
||||||
|
|
||||||
|
It can also generate meta info from several folders into one txt file.
|
||||||
|
"""
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument(
|
||||||
|
'--input',
|
||||||
|
nargs='+',
|
||||||
|
default=['datasets/DF2K/DF2K_HR', 'datasets/DF2K/DF2K_multiscale'],
|
||||||
|
help='Input folder, can be a list')
|
||||||
|
parser.add_argument(
|
||||||
|
'--root',
|
||||||
|
nargs='+',
|
||||||
|
default=['datasets/DF2K', 'datasets/DF2K'],
|
||||||
|
help='Folder root, should have the length as input folders')
|
||||||
|
parser.add_argument(
|
||||||
|
'--meta_info',
|
||||||
|
type=str,
|
||||||
|
default='datasets/DF2K/meta_info/meta_info_DF2Kmultiscale.txt',
|
||||||
|
help='txt path for meta info')
|
||||||
|
args = parser.parse_args()
|
||||||
|
assert len(args.input) == len(args.root), ('Input folder and folder root should have the same length, but got '
|
||||||
|
f'{len(args.input)} and {len(args.root)}.')
|
||||||
|
main(args)
|
||||||
46
scripts/generate_multiscale_DF2K.py
Normal file
46
scripts/generate_multiscale_DF2K.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import argparse
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
|
||||||
|
def main(args):
|
||||||
|
|
||||||
|
# For DF2K, we consider the following three scales,
|
||||||
|
# and the smallest image whose shortest edge is 400
|
||||||
|
scale_list = [0.75, 0.5, 1 / 3]
|
||||||
|
shortest_edge = 400
|
||||||
|
|
||||||
|
path_list = sorted(glob.glob(os.path.join(args.input, '*')))
|
||||||
|
for path in path_list:
|
||||||
|
print(path)
|
||||||
|
basename = os.path.splitext(os.path.basename(path))[0]
|
||||||
|
|
||||||
|
img = Image.open(path)
|
||||||
|
width, height = img.size
|
||||||
|
for idx, scale in enumerate(scale_list):
|
||||||
|
print(f'\t{scale:.2f}')
|
||||||
|
rlt = img.resize((int(width * scale), int(height * scale)), resample=Image.LANCZOS)
|
||||||
|
rlt.save(os.path.join(args.output, f'{basename}T{idx}.png'))
|
||||||
|
|
||||||
|
# save the smallest image which the shortest edge is 400
|
||||||
|
if width < height:
|
||||||
|
ratio = height / width
|
||||||
|
width = shortest_edge
|
||||||
|
height = int(width * ratio)
|
||||||
|
else:
|
||||||
|
ratio = width / height
|
||||||
|
height = shortest_edge
|
||||||
|
width = int(height * ratio)
|
||||||
|
rlt = img.resize((int(width), int(height)), resample=Image.LANCZOS)
|
||||||
|
rlt.save(os.path.join(args.output, f'{basename}T{idx+1}.png'))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('--input', type=str, default='datasets/DF2K/DF2K_HR', help='Input folder')
|
||||||
|
parser.add_argument('--output', type=str, default='datasets/DF2K/DF2K_multiscale', help='Output folder')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
os.makedirs(args.output, exist_ok=True)
|
||||||
|
main(args)
|
||||||
@@ -17,6 +17,6 @@ line_length = 120
|
|||||||
multi_line_output = 0
|
multi_line_output = 0
|
||||||
known_standard_library = pkg_resources,setuptools
|
known_standard_library = pkg_resources,setuptools
|
||||||
known_first_party = realesrgan
|
known_first_party = realesrgan
|
||||||
known_third_party = basicsr,cv2,numpy,torch
|
known_third_party = PIL,basicsr,cv2,numpy,torch
|
||||||
no_lines_before = STDLIB,LOCALFOLDER
|
no_lines_before = STDLIB,LOCALFOLDER
|
||||||
default_section = THIRDPARTY
|
default_section = THIRDPARTY
|
||||||
|
|||||||
Reference in New Issue
Block a user