Repository: minyuanye/SIUN
Branch: master
Commit: d62bc50915d0
Files: 19
Total size: 24.6 MB
Directory structure:
gitextract_k65vub75/
├── README.md
└── code/
├── __init__.py
├── deblur.py
├── model/
│ ├── generator.h5
│ └── generator.json
├── requirements.txt
└── src/
├── __init__.py
├── application.py
├── config.py
├── lib/
│ ├── MLVSharpnessMeasure.py
│ ├── __init__.py
│ ├── data_helper.py
│ ├── data_producer.py
│ └── tf_util.py
├── model/
│ ├── __init__.py
│ └── model.py
├── tester.py
├── trainer.py
└── verification.py
================================================
FILE CONTENTS
================================================
================================================
FILE: README.md
================================================
# Scale-Iterative Upscaling Network for Image Deblurring
by Minyuan Ye, Dong Lyu and Gengsheng Chen
pdf [[main](https://ieeexplore.ieee.org/document/8963625)][[backup](http://lab.zhuzhuguowang.cn:36900/croxline/Paper/Scale-Iterative%20Upscaling%20Network%20for%20Image%20Deblurring.pdf)]
### One real example

(a) Result of Nah et al. (b) Result of Tao et al. (c) Result of Zhang et al. (d) Our result.
### Results on benchmark datasets

From top to bottom are blurry input, deblurring results of Nah et al., Tao et al., Zhang et al. and ours.
### Results on real-world blurred images

From top to bottom are images restored by Pan et al., Nah et al., Tao et al., Zhang et al. and ours. As space limits, the original blurry images are omitted here.
They can be viewed in Lai dataset with their names, from left to right: boy_statue, pietro, street4 and text1.
## Prerequisites
Please refer to "/code/requirements.txt".
## Installation
```
git clone https://github.com/minyuanye/SIUN.git
cd code
```
## Basic usage
You can always add '--gpu=' to specify GPU ID, the default ID is 0.
1. For deblurring an image:
**python deblur.py --apply --file-path=''**
2. For deblurring all images in a folder:
**python deblur.py --apply --dir-path=''**
Add '--result-dir=' to specify output path. If it is not specified, the default path is './output'.
3. For testing the model:
**python deblur.py --test**
Note that this command can only be used to test GOPRO dataset. And it will load all images into memory first. We recommand to use '--apply'
as an alternative (Item 2).
Please set value of 'test_directory_path' to specify the GOPRO dataset path in file 'config.py'.
4. For training a new model:
**python deblur.py --train**
Please remove the model file in 'model' first and set value of 'train_directory_path' to specify the GOPRO dataset path in file 'config.py'.
When it finishes, run:
**python deblur.py --verify**
## Advanced usage
Please refer to the source code. Most configuration parameters are listed in '/code/src/config.py'.
## Citation
If you use any part of our code, or SIUN is useful for your research, please consider citing:
```bibtex
@ARTICLE{8963625,
author={M. {Ye} and D. {Lyu} and G. {Chen}},
journal={IEEE Access},
title={Scale-Iterative Upscaling Network for Image Deblurring},
year={2020},
volume={8},
number={},
pages={18316-18325},
keywords={Blind deblurring;curriculum learning;scale-iterative;upscaling network},
doi={10.1109/ACCESS.2020.2967823},
ISSN={2169-3536},
month={},}
```
================================================
FILE: code/__init__.py
================================================
================================================
FILE: code/deblur.py
================================================
import os
import sys
import argparse
from src.config import Config
from src.lib.tf_util import set_session_config
_PATH_ = os.path.dirname(os.path.dirname(__file__))
if _PATH_ not in sys.path:
sys.path.append(_PATH_)
def getArgs():
parser = argparse.ArgumentParser()
parser.add_argument("--train", help="train the model", action="store_true", default=False)
parser.add_argument("--test", help="test the model", action="store_true", default=False)
parser.add_argument("--apply", help="use the model", action="store_true", default=False)
parser.add_argument("--verify", help="verify the model", action="store_true", default=False)
parser.add_argument("--gpu", help="test device list", default="0")
parser.add_argument("--file-path", help="file path of the input image")
parser.add_argument("--dir-path", help="dir path of the input images")
parser.add_argument("--result-dir", help="deblur result dir of the input images")
parser.add_argument("--iter", help="iter times", default=0, type=int)
return parser.parse_args()
if __name__ == "__main__":
args = getArgs()
config = Config()
config.resource.create_directories()
if(args.file_path):
config.application.deblurring_file_path = args.file_path
if(args.dir_path):
config.application.deblurring_dir_path = args.dir_path
if(args.iter):
config.application.iter = args.iter
if(args.result_dir):
config.application.deblurring_result_dir = args.result_dir
set_session_config(per_process_gpu_memory_fraction=1, allow_growth=True, device_list=args.gpu)
gpus = args.gpu.split(",")
config.trainer.gpu_num = len(gpus)
if(args.train):
#trainer
from src.trainer import Trainer
Trainer(config).start()
elif(args.test):
#tester
from src.tester import Tester
Tester(config).start()
elif(args.apply):
#application
from src.application import Application
Application(config).start()
elif(args.verify):
#verification
from src.verification import Verification
Verification(config).start()
else:
#info
from src.model.model import DDModel
model = DDModel(config)
model.generator.summary(line_length=150)
================================================
FILE: code/model/generator.h5
================================================
[File too large to display: 24.5 MB]
================================================
FILE: code/model/generator.json
================================================
{"class_name": "Model", "config": {"name": "generator", "layers": [{"name": "imageSmall", "class_name": "InputLayer", "config": {"batch_input_shape": [null, null, null, 6], "dtype": "float32", "sparse": false, "name": "imageSmall"}, "inbound_nodes": []}, {"name": "conv2d_1", "class_name": "Conv2D", "config": {"name": "conv2d_1", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["imageSmall", 0, 0, {}]]]}, {"name": "conv2d_2", "class_name": "Conv2D", "config": {"name": "conv2d_2", "trainable": true, "filters": 32, "kernel_size": [5, 5], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["conv2d_1", 0, 0, {}]]]}, {"name": "activation_1", "class_name": "Activation", "config": {"name": "activation_1", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_2", 0, 0, {}]]]}, {"name": "conv2d_3", "class_name": "Conv2D", "config": {"name": "conv2d_3", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_1", 0, 0, {}]]]}, {"name": "activation_2", "class_name": "Activation", "config": {"name": "activation_2", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_3", 0, 0, {}]]]}, {"name": "conv2d_4", "class_name": "Conv2D", "config": {"name": "conv2d_4", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_2", 0, 0, {}]]]}, {"name": "add_1", "class_name": "Add", "config": {"name": "add_1", "trainable": true}, "inbound_nodes": [[["conv2d_4", 0, 0, {}], ["activation_1", 0, 0, {}]]]}, {"name": "conv2d_5", "class_name": "Conv2D", "config": {"name": "conv2d_5", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_1", 0, 0, {}]]]}, {"name": "activation_3", "class_name": "Activation", "config": {"name": "activation_3", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_5", 0, 0, {}]]]}, {"name": "conv2d_6", "class_name": "Conv2D", "config": {"name": "conv2d_6", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_3", 0, 0, {}]]]}, {"name": "add_2", "class_name": "Add", "config": {"name": "add_2", "trainable": true}, "inbound_nodes": [[["conv2d_6", 0, 0, {}], ["add_1", 0, 0, {}]]]}, {"name": "conv2d_7", "class_name": "Conv2D", "config": {"name": "conv2d_7", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_2", 0, 0, {}]]]}, {"name": "activation_4", "class_name": "Activation", "config": {"name": "activation_4", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_7", 0, 0, {}]]]}, {"name": "conv2d_8", "class_name": "Conv2D", "config": {"name": "conv2d_8", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_4", 0, 0, {}]]]}, {"name": "add_3", "class_name": "Add", "config": {"name": "add_3", "trainable": true}, "inbound_nodes": [[["conv2d_8", 0, 0, {}], ["add_2", 0, 0, {}]]]}, {"name": "conv2d_9", "class_name": "Conv2D", "config": {"name": "conv2d_9", "trainable": true, "filters": 64, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_3", 0, 0, {}]]]}, {"name": "activation_5", "class_name": "Activation", "config": {"name": "activation_5", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_9", 0, 0, {}]]]}, {"name": "conv2d_10", "class_name": "Conv2D", "config": {"name": "conv2d_10", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_5", 0, 0, {}]]]}, {"name": "activation_6", "class_name": "Activation", "config": {"name": "activation_6", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_10", 0, 0, {}]]]}, {"name": "conv2d_11", "class_name": "Conv2D", "config": {"name": "conv2d_11", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_6", 0, 0, {}]]]}, {"name": "add_4", "class_name": "Add", "config": {"name": "add_4", "trainable": true}, "inbound_nodes": [[["conv2d_11", 0, 0, {}], ["activation_5", 0, 0, {}]]]}, {"name": "conv2d_12", "class_name": "Conv2D", "config": {"name": "conv2d_12", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_4", 0, 0, {}]]]}, {"name": "activation_7", "class_name": "Activation", "config": {"name": "activation_7", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_12", 0, 0, {}]]]}, {"name": "conv2d_13", "class_name": "Conv2D", "config": {"name": "conv2d_13", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_7", 0, 0, {}]]]}, {"name": "add_5", "class_name": "Add", "config": {"name": "add_5", "trainable": true}, "inbound_nodes": [[["conv2d_13", 0, 0, {}], ["add_4", 0, 0, {}]]]}, {"name": "conv2d_14", "class_name": "Conv2D", "config": {"name": "conv2d_14", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_5", 0, 0, {}]]]}, {"name": "activation_8", "class_name": "Activation", "config": {"name": "activation_8", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_14", 0, 0, {}]]]}, {"name": "conv2d_15", "class_name": "Conv2D", "config": {"name": "conv2d_15", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_8", 0, 0, {}]]]}, {"name": "add_6", "class_name": "Add", "config": {"name": "add_6", "trainable": true}, "inbound_nodes": [[["conv2d_15", 0, 0, {}], ["add_5", 0, 0, {}]]]}, {"name": "conv2d_16", "class_name": "Conv2D", "config": {"name": "conv2d_16", "trainable": true, "filters": 128, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_6", 0, 0, {}]]]}, {"name": "activation_9", "class_name": "Activation", "config": {"name": "activation_9", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_16", 0, 0, {}]]]}, {"name": "conv2d_17", "class_name": "Conv2D", "config": {"name": "conv2d_17", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_9", 0, 0, {}]]]}, {"name": "activation_10", "class_name": "Activation", "config": {"name": "activation_10", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_17", 0, 0, {}]]]}, {"name": "conv2d_18", "class_name": "Conv2D", "config": {"name": "conv2d_18", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_10", 0, 0, {}]]]}, {"name": "add_7", "class_name": "Add", "config": {"name": "add_7", "trainable": true}, "inbound_nodes": [[["conv2d_18", 0, 0, {}], ["activation_9", 0, 0, {}]]]}, {"name": "conv2d_19", "class_name": "Conv2D", "config": {"name": "conv2d_19", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_7", 0, 0, {}]]]}, {"name": "activation_11", "class_name": "Activation", "config": {"name": "activation_11", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_19", 0, 0, {}]]]}, {"name": "conv2d_20", "class_name": "Conv2D", "config": {"name": "conv2d_20", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_11", 0, 0, {}]]]}, {"name": "add_8", "class_name": "Add", "config": {"name": "add_8", "trainable": true}, "inbound_nodes": [[["conv2d_20", 0, 0, {}], ["add_7", 0, 0, {}]]]}, {"name": "conv2d_21", "class_name": "Conv2D", "config": {"name": "conv2d_21", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_8", 0, 0, {}]]]}, {"name": "activation_12", "class_name": "Activation", "config": {"name": "activation_12", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_21", 0, 0, {}]]]}, {"name": "conv2d_22", "class_name": "Conv2D", "config": {"name": "conv2d_22", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_12", 0, 0, {}]]]}, {"name": "add_9", "class_name": "Add", "config": {"name": "add_9", "trainable": true}, "inbound_nodes": [[["conv2d_22", 0, 0, {}], ["add_8", 0, 0, {}]]]}, {"name": "conv2d_23", "class_name": "Conv2D", "config": {"name": "conv2d_23", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_9", 0, 0, {}]]]}, {"name": "activation_13", "class_name": "Activation", "config": {"name": "activation_13", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_23", 0, 0, {}]]]}, {"name": "conv2d_24", "class_name": "Conv2D", "config": {"name": "conv2d_24", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_13", 0, 0, {}]]]}, {"name": "add_10", "class_name": "Add", "config": {"name": "add_10", "trainable": true}, "inbound_nodes": [[["conv2d_24", 0, 0, {}], ["add_9", 0, 0, {}]]]}, {"name": "conv2d_25", "class_name": "Conv2D", "config": {"name": "conv2d_25", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_10", 0, 0, {}]]]}, {"name": "activation_14", "class_name": "Activation", "config": {"name": "activation_14", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_25", 0, 0, {}]]]}, {"name": "conv2d_26", "class_name": "Conv2D", "config": {"name": "conv2d_26", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_14", 0, 0, {}]]]}, {"name": "add_11", "class_name": "Add", "config": {"name": "add_11", "trainable": true}, "inbound_nodes": [[["conv2d_26", 0, 0, {}], ["add_10", 0, 0, {}]]]}, {"name": "conv2d_27", "class_name": "Conv2D", "config": {"name": "conv2d_27", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_11", 0, 0, {}]]]}, {"name": "activation_15", "class_name": "Activation", "config": {"name": "activation_15", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_27", 0, 0, {}]]]}, {"name": "conv2d_28", "class_name": "Conv2D", "config": {"name": "conv2d_28", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_15", 0, 0, {}]]]}, {"name": "add_12", "class_name": "Add", "config": {"name": "add_12", "trainable": true}, "inbound_nodes": [[["conv2d_28", 0, 0, {}], ["add_11", 0, 0, {}]]]}, {"name": "conv2d_transpose_1", "class_name": "Conv2DTranspose", "config": {"name": "conv2d_transpose_1", "trainable": true, "filters": 64, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null, "output_padding": null}, "inbound_nodes": [[["add_12", 0, 0, {}]]]}, {"name": "activation_16", "class_name": "Activation", "config": {"name": "activation_16", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_transpose_1", 0, 0, {}]]]}, {"name": "add_13", "class_name": "Add", "config": {"name": "add_13", "trainable": true}, "inbound_nodes": [[["activation_16", 0, 0, {}], ["add_6", 0, 0, {}]]]}, {"name": "conv2d_29", "class_name": "Conv2D", "config": {"name": "conv2d_29", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_13", 0, 0, {}]]]}, {"name": "activation_17", "class_name": "Activation", "config": {"name": "activation_17", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_29", 0, 0, {}]]]}, {"name": "conv2d_30", "class_name": "Conv2D", "config": {"name": "conv2d_30", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_17", 0, 0, {}]]]}, {"name": "add_14", "class_name": "Add", "config": {"name": "add_14", "trainable": true}, "inbound_nodes": [[["conv2d_30", 0, 0, {}], ["add_13", 0, 0, {}]]]}, {"name": "conv2d_31", "class_name": "Conv2D", "config": {"name": "conv2d_31", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_14", 0, 0, {}]]]}, {"name": "activation_18", "class_name": "Activation", "config": {"name": "activation_18", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_31", 0, 0, {}]]]}, {"name": "conv2d_32", "class_name": "Conv2D", "config": {"name": "conv2d_32", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_18", 0, 0, {}]]]}, {"name": "add_15", "class_name": "Add", "config": {"name": "add_15", "trainable": true}, "inbound_nodes": [[["conv2d_32", 0, 0, {}], ["add_14", 0, 0, {}]]]}, {"name": "conv2d_33", "class_name": "Conv2D", "config": {"name": "conv2d_33", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_15", 0, 0, {}]]]}, {"name": "activation_19", "class_name": "Activation", "config": {"name": "activation_19", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_33", 0, 0, {}]]]}, {"name": "conv2d_34", "class_name": "Conv2D", "config": {"name": "conv2d_34", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_19", 0, 0, {}]]]}, {"name": "add_16", "class_name": "Add", "config": {"name": "add_16", "trainable": true}, "inbound_nodes": [[["conv2d_34", 0, 0, {}], ["add_15", 0, 0, {}]]]}, {"name": "conv2d_transpose_2", "class_name": "Conv2DTranspose", "config": {"name": "conv2d_transpose_2", "trainable": true, "filters": 32, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null, "output_padding": null}, "inbound_nodes": [[["add_16", 0, 0, {}]]]}, {"name": "activation_20", "class_name": "Activation", "config": {"name": "activation_20", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_transpose_2", 0, 0, {}]]]}, {"name": "add_17", "class_name": "Add", "config": {"name": "add_17", "trainable": true}, "inbound_nodes": [[["activation_20", 0, 0, {}], ["add_3", 0, 0, {}]]]}, {"name": "conv2d_35", "class_name": "Conv2D", "config": {"name": "conv2d_35", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_17", 0, 0, {}]]]}, {"name": "activation_21", "class_name": "Activation", "config": {"name": "activation_21", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_35", 0, 0, {}]]]}, {"name": "concatenate_1", "class_name": "Concatenate", "config": {"name": "concatenate_1", "trainable": true, "axis": 3}, "inbound_nodes": [[["add_17", 0, 0, {}], ["activation_21", 0, 0, {}]]]}, {"name": "conv2d_36", "class_name": "Conv2D", "config": {"name": "conv2d_36", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_1", 0, 0, {}]]]}, {"name": "activation_22", "class_name": "Activation", "config": {"name": "activation_22", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_36", 0, 0, {}]]]}, {"name": "concatenate_2", "class_name": "Concatenate", "config": {"name": "concatenate_2", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_1", 0, 0, {}], ["activation_22", 0, 0, {}]]]}, {"name": "conv2d_37", "class_name": "Conv2D", "config": {"name": "conv2d_37", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_2", 0, 0, {}]]]}, {"name": "activation_23", "class_name": "Activation", "config": {"name": "activation_23", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_37", 0, 0, {}]]]}, {"name": "concatenate_3", "class_name": "Concatenate", "config": {"name": "concatenate_3", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_2", 0, 0, {}], ["activation_23", 0, 0, {}]]]}, {"name": "conv2d_38", "class_name": "Conv2D", "config": {"name": "conv2d_38", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_3", 0, 0, {}]]]}, {"name": "activation_24", "class_name": "Activation", "config": {"name": "activation_24", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_38", 0, 0, {}]]]}, {"name": "concatenate_4", "class_name": "Concatenate", "config": {"name": "concatenate_4", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_3", 0, 0, {}], ["activation_24", 0, 0, {}]]]}, {"name": "conv2d_39", "class_name": "Conv2D", "config": {"name": "conv2d_39", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_4", 0, 0, {}]]]}, {"name": "activation_25", "class_name": "Activation", "config": {"name": "activation_25", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_39", 0, 0, {}]]]}, {"name": "concatenate_5", "class_name": "Concatenate", "config": {"name": "concatenate_5", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_4", 0, 0, {}], ["activation_25", 0, 0, {}]]]}, {"name": "conv2d_40", "class_name": "Conv2D", "config": {"name": "conv2d_40", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_5", 0, 0, {}]]]}, {"name": "activation_26", "class_name": "Activation", "config": {"name": "activation_26", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_40", 0, 0, {}]]]}, {"name": "concatenate_6", "class_name": "Concatenate", "config": {"name": "concatenate_6", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_5", 0, 0, {}], ["activation_26", 0, 0, {}]]]}, {"name": "conv2d_41", "class_name": "Conv2D", "config": {"name": "conv2d_41", "trainable": true, "filters": 32, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_6", 0, 0, {}]]]}, {"name": "add_18", "class_name": "Add", "config": {"name": "add_18", "trainable": true}, "inbound_nodes": [[["conv2d_41", 0, 0, {}], ["add_17", 0, 0, {}]]]}, {"name": "conv2d_42", "class_name": "Conv2D", "config": {"name": "conv2d_42", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_18", 0, 0, {}]]]}, {"name": "activation_27", "class_name": "Activation", "config": {"name": "activation_27", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_42", 0, 0, {}]]]}, {"name": "concatenate_7", "class_name": "Concatenate", "config": {"name": "concatenate_7", "trainable": true, "axis": 3}, "inbound_nodes": [[["add_18", 0, 0, {}], ["activation_27", 0, 0, {}]]]}, {"name": "conv2d_43", "class_name": "Conv2D", "config": {"name": "conv2d_43", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_7", 0, 0, {}]]]}, {"name": "activation_28", "class_name": "Activation", "config": {"name": "activation_28", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_43", 0, 0, {}]]]}, {"name": "concatenate_8", "class_name": "Concatenate", "config": {"name": "concatenate_8", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_7", 0, 0, {}], ["activation_28", 0, 0, {}]]]}, {"name": "conv2d_44", "class_name": "Conv2D", "config": {"name": "conv2d_44", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_8", 0, 0, {}]]]}, {"name": "activation_29", "class_name": "Activation", "config": {"name": "activation_29", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_44", 0, 0, {}]]]}, {"name": "concatenate_9", "class_name": "Concatenate", "config": {"name": "concatenate_9", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_8", 0, 0, {}], ["activation_29", 0, 0, {}]]]}, {"name": "conv2d_45", "class_name": "Conv2D", "config": {"name": "conv2d_45", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_9", 0, 0, {}]]]}, {"name": "activation_30", "class_name": "Activation", "config": {"name": "activation_30", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_45", 0, 0, {}]]]}, {"name": "concatenate_10", "class_name": "Concatenate", "config": {"name": "concatenate_10", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_9", 0, 0, {}], ["activation_30", 0, 0, {}]]]}, {"name": "conv2d_46", "class_name": "Conv2D", "config": {"name": "conv2d_46", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_10", 0, 0, {}]]]}, {"name": "activation_31", "class_name": "Activation", "config": {"name": "activation_31", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_46", 0, 0, {}]]]}, {"name": "concatenate_11", "class_name": "Concatenate", "config": {"name": "concatenate_11", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_10", 0, 0, {}], ["activation_31", 0, 0, {}]]]}, {"name": "conv2d_47", "class_name": "Conv2D", "config": {"name": "conv2d_47", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_11", 0, 0, {}]]]}, {"name": "activation_32", "class_name": "Activation", "config": {"name": "activation_32", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_47", 0, 0, {}]]]}, {"name": "concatenate_12", "class_name": "Concatenate", "config": {"name": "concatenate_12", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_11", 0, 0, {}], ["activation_32", 0, 0, {}]]]}, {"name": "conv2d_48", "class_name": "Conv2D", "config": {"name": "conv2d_48", "trainable": true, "filters": 32, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_12", 0, 0, {}]]]}, {"name": "add_19", "class_name": "Add", "config": {"name": "add_19", "trainable": true}, "inbound_nodes": [[["conv2d_48", 0, 0, {}], ["add_18", 0, 0, {}]]]}, {"name": "conv2d_49", "class_name": "Conv2D", "config": {"name": "conv2d_49", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_19", 0, 0, {}]]]}, {"name": "activation_33", "class_name": "Activation", "config": {"name": "activation_33", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_49", 0, 0, {}]]]}, {"name": "concatenate_13", "class_name": "Concatenate", "config": {"name": "concatenate_13", "trainable": true, "axis": 3}, "inbound_nodes": [[["add_19", 0, 0, {}], ["activation_33", 0, 0, {}]]]}, {"name": "conv2d_50", "class_name": "Conv2D", "config": {"name": "conv2d_50", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_13", 0, 0, {}]]]}, {"name": "activation_34", "class_name": "Activation", "config": {"name": "activation_34", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_50", 0, 0, {}]]]}, {"name": "concatenate_14", "class_name": "Concatenate", "config": {"name": "concatenate_14", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_13", 0, 0, {}], ["activation_34", 0, 0, {}]]]}, {"name": "conv2d_51", "class_name": "Conv2D", "config": {"name": "conv2d_51", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_14", 0, 0, {}]]]}, {"name": "activation_35", "class_name": "Activation", "config": {"name": "activation_35", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_51", 0, 0, {}]]]}, {"name": "concatenate_15", "class_name": "Concatenate", "config": {"name": "concatenate_15", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_14", 0, 0, {}], ["activation_35", 0, 0, {}]]]}, {"name": "conv2d_52", "class_name": "Conv2D", "config": {"name": "conv2d_52", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_15", 0, 0, {}]]]}, {"name": "activation_36", "class_name": "Activation", "config": {"name": "activation_36", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_52", 0, 0, {}]]]}, {"name": "concatenate_16", "class_name": "Concatenate", "config": {"name": "concatenate_16", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_15", 0, 0, {}], ["activation_36", 0, 0, {}]]]}, {"name": "conv2d_53", "class_name": "Conv2D", "config": {"name": "conv2d_53", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_16", 0, 0, {}]]]}, {"name": "activation_37", "class_name": "Activation", "config": {"name": "activation_37", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_53", 0, 0, {}]]]}, {"name": "concatenate_17", "class_name": "Concatenate", "config": {"name": "concatenate_17", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_16", 0, 0, {}], ["activation_37", 0, 0, {}]]]}, {"name": "conv2d_54", "class_name": "Conv2D", "config": {"name": "conv2d_54", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_17", 0, 0, {}]]]}, {"name": "activation_38", "class_name": "Activation", "config": {"name": "activation_38", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_54", 0, 0, {}]]]}, {"name": "concatenate_18", "class_name": "Concatenate", "config": {"name": "concatenate_18", "trainable": true, "axis": 3}, "inbound_nodes": [[["concatenate_17", 0, 0, {}], ["activation_38", 0, 0, {}]]]}, {"name": "conv2d_55", "class_name": "Conv2D", "config": {"name": "conv2d_55", "trainable": true, "filters": 32, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_18", 0, 0, {}]]]}, {"name": "add_20", "class_name": "Add", "config": {"name": "add_20", "trainable": true}, "inbound_nodes": [[["conv2d_55", 0, 0, {}], ["add_19", 0, 0, {}]]]}, {"name": "concatenate_19", "class_name": "Concatenate", "config": {"name": "concatenate_19", "trainable": true, "axis": 3}, "inbound_nodes": [[["add_18", 0, 0, {}], ["add_19", 0, 0, {}], ["add_20", 0, 0, {}]]]}, {"name": "conv2d_56", "class_name": "Conv2D", "config": {"name": "conv2d_56", "trainable": true, "filters": 32, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_19", 0, 0, {}]]]}, {"name": "conv2d_57", "class_name": "Conv2D", "config": {"name": "conv2d_57", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["conv2d_56", 0, 0, {}]]]}, {"name": "add_21", "class_name": "Add", "config": {"name": "add_21", "trainable": true}, "inbound_nodes": [[["conv2d_57", 0, 0, {}], ["conv2d_1", 0, 0, {}]]]}, {"name": "conv2d_58", "class_name": "Conv2D", "config": {"name": "conv2d_58", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_21", 0, 0, {}]]]}, {"name": "lambda_1", "class_name": "Lambda", "config": {"name": "lambda_1", "trainable": true, "function": ["4wEAAAAAAAAAAQAAAAMAAABTAAAAcwwAAAB0AGoBfABkAYMCUwApAk7pAgAAACkC2gJ0ZtoOZGVw\ndGhfdG9fc3BhY2UpAdoBeKkAcgUAAAD6MC9ob21lL215eWUvRGVlcExlYXJuaW5nRGVibHVyL3Ny\nYy9tb2RlbC9tb2RlbC5wedoIPGxhbWJkYT5cAAAA8wAAAAA=\n", null, null], "function_type": "lambda", "output_shape": null, "output_shape_type": "raw", "arguments": {}}, "inbound_nodes": [[["conv2d_58", 0, 0, {}]]]}, {"name": "conv2d_59", "class_name": "Conv2D", "config": {"name": "conv2d_59", "trainable": true, "filters": 3, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["lambda_1", 0, 0, {}]]]}, {"name": "activation_39", "class_name": "Activation", "config": {"name": "activation_39", "trainable": true, "activation": "tanh"}, "inbound_nodes": [[["conv2d_59", 0, 0, {}]]]}, {"name": "imageUp", "class_name": "InputLayer", "config": {"batch_input_shape": [null, null, null, 3], "dtype": "float32", "sparse": false, "name": "imageUp"}, "inbound_nodes": []}, {"name": "lambda_2", "class_name": "Lambda", "config": {"name": "lambda_2", "trainable": true, "function": ["4wEAAAAAAAAAAQAAAAIAAABTAAAAcwwAAAB8AGQBGwBkAhcAUwApA07pAgAAAGcAAAAAAADgP6kA\nKQHaAXhyAgAAAHICAAAA+jAvaG9tZS9teXllL0RlZXBMZWFybmluZ0RlYmx1ci9zcmMvbW9kZWwv\nbW9kZWwucHnaCDxsYW1iZGE+XwAAAPMAAAAA\n", null, null], "function_type": "lambda", "output_shape": null, "output_shape_type": "raw", "arguments": {}}, "inbound_nodes": [[["activation_39", 0, 0, {}]]]}, {"name": "concatenate_20", "class_name": "Concatenate", "config": {"name": "concatenate_20", "trainable": true, "axis": 3}, "inbound_nodes": [[["imageUp", 0, 0, {}], ["lambda_2", 0, 0, {}]]]}, {"name": "conv2d_60", "class_name": "Conv2D", "config": {"name": "conv2d_60", "trainable": true, "filters": 32, "kernel_size": [5, 5], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_20", 0, 0, {}]]]}, {"name": "activation_40", "class_name": "Activation", "config": {"name": "activation_40", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_60", 0, 0, {}]]]}, {"name": "conv2d_61", "class_name": "Conv2D", "config": {"name": "conv2d_61", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_40", 0, 0, {}]]]}, {"name": "activation_41", "class_name": "Activation", "config": {"name": "activation_41", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_61", 0, 0, {}]]]}, {"name": "conv2d_62", "class_name": "Conv2D", "config": {"name": "conv2d_62", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_41", 0, 0, {}]]]}, {"name": "add_22", "class_name": "Add", "config": {"name": "add_22", "trainable": true}, "inbound_nodes": [[["conv2d_62", 0, 0, {}], ["activation_40", 0, 0, {}]]]}, {"name": "conv2d_63", "class_name": "Conv2D", "config": {"name": "conv2d_63", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_22", 0, 0, {}]]]}, {"name": "activation_42", "class_name": "Activation", "config": {"name": "activation_42", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_63", 0, 0, {}]]]}, {"name": "conv2d_64", "class_name": "Conv2D", "config": {"name": "conv2d_64", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_42", 0, 0, {}]]]}, {"name": "add_23", "class_name": "Add", "config": {"name": "add_23", "trainable": true}, "inbound_nodes": [[["conv2d_64", 0, 0, {}], ["add_22", 0, 0, {}]]]}, {"name": "conv2d_65", "class_name": "Conv2D", "config": {"name": "conv2d_65", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_23", 0, 0, {}]]]}, {"name": "activation_43", "class_name": "Activation", "config": {"name": "activation_43", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_65", 0, 0, {}]]]}, {"name": "conv2d_66", "class_name": "Conv2D", "config": {"name": "conv2d_66", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_43", 0, 0, {}]]]}, {"name": "add_24", "class_name": "Add", "config": {"name": "add_24", "trainable": true}, "inbound_nodes": [[["conv2d_66", 0, 0, {}], ["add_23", 0, 0, {}]]]}, {"name": "conv2d_67", "class_name": "Conv2D", "config": {"name": "conv2d_67", "trainable": true, "filters": 64, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_24", 0, 0, {}]]]}, {"name": "activation_44", "class_name": "Activation", "config": {"name": "activation_44", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_67", 0, 0, {}]]]}, {"name": "conv2d_68", "class_name": "Conv2D", "config": {"name": "conv2d_68", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_44", 0, 0, {}]]]}, {"name": "activation_45", "class_name": "Activation", "config": {"name": "activation_45", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_68", 0, 0, {}]]]}, {"name": "conv2d_69", "class_name": "Conv2D", "config": {"name": "conv2d_69", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_45", 0, 0, {}]]]}, {"name": "add_25", "class_name": "Add", "config": {"name": "add_25", "trainable": true}, "inbound_nodes": [[["conv2d_69", 0, 0, {}], ["activation_44", 0, 0, {}]]]}, {"name": "conv2d_70", "class_name": "Conv2D", "config": {"name": "conv2d_70", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_25", 0, 0, {}]]]}, {"name": "activation_46", "class_name": "Activation", "config": {"name": "activation_46", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_70", 0, 0, {}]]]}, {"name": "conv2d_71", "class_name": "Conv2D", "config": {"name": "conv2d_71", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_46", 0, 0, {}]]]}, {"name": "add_26", "class_name": "Add", "config": {"name": "add_26", "trainable": true}, "inbound_nodes": [[["conv2d_71", 0, 0, {}], ["add_25", 0, 0, {}]]]}, {"name": "conv2d_72", "class_name": "Conv2D", "config": {"name": "conv2d_72", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_26", 0, 0, {}]]]}, {"name": "activation_47", "class_name": "Activation", "config": {"name": "activation_47", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_72", 0, 0, {}]]]}, {"name": "conv2d_73", "class_name": "Conv2D", "config": {"name": "conv2d_73", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_47", 0, 0, {}]]]}, {"name": "add_27", "class_name": "Add", "config": {"name": "add_27", "trainable": true}, "inbound_nodes": [[["conv2d_73", 0, 0, {}], ["add_26", 0, 0, {}]]]}, {"name": "conv2d_74", "class_name": "Conv2D", "config": {"name": "conv2d_74", "trainable": true, "filters": 128, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_27", 0, 0, {}]]]}, {"name": "activation_48", "class_name": "Activation", "config": {"name": "activation_48", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_74", 0, 0, {}]]]}, {"name": "conv2d_75", "class_name": "Conv2D", "config": {"name": "conv2d_75", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_48", 0, 0, {}]]]}, {"name": "activation_49", "class_name": "Activation", "config": {"name": "activation_49", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_75", 0, 0, {}]]]}, {"name": "conv2d_76", "class_name": "Conv2D", "config": {"name": "conv2d_76", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_49", 0, 0, {}]]]}, {"name": "add_28", "class_name": "Add", "config": {"name": "add_28", "trainable": true}, "inbound_nodes": [[["conv2d_76", 0, 0, {}], ["activation_48", 0, 0, {}]]]}, {"name": "conv2d_77", "class_name": "Conv2D", "config": {"name": "conv2d_77", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_28", 0, 0, {}]]]}, {"name": "activation_50", "class_name": "Activation", "config": {"name": "activation_50", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_77", 0, 0, {}]]]}, {"name": "conv2d_78", "class_name": "Conv2D", "config": {"name": "conv2d_78", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_50", 0, 0, {}]]]}, {"name": "add_29", "class_name": "Add", "config": {"name": "add_29", "trainable": true}, "inbound_nodes": [[["conv2d_78", 0, 0, {}], ["add_28", 0, 0, {}]]]}, {"name": "conv2d_79", "class_name": "Conv2D", "config": {"name": "conv2d_79", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_29", 0, 0, {}]]]}, {"name": "activation_51", "class_name": "Activation", "config": {"name": "activation_51", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_79", 0, 0, {}]]]}, {"name": "conv2d_80", "class_name": "Conv2D", "config": {"name": "conv2d_80", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_51", 0, 0, {}]]]}, {"name": "add_30", "class_name": "Add", "config": {"name": "add_30", "trainable": true}, "inbound_nodes": [[["conv2d_80", 0, 0, {}], ["add_29", 0, 0, {}]]]}, {"name": "conv2d_81", "class_name": "Conv2D", "config": {"name": "conv2d_81", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_30", 0, 0, {}]]]}, {"name": "activation_52", "class_name": "Activation", "config": {"name": "activation_52", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_81", 0, 0, {}]]]}, {"name": "conv2d_82", "class_name": "Conv2D", "config": {"name": "conv2d_82", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_52", 0, 0, {}]]]}, {"name": "add_31", "class_name": "Add", "config": {"name": "add_31", "trainable": true}, "inbound_nodes": [[["conv2d_82", 0, 0, {}], ["add_30", 0, 0, {}]]]}, {"name": "conv2d_83", "class_name": "Conv2D", "config": {"name": "conv2d_83", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_31", 0, 0, {}]]]}, {"name": "activation_53", "class_name": "Activation", "config": {"name": "activation_53", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_83", 0, 0, {}]]]}, {"name": "conv2d_84", "class_name": "Conv2D", "config": {"name": "conv2d_84", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_53", 0, 0, {}]]]}, {"name": "add_32", "class_name": "Add", "config": {"name": "add_32", "trainable": true}, "inbound_nodes": [[["conv2d_84", 0, 0, {}], ["add_31", 0, 0, {}]]]}, {"name": "conv2d_85", "class_name": "Conv2D", "config": {"name": "conv2d_85", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_32", 0, 0, {}]]]}, {"name": "activation_54", "class_name": "Activation", "config": {"name": "activation_54", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_85", 0, 0, {}]]]}, {"name": "conv2d_86", "class_name": "Conv2D", "config": {"name": "conv2d_86", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_54", 0, 0, {}]]]}, {"name": "add_33", "class_name": "Add", "config": {"name": "add_33", "trainable": true}, "inbound_nodes": [[["conv2d_86", 0, 0, {}], ["add_32", 0, 0, {}]]]}, {"name": "conv2d_transpose_3", "class_name": "Conv2DTranspose", "config": {"name": "conv2d_transpose_3", "trainable": true, "filters": 64, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null, "output_padding": null}, "inbound_nodes": [[["add_33", 0, 0, {}]]]}, {"name": "activation_55", "class_name": "Activation", "config": {"name": "activation_55", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_transpose_3", 0, 0, {}]]]}, {"name": "add_34", "class_name": "Add", "config": {"name": "add_34", "trainable": true}, "inbound_nodes": [[["activation_55", 0, 0, {}], ["add_27", 0, 0, {}]]]}, {"name": "conv2d_87", "class_name": "Conv2D", "config": {"name": "conv2d_87", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_34", 0, 0, {}]]]}, {"name": "activation_56", "class_name": "Activation", "config": {"name": "activation_56", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_87", 0, 0, {}]]]}, {"name": "conv2d_88", "class_name": "Conv2D", "config": {"name": "conv2d_88", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_56", 0, 0, {}]]]}, {"name": "add_35", "class_name": "Add", "config": {"name": "add_35", "trainable": true}, "inbound_nodes": [[["conv2d_88", 0, 0, {}], ["add_34", 0, 0, {}]]]}, {"name": "conv2d_89", "class_name": "Conv2D", "config": {"name": "conv2d_89", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_35", 0, 0, {}]]]}, {"name": "activation_57", "class_name": "Activation", "config": {"name": "activation_57", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_89", 0, 0, {}]]]}, {"name": "conv2d_90", "class_name": "Conv2D", "config": {"name": "conv2d_90", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_57", 0, 0, {}]]]}, {"name": "add_36", "class_name": "Add", "config": {"name": "add_36", "trainable": true}, "inbound_nodes": [[["conv2d_90", 0, 0, {}], ["add_35", 0, 0, {}]]]}, {"name": "conv2d_91", "class_name": "Conv2D", "config": {"name": "conv2d_91", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_36", 0, 0, {}]]]}, {"name": "activation_58", "class_name": "Activation", "config": {"name": "activation_58", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_91", 0, 0, {}]]]}, {"name": "conv2d_92", "class_name": "Conv2D", "config": {"name": "conv2d_92", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_58", 0, 0, {}]]]}, {"name": "add_37", "class_name": "Add", "config": {"name": "add_37", "trainable": true}, "inbound_nodes": [[["conv2d_92", 0, 0, {}], ["add_36", 0, 0, {}]]]}, {"name": "conv2d_transpose_4", "class_name": "Conv2DTranspose", "config": {"name": "conv2d_transpose_4", "trainable": true, "filters": 32, "kernel_size": [5, 5], "strides": [2, 2], "padding": "same", "data_format": "channels_last", "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null, "output_padding": null}, "inbound_nodes": [[["add_37", 0, 0, {}]]]}, {"name": "activation_59", "class_name": "Activation", "config": {"name": "activation_59", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_transpose_4", 0, 0, {}]]]}, {"name": "add_38", "class_name": "Add", "config": {"name": "add_38", "trainable": true}, "inbound_nodes": [[["activation_59", 0, 0, {}], ["add_24", 0, 0, {}]]]}, {"name": "conv2d_93", "class_name": "Conv2D", "config": {"name": "conv2d_93", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_38", 0, 0, {}]]]}, {"name": "activation_60", "class_name": "Activation", "config": {"name": "activation_60", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_93", 0, 0, {}]]]}, {"name": "conv2d_94", "class_name": "Conv2D", "config": {"name": "conv2d_94", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_60", 0, 0, {}]]]}, {"name": "add_39", "class_name": "Add", "config": {"name": "add_39", "trainable": true}, "inbound_nodes": [[["conv2d_94", 0, 0, {}], ["add_38", 0, 0, {}]]]}, {"name": "conv2d_95", "class_name": "Conv2D", "config": {"name": "conv2d_95", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_39", 0, 0, {}]]]}, {"name": "activation_61", "class_name": "Activation", "config": {"name": "activation_61", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_95", 0, 0, {}]]]}, {"name": "conv2d_96", "class_name": "Conv2D", "config": {"name": "conv2d_96", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_61", 0, 0, {}]]]}, {"name": "add_40", "class_name": "Add", "config": {"name": "add_40", "trainable": true}, "inbound_nodes": [[["conv2d_96", 0, 0, {}], ["add_39", 0, 0, {}]]]}, {"name": "conv2d_97", "class_name": "Conv2D", "config": {"name": "conv2d_97", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_40", 0, 0, {}]]]}, {"name": "activation_62", "class_name": "Activation", "config": {"name": "activation_62", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["conv2d_97", 0, 0, {}]]]}, {"name": "conv2d_98", "class_name": "Conv2D", "config": {"name": "conv2d_98", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_62", 0, 0, {}]]]}, {"name": "add_41", "class_name": "Add", "config": {"name": "add_41", "trainable": true}, "inbound_nodes": [[["conv2d_98", 0, 0, {}], ["add_40", 0, 0, {}]]]}, {"name": "conv2d_99", "class_name": "Conv2D", "config": {"name": "conv2d_99", "trainable": true, "filters": 3, "kernel_size": [5, 5], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["add_41", 0, 0, {}]]]}, {"name": "activation_63", "class_name": "Activation", "config": {"name": "activation_63", "trainable": true, "activation": "tanh"}, "inbound_nodes": [[["conv2d_99", 0, 0, {}]]]}, {"name": "lambda_3", "class_name": "Lambda", "config": {"name": "lambda_3", "trainable": true, "function": ["4wEAAAAAAAAAAQAAAAIAAABTAAAAcwwAAAB8AGQBGwBkAhcAUwApA07pAgAAAGcAAAAAAADgP6kA\nKQHaAXhyAgAAAHICAAAA+jAvaG9tZS9teXllL0RlZXBMZWFybmluZ0RlYmx1ci9zcmMvbW9kZWwv\nbW9kZWwucHnaCDxsYW1iZGE+LwAAAPMAAAAA\n", null, null], "function_type": "lambda", "output_shape": null, "output_shape_type": "raw", "arguments": {}}, "inbound_nodes": [[["activation_63", 0, 0, {}]]]}], "input_layers": [["imageSmall", 0, 0], ["imageUp", 0, 0]], "output_layers": [["lambda_3", 0, 0]]}, "keras_version": "2.2.2", "backend": "tensorflow"}
================================================
FILE: code/requirements.txt
================================================
h5py==2.7.1
tensorflow-gpu==1.4.0
Keras==2.2.2
scikit-image==0.14.3
================================================
FILE: code/src/__init__.py
================================================
================================================
FILE: code/src/application.py
================================================
import os
from src.model.model import DDModel
from src.lib.data_helper import DataHelper
from skimage import io,transform,feature,color,img_as_float
import numpy as np
import math
import time
class Application():
#note that input image must be color, gray image should be expand to 3 channels
#and image size must be even
def __init__(self,config):
self.config = config
self.model = DDModel(config)
if(config.application.deblurring_result_dir is None):
config.application.deblurring_result_dir = config.resource.output_dir
if not os.path.exists(config.application.deblurring_result_dir):
os.makedirs(config.application.deblurring_result_dir)
self.__fileBlurList=[]
def start(self):
self.application()
def __tuneSize(self,shape):
pad = []
for i in range(2):
size = shape[i]
if(size % 256 == 0):
pad.append(0)
else:
n = size // 256 + 1
pad.append((n*256 - size) // 2)
return pad
def __getImage(self,fileFullPath):#self.config.application.deblurring_file_path
imageBlur = img_as_float(io.imread(fileFullPath))
#make sure row&col are even
row = imageBlur.shape[0]
col = imageBlur.shape[1]
row = row-1 if row%2==1 else row
col = col-1 if col%2==1 else col
imageBlur = imageBlur[0:row,0:col]
imageOrigin = imageBlur
pad = self.__tuneSize(imageBlur.shape)
imageBlur = np.pad(imageBlur,((pad[0],pad[0]),(pad[1],pad[1]),(0,0)),'reflect')
return imageBlur,imageOrigin
def __getData(self,root):
for parent,dirnames,filenames in os.walk(root):
for filename in filenames:
self.__fileBlurList.append(os.path.join(parent,filename))
self.data_length = len(self.__fileBlurList)
print(f'total data:{self.data_length}!')
def __deblur(self,imageBlur,imageOrigin):
pyramid = tuple(transform.pyramid_gaussian(imageBlur, downscale=2, max_layer=self.max_iter, multichannel=True))
deblurs = []
for iter in self.iters:
batch_blur2x = []
batch_blur1x = []
runtime = 0;
for i in range(iter,0,-1):
if(i == iter):#first iter
imageBlur2x = pyramid[i]
batch_blur2x.append(imageBlur2x)
batch_gen = batch_blur2x
else:
batch_blur2x = batch_blur1x
batch_blur1x = []
imageBlur1x = pyramid[i-1]
batch_blur1x.append(imageBlur1x)
data_X1 = np.concatenate((batch_blur2x,batch_gen), axis=3)#6channels
data_X = {'imageSmall':data_X1,'imageUp':np.array(batch_blur1x)}
start = time.time()
batch_gen = self.model.generator.predict(data_X)
print(f'Runtime @scale {i}:{time.time()-start:4.3f}')
runtime += time.time()-start;
print(f'Runtime total @iter {iter}:{runtime:4.3f}')
deblur = self.__clipOutput(batch_gen[0],imageOrigin.shape)
deblurs.append(deblur)
return deblurs
def application(self):
if(self.config.application.iter == 0):
self.iters = [1,2,3,4]
else:
self.iters = [self.config.application.iter]
self.max_iter = max(self.iters)
deblurring_file_path = self.config.application.deblurring_file_path
deblurring_dir_path = self.config.application.deblurring_dir_path
if(deblurring_file_path and os.path.exists(deblurring_file_path)):
imageBlur,imageOrigin = self.__getImage(deblurring_file_path)
deblurs = self.__deblur(imageBlur,imageOrigin)
infos = deblurring_file_path.rsplit('/', 1)
iter_times = len(deblurs)
for i in range(iter_times):
deblur = deblurs[i]
deblur = (deblur * 255).astype('uint8')
iter = self.iters[i]
io.imsave(os.path.join(self.config.application.deblurring_result_dir, 'deblur'+str(iter)+'_'+infos[1]),deblur)
print(f'file saved')
elif(deblurring_dir_path and os.path.exists(deblurring_dir_path)):
self.__getData(deblurring_dir_path)
index = 0
for fileFullPath in self.__fileBlurList:
imageBlur,imageOrigin = self.__getImage(fileFullPath)
deblurs = self.__deblur(imageBlur,imageOrigin)
infos = os.path.basename(fileFullPath)
iter_times = len(deblurs)
for j in range(iter_times):
deblur = deblurs[j]
deblur = (deblur * 255).astype('uint8')
iter = self.iters[j]
io.imsave(os.path.join(self.config.application.deblurring_result_dir, 'deblur'+str(iter)+'_'+infos),deblur)
index += 1
print(f'{index}/{self.data_length} done!')
print(f'all saved')
else:
print(f"no deblur file(s)")
def __clipOutput(self,image,outSize):
inSize = image.shape
start = []
for i in range(2):
start.append((inSize[i] - outSize[i]) // 2)
return image[start[0]:start[0]+outSize[0],start[1]:start[1]+outSize[1]]
================================================
FILE: code/src/config.py
================================================
import os
import getpass
def _project_dir():
d = os.path.dirname
return d(d(os.path.abspath(__file__)))
class Config:
def __init__(self):
self.resource = ResourceConfig()
self.trainer = TrainConfig()
self.tester = TestConfig()
self.application = Application()
class ResourceConfig:
def __init__(self):
self.project_dir = os.environ.get("PROJECT_DIR", _project_dir())
self.data_dir = os.environ.get("DATA_DIR", os.path.join(_project_dir(), "data"))
self.model_dir = os.environ.get("MODEL_DIR", os.path.join(self.project_dir, "model"))
self.debug_dir = os.environ.get("DEBUG_DIR", os.path.join(self.project_dir, "debug"))
self.output_dir = os.environ.get("OUTPUT_DIR", os.path.join(self.project_dir, "output"))
self.generator_json_path = os.path.join(self.model_dir, "generator.json")
self.generator_weights_path = os.path.join(self.model_dir, "generator.h5")
self.train_directory_path = "/mnt/SD_1/myye/Deblur/GoPro/train"
self.test_directory_path = "/mnt/SD_1/myye/Deblur/GoPro/test"
def create_directories(self):
dirs = [self.project_dir, self.data_dir, self.model_dir, self.debug_dir, self.output_dir]
for d in dirs:
if not os.path.exists(d):
os.makedirs(d)
class TrainConfig:
def __init__(self):
self.generatorImageSize = 256
self.generatorImageChannels = 3
self.batch_size = 8
self.maxEpoch = 2000
self.gpu_num = 1
class TestConfig:
def __init__(self):
self.iter = 0
class Application:
def __init__(self):
self.iter = 4#try all iter(1,2,3,4) if set 0
self.deblurring_file_path = None
self.deblurring_dir_path = None
self.deblurring_result_dir = None
================================================
FILE: code/src/lib/MLVSharpnessMeasure.py
================================================
import numpy as np
from scipy.special import gamma
from skimage import color
class MLVMeasurement():
def __init__(self):
self.gam = np.linspace(0.2,10,9801)
def __estimateggdparam(self,vec):
gam = self.gam
r_gam = (gamma(1/gam)*gamma(3/gam))/((gamma(2/gam)) ** 2)
sigma_sq = np.mean(vec ** 2)
sigma = np.sqrt(sigma_sq)
return sigma
def __MLVMap(self,img):
xs, ys = img.shape
x=img
x1=np.zeros((xs,ys))
x2=np.zeros((xs,ys))
x3=np.zeros((xs,ys))
x4=np.zeros((xs,ys))
x5=np.zeros((xs,ys))
x6=np.zeros((xs,ys))
x7=np.zeros((xs,ys))
x8=np.zeros((xs,ys))
x9=np.zeros((xs,ys))
x1[0:xs-2,0:ys-2] = x[1:xs-1,1:ys-1]
x2[0:xs-2,1:ys-1] = x[1:xs-1,1:ys-1]
x3[0:xs-2,2:ys] = x[1:xs-1,1:ys-1]
x4[1:xs-1,0:ys-2] = x[1:xs-1,1:ys-1]
x5[1:xs-1,1:ys-1] = x[1:xs-1,1:ys-1]
x6[1:xs-1,2:ys] = x[1:xs-1,1:ys-1]
x7[2:xs,0:ys-2] = x[1:xs-1,1:ys-1]
x8[2:xs,1:ys-1] = x[1:xs-1,1:ys-1]
x9[2:xs,2:ys] = x[1:xs-1,1:ys-1]
x1=x1[1:xs-1,1:ys-1]
x2=x2[1:xs-1,1:ys-1]
x3=x3[1:xs-1,1:ys-1]
x4=x4[1:xs-1,1:ys-1]
x5=x5[1:xs-1,1:ys-1]
x6=x6[1:xs-1,1:ys-1]
x7=x7[1:xs-1,1:ys-1]
x8=x8[1:xs-1,1:ys-1]
x9=x9[1:xs-1,1:ys-1]
dd=[]
dd.append(x1-x5)
dd.append(x2-x5)
dd.append(x3-x5)
dd.append(x4-x5)
dd.append(x6-x5)
dd.append(x7-x5)
dd.append(x8-x5)
dd.append(x9-x5)
map = np.max(dd,axis=0)
return map
def getScore(self,x):#x should be double gray image
if(x.ndim == 3):#color
x = color.rgb2gray(x)
map = self.__MLVMap(x)
xs,ys = map.shape
xy_number=xs*ys
vec = map.reshape((xy_number,))
vec[::-1].sort()#descend
svec=vec[0:xy_number]
a=np.arange(xy_number)
q=np.exp(-0.01*a)
svec=svec*q
svec=svec[0:1000]
return self.__estimateggdparam(svec)
================================================
FILE: code/src/lib/__init__.py
================================================
================================================
FILE: code/src/lib/data_helper.py
================================================
import os
from skimage import io,img_as_float # image process
import numpy as np
class DataHelper:
def __init__(self):
self.__fileBlurList=[]
self.__directoryList=[]
self.__blurSharpPairs=[]
def __traversalDir(self,root):
for name in os.listdir(root):
fullPath = os.path.join(root, name)
if os.path.isdir(fullPath):
self.__directoryList.append(fullPath)
for directory in self.__directoryList:
for parent,dirnames,filenames in os.walk(os.path.join(directory,'blur')):
for filename in filenames:
self.__fileBlurList.append(os.path.join(parent,filename))
def load_data(self, path, number):#shuffle
self.__traversalDir(path)
if(number>0):
np.random.shuffle(self.__fileBlurList)
totalLoaded = 0
print(f'start loading dataset...')
for fileFullPath in self.__fileBlurList:
#imageBlur = io.imread(fileFullPath,as_gray=True)
#imageSharp = io.imread(fileFullPath.replace('/blur','/sharp'),as_gray=True)
imageBlur = img_as_float(io.imread(fileFullPath))
imageSharp = img_as_float(io.imread(fileFullPath.replace('/blur','/sharp')))
self.__blurSharpPairs.append((imageBlur,imageSharp))
totalLoaded += 1
if(totalLoaded == number):#if number < 1, all datas loaded
break
print(f'dataset loaded:{totalLoaded}!')
def getRandomTrainDatas(self,config):
X_train=[]
Y_train=[]
patchW = patchH = config.trainer.generatorImageSize
for imageBlur,imageSharp in self.__blurSharpPairs:
trainImageH = imageBlur.shape[0]
trainImageW = imageBlur.shape[1]
rowStart = np.random.randint(0, trainImageH-patchH)
colStart = np.random.randint(0, trainImageW-patchW)
X_train.append(imageBlur[rowStart:rowStart+patchH,colStart:colStart+patchW])
Y_train.append(imageSharp[rowStart:rowStart+patchH,colStart:colStart+patchW])
return X_train,Y_train#(row,col)
def getTestDatas(self):
#for imageBlur,imageSharp in self.__blurSharpPairs:
return self.__fileBlurList
def getLoadedPairs(self):
return self.__blurSharpPairs
def loadDataList(self, path):
self.__traversalDir(path)
data_length = len(self.__fileBlurList)
print(f'dataset got:{data_length}!')
return data_length
def getAPair(self,index,config):
fileFullPath = self.__fileBlurList[index]
imageBlur = img_as_float(io.imread(fileFullPath))
imageSharp = img_as_float(io.imread(fileFullPath.replace('/blur','/sharp')))
patchW = patchH = config.trainer.generatorImageSize
trainImageH = imageBlur.shape[0]
trainImageW = imageBlur.shape[1]
rowStart = np.random.randint(0, trainImageH-patchH)
colStart = np.random.randint(0, trainImageW-patchW)
return imageBlur[rowStart:rowStart+patchH,colStart:colStart+patchW],imageSharp[rowStart:rowStart+patchH,colStart:colStart+patchW]
================================================
FILE: code/src/lib/data_producer.py
================================================
import os
from skimage import io,img_as_float # image process
import numpy as np
import threading
class DataProducer(threading.Thread):
def __init__(self, name,queue,config):
threading.Thread.__init__(self, name=name,daemon=True)
self.data=queue
self.__fileBlurList=[]
self.__directoryList=[]
self.__blurSharpParis=[]
self.config = config
self.running = True
def __traversalDir(self,root):
for name in os.listdir(root):
fullPath = os.path.join(root, name)
if os.path.isdir(fullPath):
self.__directoryList.append(fullPath)
for directory in self.__directoryList:
for parent,dirnames,filenames in os.walk(os.path.join(directory,'blur')):
for filename in filenames:
self.__fileBlurList.append(os.path.join(parent,filename))
def loadDataList(self, path):
self.__traversalDir(path)
self.data_length = len(self.__fileBlurList)
print(f'dataset got:{self.data_length}!')
return self.data_length
def __produceAPair(self,index):
fileFullPath = self.__fileBlurList[index]
imageBlur = img_as_float(io.imread(fileFullPath))
imageSharp = img_as_float(io.imread(fileFullPath.replace('/blur','/sharp')))
patchW = patchH = self.config.trainer.generatorImageSize
trainImageH = imageBlur.shape[0]
trainImageW = imageBlur.shape[1]
rowStart = np.random.randint(0, trainImageH-patchH)
colStart = np.random.randint(0, trainImageW-patchW)
blur = imageBlur[rowStart:rowStart+patchH,colStart:colStart+patchW]
sharp = imageSharp[rowStart:rowStart+patchH,colStart:colStart+patchW]
self.data.put((blur,sharp),1)#block
def run(self):
arr = np.arange(self.data_length)
while(True):
#an epoch
np.random.shuffle(arr)
for i in range(self.data_length):
index = arr[i]
self.__produceAPair(index)
================================================
FILE: code/src/lib/tf_util.py
================================================
def set_session_config(per_process_gpu_memory_fraction=None, allow_growth=None, device_list='0'):
"""
:param allow_growth: When necessary, reserve memory
:param float per_process_gpu_memory_fraction: specify GPU memory usage as 0 to 1
:return:
"""
import tensorflow as tf
import keras.backend as K
config = tf.ConfigProto(
gpu_options=tf.GPUOptions(
per_process_gpu_memory_fraction=per_process_gpu_memory_fraction,
allow_growth=allow_growth,
visible_device_list=device_list
)
)
sess = tf.Session(config=config)
K.set_session(sess)
================================================
FILE: code/src/model/__init__.py
================================================
================================================
FILE: code/src/model/model.py
================================================
import os
import tensorflow as tf
from keras.layers import *
from keras.initializers import glorot_uniform
from keras.models import Sequential,Model,load_model
from keras.layers.advanced_activations import LeakyReLU
import keras.backend as K
class DDModel:#Details Deblurring Model
def __init__(self,config):
self.config = config
self.generator = self.build_generator((None,None,6),(None,None,3))
def __resblock(self,X,filter_num):
# Save the input value.
X_shortcut = X
X = Conv2D(filters = filter_num, kernel_size = (3, 3), strides = (1,1), padding = 'same')(X)
X = Activation('relu')(X)
X = Conv2D(filters = filter_num, kernel_size = (3, 3), strides = (1,1), padding = 'same')(X)
X = Add()([X, X_shortcut])
return X
def __eblock(self,X,filter_num,stride):
X = Conv2D(filters = filter_num, kernel_size = (5, 5), strides = (stride,stride), padding = 'same')(X)
X = Activation('relu')(X)
for i in range(3):
X = self.__resblock(X,filter_num)
return X
def __dblock(self,X,filter_num,stride):
for i in range(3):
X = self.__resblock(X,filter_num*2)
X = Conv2DTranspose(filter_num, kernel_size = (5, 5), strides = (stride, stride), padding='same')(X)
X = Activation('relu')(X)
return X
def __outblock(self,X,filter_num):
for i in range(3):
X = self.__resblock(X,filter_num)
X = Conv2D(3, kernel_size = (5, 5), strides = (1, 1), padding='same')(X)
X = Activation('tanh')(X)
X = Lambda(lambda x: x/2+0.5)(X)
return X
def __unet1(self,X):
e32 = self.__eblock(X,32,1)#None,None,32
e64 = self.__eblock(e32,64,2)#/2,64
e128 = self.__eblock(e64,128,2)#/4,128
d64 = self.__dblock(e128,64,2)#/2,64
d64e64 = Add()([d64, e64])
d32 = self.__dblock(d64e64,32,2)#None,None,32
d32e32 = Add()([d32, e32])
#d3 = self.__outblock(d32e32,32)
return d32e32
def __unet2(self,X):
e32 = self.__eblock(X,32,1)#None,None,32
e64 = self.__eblock(e32,64,2)#/2,64
e128 = self.__eblock(e64,128,2)#/4,128
d64 = self.__dblock(e128,64,2)#/2,64
d64e64 = Add()([d64, e64])
d32 = self.__dblock(d64e64,32,2)#None,None,32
d32e32 = Add()([d32, e32])
d3 = self.__outblock(d32e32,32)
return d3
def __makeDense(self,X,growthRate):
out = Conv2D(filters = growthRate, kernel_size = (3, 3), strides = (1,1), padding = 'same', use_bias=False)(X)
out = Activation('relu')(out)
out = concatenate([X,out], axis=3)
return out
def __RDB(self,X,nChannels,nDenselayer,growthRate):
X_shortcut = X
for i in range(nDenselayer):
X = self.__makeDense(X, growthRate)
X = Conv2D(filters = nChannels, kernel_size = (1, 1), strides = (1,1), padding = 'same', use_bias=False)(X)
X = Add()([X, X_shortcut])
return X
def build_generator(self,input_shapeA,input_shapeB):#unet
if(self.load(self.config.resource.generator_json_path,self.config.resource.generator_weights_path)):
return self.model
else:#init
print(f'init network parameters')
inputsA = Input(input_shapeA,name='imageSmall')#None,None,6
inputsB = Input(input_shapeB,name='imageUp')#None,None,3
#layer 1
F_ = Conv2D(filters = 32, kernel_size = (3, 3), strides = (1,1), padding = 'same')(inputsA)#conv1
F_0 = self.__unet1(F_)#32
F_1 = self.__RDB(F_0,32,6,32)#RDB1
F_2 = self.__RDB(F_1,32,6,32)#RDB2
F_3 = self.__RDB(F_2,32,6,32)#RDB3
FF = concatenate([F_1, F_2,F_3], axis=3)
FdLF = Conv2D(filters = 32, kernel_size = (1, 1), strides = (1,1), padding = 'same')(FF)
FGF = Conv2D(filters = 32, kernel_size = (3, 3), strides = (1,1), padding = 'same')(FdLF)
FDF = Add()([FGF, F_])
us = Conv2D(filters = 32*4, kernel_size = (3, 3), strides = (1,1), padding = 'same')(FDF)
us = Lambda(lambda x: tf.depth_to_space(x,2))(us)#x2(upsample),32
d3 = Conv2D(filters = 3, kernel_size = (3, 3), strides = (1,1), padding = 'same')(us)
d3 = Activation('tanh')(d3)
d3 = Lambda(lambda x: x/2+0.5)(d3)
combined = concatenate([inputsB, d3], axis=3)#blur-generator,6
o2 = self.__unet2(combined)
model = Model(inputs=[inputsA,inputsB], outputs=o2, name='generator')
return model
def load(self, json_path, weights_path):
from keras.models import model_from_json
if os.path.exists(json_path) and os.path.exists(weights_path):
json_file = open(json_path, 'r')
loaded_model_json = json_file.read()
json_file.close()
self.model = model_from_json(loaded_model_json,custom_objects={'tf':tf})
# load weights into new model
self.model.load_weights(weights_path)
print("Loaded model from disk")
return True
else:
return False
def save(self, model, json_path, weights_path):
# serialize model to JSON
model_json = model.to_json()
with open(json_path, "w") as json_file:
json_file.write(model_json)
# serialize weights to HDF5
model.save_weights(weights_path)
print("Saved model to disk")
================================================
FILE: code/src/tester.py
================================================
import os
from src.model.model import DDModel
from src.lib.data_helper import DataHelper
from src.lib.MLVSharpnessMeasure import MLVMeasurement
from skimage import io,transform #reize image
import numpy as np
import pickle
import math
class Tester():
def __init__(self,config):
self.config = config
self.model = DDModel(config)
self.batch_size = 8
self.current_size = 0
self.pyramid_blurs = []
self.batch_sharps = []
#metrics
self.all_psnrs = {}
def start(self):
if(self.config.tester.iter == 0):
self.iters = [1,2,3,4]
else:
self.iters = [self.config.application.iter]
self.max_iter = max(self.iters)
for iter in self.iters:
self.all_psnrs[iter] = []
#json_path=self.config.resource.generator_json_path
#infos = json_path.split('generator')
#infos = infos[1].split('.')
#json_info = infos[0]
#weights_path=self.config.resource.generator_weights_path
#infos = weights_path.split('generator')
#infos = infos[1].split('.')
#weights_info = infos[0]
#print(f'json/weight:{json_info}/{weights_info}')
print(f'test strategy:{self.iters}')
self.test()
def __compute_psnr(self, x , label , max_diff):
mse = np.mean(( x - label ) **2 )
return 10*math.log10( max_diff**2 / mse )
def __doBatchTest(self):
n = len(self.pyramid_blurs)
for iter in self.iters:
batch_blurs2x = []
batch_blurs1x = []
for i in range(iter,0,-1):
if(i == iter):#first iter
#generate batch_blurs2x
for j in range(n):
pyramid_blur = self.pyramid_blurs[j]
imageBlur2x = pyramid_blur[i]
batch_blurs2x.append(imageBlur2x)
batch_gen = batch_blurs2x
else:
#generate batch_blurs2x
batch_blurs2x = batch_blurs1x
batch_blurs1x = []
#generate batch_blurs1x
for j in range(n):
pyramid_blur = self.pyramid_blurs[j]
imageBlur1x = pyramid_blur[i-1]
batch_blurs1x.append(imageBlur1x)
#data prepare end
#predict 2x
data_X1 = np.concatenate((batch_blurs2x,batch_gen), axis=3)#6channels
data_X = {'imageSmall':data_X1,'imageUp':np.array(batch_blurs1x)}
batch_gen = self.model.generator.predict(data_X)
#calculate metrics
for i in range(n):
pImage = batch_gen[i]
pImage = pImage[24:744]
psnr = self.__compute_psnr(pImage, self.batch_sharps[i], 1)
self.all_psnrs[iter].append(psnr)
#reset
self.current_size = 0
self.pyramid_blurs = []
self.batch_sharps = []
def __doInteration(self,blur,sharp):
#self.sharpness.append(self.measure.getScore(blur))
if(self.current_size < self.batch_size):
blur = np.pad(blur,((24,24),(0,0),(0,0)),'reflect')#be divided by 256
self.pyramid_blurs.append(tuple(transform.pyramid_gaussian(blur, downscale=2, max_layer=self.max_iter, multichannel=True)))
self.batch_sharps.append(sharp)
self.current_size += 1
if(self.current_size == self.batch_size):#train a batch
self.__doBatchTest()
def test(self):
dataHelper = DataHelper()
dataHelper.load_data(self.config.resource.test_directory_path,0)
blurSharpParis = dataHelper.getLoadedPairs()
for imageBlur,imageSharp in blurSharpParis:
self.__doInteration(imageBlur,imageSharp)
if(self.pyramid_blurs):
self.__doBatchTest()
#analyse results
psnrs = []
for iter in self.iters:
psnrs.append(self.all_psnrs[iter])
psnrs = np.array(psnrs)
psnrs_by_iter = np.mean(psnrs,axis=1)
for i in range(len(psnrs_by_iter)):
print(f'PSNR:{psnrs_by_iter[i]}@{self.iters[i]}')
best_psnrs = np.amax(psnrs,axis=0)
path=os.path.join(self.config.resource.output_dir, "psnrs.pkl")
with open(path, 'wb') as pfile:
pickle.dump(best_psnrs, pfile, protocol=pickle.HIGHEST_PROTOCOL)
best_iters_index = np.argmax(psnrs,axis=0)
iters = np.array(self.iters)
best_iters = iters[best_iters_index]
path=os.path.join(self.config.resource.output_dir, "iters.pkl")
with open(path, 'wb') as pfile:
pickle.dump(best_iters, pfile, protocol=pickle.HIGHEST_PROTOCOL)
calculate_data_n = len(best_psnrs)
#path=os.path.join(self.config.resource.output_dir, "sharpness.pkl")
#with open(path, 'wb') as pfile:
# pickle.dump(self.sharpness, pfile, protocol=pickle.HIGHEST_PROTOCOL)
calculate_data_n = len(best_psnrs)
print(f'{calculate_data_n}/{len(blurSharpParis)} done! Average PSNRs(Best):{np.mean(best_psnrs)}')
================================================
FILE: code/src/trainer.py
================================================
from src.model.model import DDModel
from src.lib.data_producer import DataProducer
import tensorflow as tf
import keras.backend as K
from keras.optimizers import RMSprop,Adam
from skimage import io,transform,feature,color
import numpy as np
import sys
from keras.utils.training_utils import multi_gpu_model
import queue
import threading
class Trainer():
def __init__(self,config):
self.config = config
self.model = DDModel(config)
self.batch_size = config.trainer.batch_size
self.learningSteps = [1e-4,3e-5,5e-6,1e-6]
#self.learningSteps = [1e-4,3e-5]
self.currentStep = 0
self.bestLoss = 2
self.bestEpoch = 0
self.current_size = 0
self.iters = [3]
self.iter_length = len(self.iters)
self.pyramid_blurs = []
self.pyramid_sharps = []
def start(self):
#json_path=self.config.resource.generator_json_path
#infos = json_path.split('generator')
#infos = infos[1].split('.')
#json_info = infos[0]
#weights_path=self.config.resource.generator_weights_path
#infos = weights_path.split('generator')
#infos = infos[1].split('.')
#weights_info = infos[0]
#print(f'json/weight:{json_info}/{weights_info}')
self.train(self.config.trainer.maxEpoch)
def __trainBatch(self):
batch_blurs2x = []
batch_blurs1x = []
batch_sharps1x = []
n = len(self.pyramid_blurs)
for i in range(self.max_iter,0,-1):
if(i == self.max_iter):#first iter
#generate batch_blurs2x
for j in range(n):
pyramid_blur = self.pyramid_blurs[j]
imageBlur2x = pyramid_blur[i]
batch_blurs2x.append(imageBlur2x)
batch_gen = batch_blurs2x
else:
#generate batch_blurs2x
batch_blurs2x = batch_blurs1x
batch_blurs1x = []
batch_sharps1x = []
#generate batch_blurs1x
for j in range(n):
pyramid_blur = self.pyramid_blurs[j]
imageBlur1x = pyramid_blur[i-1]
batch_blurs1x.append(imageBlur1x)
#generate batch_sharps1x
for j in range(n):
pyramid_sharp = self.pyramid_sharps[j]
imageSharp1x = pyramid_sharp[i-1]
batch_sharps1x.append(imageSharp1x)
#data generate end
#train Generator 2x
train_X1 = np.concatenate((batch_blurs2x,batch_gen), axis=3)#6channels
train_X = {'imageSmall':train_X1,'imageUp':np.array(batch_blurs1x)}
g_loss = self.generator.train_on_batch(train_X,np.array(batch_sharps1x))
if(i == 1):#last iter
self.g_loss += g_loss * n
else:
batch_gen = self.generator.predict(train_X)
#train end,reset
self.current_size = 0
self.pyramid_blurs = []
self.pyramid_sharps = []
def __doInteration(self,blur,sharp,epoch):
iter_index = epoch%self.iter_length
self.max_iter = self.iters[iter_index]
if(self.current_size < self.batch_size):
self.pyramid_blurs.append(tuple(transform.pyramid_gaussian(blur, downscale=2, max_layer=self.max_iter, multichannel=True)))
self.pyramid_sharps.append(tuple(transform.pyramid_gaussian(sharp, downscale=2, max_layer=self.max_iter, multichannel=True)))
self.current_size += 1
if(self.current_size == self.batch_size):#train a batch
self.__trainBatch()
def __nextStep(self):
#lr = K.get_value(self.generator.optimizer.lr)
self.currentStep += 1
if(self.currentStep < len(self.learningSteps)):
lr = self.learningSteps[self.currentStep]
K.set_value(self.generator.optimizer.lr, lr)
self.model.save(self.model.generator,self.config.resource.generator_json_path,self.config.resource.generator_weights_path)
f_lr = "{:.2e}".format(lr)
print(f'learning rate:{f_lr}')
return False
else:#early end
return True
def __learningScheduler(self,epoch):
if(epoch == 0):
lr = K.get_value(self.generator.optimizer.lr)
f_lr = "{:.2e}".format(lr)
print(f'learning rate:{f_lr}')
return False
if(self.bestLoss>self.g_loss):
self.bestLoss = self.g_loss
self.bestEpoch = epoch
if(self.currentStep == len(self.learningSteps)-1):#last step
self.model.save(self.model.generator,self.config.resource.generator_json_path,self.config.resource.generator_weights_path)
return False
#self.bestLoss<=self.g_loss, model not improved
if(self.currentStep == len(self.learningSteps)-1):#last step
patience = 50
else:
patience = 30
if(epoch-self.bestEpoch >= patience):
return self.__nextStep()
def train(self,maxEpoch):
optimizer = Adam(self.learningSteps[self.currentStep])
if(self.config.trainer.gpu_num>1):
self.generator = multi_gpu_model(self.model.generator, self.config.trainer.gpu_num)
else:
self.generator = self.model.generator
self.generator.compile(loss='mean_absolute_error', optimizer=optimizer)
print(f'generator:{self.generator.metrics_names}')
print(f'training strategy:{self.iters}')
image_queue = queue.Queue(maxsize=self.config.trainer.batch_size*4)
dataProducer = DataProducer('Producer',image_queue,self.config)
n = dataProducer.loadDataList(self.config.resource.train_directory_path)
dataProducer.start()
for epoch in range(maxEpoch):
#tune learning rate
if(self.__learningScheduler(epoch)):#early end
print('early end')
sys.exit()
'''
if(epoch == 0):
lr = K.get_value(self.generator.optimizer.lr)
f_lr = "{:.2e}".format(lr)
print(f'learning rate:{f_lr}')
elif(epoch % 300 == 0):
earlyEnd = self.__nextStep()
if(earlyEnd):
break
'''
self.g_loss = 0
for i in range(n):
imageBlur,imageSharp = image_queue.get(1)#block
self.__doInteration(imageBlur,imageSharp,epoch)
if(self.pyramid_blurs):
#last batch, may smaller than batch_size
self.__trainBatch()
#f_g_loss = ["{:.2f}".format(x) for x in self.g_loss]
self.g_loss = self.g_loss/n
f_g_loss = "{:.3e}".format(self.g_loss)
print(f'epoch:{epoch+1}/{maxEpoch},[G loss:{f_g_loss}]')
self.model.save(self.model.generator,self.config.resource.generator_json_path,self.config.resource.generator_weights_path)
================================================
FILE: code/src/verification.py
================================================
from src.model.model import DDModel
from src.lib.data_producer import DataProducer
from src.lib.data_helper import DataHelper
import tensorflow as tf
import keras.backend as K
from keras.optimizers import RMSprop,Adam
from skimage import io,transform,feature,color,img_as_float
import numpy as np
import sys
from keras.utils.training_utils import multi_gpu_model
import queue
import threading
import math
class Verification():
def __init__(self,config):
self.config = config
self.model = DDModel(config)
self.batch_size = config.trainer.batch_size
self.learningRate = 1e-6
self.bestMetric = 0#psnr
self.bestEpoch = 0
self.patience = 200
self.current_size = 0
self.iters = [3]
self.iter_length = len(self.iters)
self.pyramid_blurs = []
self.pyramid_sharps = []
def start(self):
#json_path=self.config.resource.generator_json_path
#infos = json_path.split('generator')
#infos = infos[1].split('.')
#json_info = infos[0]
#weights_path=self.config.resource.generator_weights_path
#infos = weights_path.split('generator')
#infos = infos[1].split('.')
#weights_info = infos[0]
#print(f'json/weight:{json_info}/{weights_info}')
print(f'verification strategy:{self.iters}')
self.bestMetric = self.__getMetric()#init
print(f'init metric:{self.bestMetric}')
self.train()
def __trainBatch(self):
batch_blurs2x = []
batch_blurs1x = []
batch_sharps1x = []
n = len(self.pyramid_blurs)
for i in range(self.max_iter,0,-1):
if(i == self.max_iter):#first iter
#generate batch_blurs2x
for j in range(n):
pyramid_blur = self.pyramid_blurs[j]
imageBlur2x = pyramid_blur[i]
batch_blurs2x.append(imageBlur2x)
batch_gen = batch_blurs2x
else:
#generate batch_blurs2x
batch_blurs2x = batch_blurs1x
batch_blurs1x = []
batch_sharps1x = []
#generate batch_blurs1x
for j in range(n):
pyramid_blur = self.pyramid_blurs[j]
imageBlur1x = pyramid_blur[i-1]
batch_blurs1x.append(imageBlur1x)
#generate batch_sharps1x
for j in range(n):
pyramid_sharp = self.pyramid_sharps[j]
imageSharp1x = pyramid_sharp[i-1]
batch_sharps1x.append(imageSharp1x)
#data generate end
#train Generator 2x
train_X1 = np.concatenate((batch_blurs2x,batch_gen), axis=3)#6channels
train_X = {'imageSmall':train_X1,'imageUp':np.array(batch_blurs1x)}
g_loss = self.generator.train_on_batch(train_X,np.array(batch_sharps1x))
if(i == 1):#last iter
self.g_loss += g_loss * n
else:
batch_gen = self.generator.predict(train_X)
#train end,reset
self.current_size = 0
self.pyramid_blurs = []
self.pyramid_sharps = []
def __doInteration(self,blur,sharp,epoch):
iter_index = epoch%self.iter_length
self.max_iter = self.iters[iter_index]
if(self.current_size < self.batch_size):
self.pyramid_blurs.append(tuple(transform.pyramid_gaussian(blur, downscale=2, max_layer=self.max_iter, multichannel=True)))
self.pyramid_sharps.append(tuple(transform.pyramid_gaussian(sharp, downscale=2, max_layer=self.max_iter, multichannel=True)))
self.current_size += 1
if(self.current_size == self.batch_size):#train a batch
self.__trainBatch()
def __compute_psnr(self, x , label , max_diff):
mse = np.mean(( x - label ) **2 )
return 10*math.log10( max_diff**2 / mse )
def __testBatch(self,pyramid_blurs,batch_sharps):
n = len(pyramid_blurs)
psnrs = []
for iter in self.iters:
batch_blurs2x = []
batch_blurs1x = []
for i in range(iter,0,-1):
if(i == iter):#first iter
#generate batch_blurs2x
for j in range(n):
pyramid_blur = pyramid_blurs[j]
imageBlur2x = pyramid_blur[i]
batch_blurs2x.append(imageBlur2x)
batch_gen = batch_blurs2x
else:
#generate batch_blurs2x
batch_blurs2x = batch_blurs1x
batch_blurs1x = []
#generate batch_blurs1x
for j in range(n):
pyramid_blur = pyramid_blurs[j]
imageBlur1x = pyramid_blur[i-1]
batch_blurs1x.append(imageBlur1x)
#data prepare end
#predict 2x
data_X1 = np.concatenate((batch_blurs2x,batch_gen), axis=3)#6channels
data_X = {'imageSmall':data_X1,'imageUp':np.array(batch_blurs1x)}
batch_gen = self.model.generator.predict(data_X)
#calculate metrics
batch_psnrs = []
for i in range(n):
pImage = batch_gen[i]
pImage = pImage[24:744]
psnr = self.__compute_psnr(pImage, batch_sharps[i], 1)
batch_psnrs.append(psnr)
psnrs.append(batch_psnrs)
psnrs = np.array(psnrs)
best_index = np.argmax(psnrs,axis=0)
for i in range(n):
best_psnr = psnrs[best_index[i]][i]
best_iter = self.iters[best_index[i]]
self.best_psnrs.append(best_psnr)
self.best_iters.append(best_iter)
def __getMetric(self):
dataHelper = DataHelper()
dataHelper.loadDataList(self.config.resource.test_directory_path)
fileBlurList = dataHelper.getTestDatas()
batch_size = 8
max_iter = max(self.iters)
#metrics
self.best_psnrs = []
self.best_iters = []
current_size = 0
pyramid_blurs = []
batch_sharps = []
for fileFullPath in fileBlurList:
blur = img_as_float(io.imread(fileFullPath))
sharp = img_as_float(io.imread(fileFullPath.replace('/blur','/sharp')))
if(current_size < batch_size):
blur = np.pad(blur,((24,24),(0,0),(0,0)),'reflect')#be divided by 256
pyramid_blurs.append(tuple(transform.pyramid_gaussian(blur, downscale=2, max_layer=max_iter, multichannel=True)))
batch_sharps.append(sharp)
current_size += 1
if(current_size == batch_size):#verify a batch
self.__testBatch(pyramid_blurs,batch_sharps)
current_size = 0
pyramid_blurs = []
batch_sharps = []
if(pyramid_blurs):
self.__testBatch(pyramid_blurs,batch_sharps)
current_size = 0
pyramid_blurs = []
batch_sharps = []
return np.mean(self.best_psnrs)
def __verify(self,epoch):
if(epoch % 50 != 0):
return False
metric = self.__getMetric()
print(f'current metric:{metric}')
if(metric > self.bestMetric):
self.bestMetric = metric
self.bestEpoch = epoch
self.model.save(self.model.generator,self.config.resource.generator_json_path,self.config.resource.generator_weights_path)
return False
elif(epoch - self.bestEpoch < self.patience):
return False
else:
return True
def train(self):
optimizer = Adam(self.learningRate)
if(self.config.trainer.gpu_num>1):
self.generator = multi_gpu_model(self.model.generator, self.config.trainer.gpu_num)
else:
self.generator = self.model.generator
self.generator.compile(loss='mean_absolute_error', optimizer=optimizer)
print(f'generator:{self.generator.metrics_names}')
image_queue = queue.Queue(maxsize=self.config.trainer.batch_size*4)
dataProducer = DataProducer('Producer',image_queue,self.config)
n = dataProducer.loadDataList(self.config.resource.train_directory_path)
dataProducer.start()
epoch = 0
while(True):
self.g_loss = 0
for i in range(n):
imageBlur,imageSharp = image_queue.get(1)#block
self.__doInteration(imageBlur,imageSharp,epoch)
if(self.pyramid_blurs):
#last batch, may smaller than batch_size
self.__trainBatch()
#f_g_loss = ["{:.2f}".format(x) for x in self.g_loss]
self.g_loss = self.g_loss/n
f_g_loss = "{:.3e}".format(self.g_loss)
print(f'verification epoch:{epoch},[G loss:{f_g_loss}]')
epoch += 1
if(self.__verify(epoch)):
break