diff --git a/applications/tools/video-enhance.py b/applications/tools/video-enhance.py index 05fdacbf58a85868b96a9e0542fd4877f079f868..6a06050347e0b61741f30b7292794f51129b75e1 100644 --- a/applications/tools/video-enhance.py +++ b/applications/tools/video-enhance.py @@ -76,7 +76,7 @@ parser.add_argument('--render_factor', default=32, help='model inputsize=render_factor*16') #process order support model name:[DAIN, DeepRemaster, DeOldify, RealSR, EDVR] -parser.add_argument('--proccess_order', +parser.add_argument('--process_order', type=str, default='none', nargs='+', @@ -85,7 +85,7 @@ parser.add_argument('--proccess_order', if __name__ == "__main__": args = parser.parse_args() - orders = args.proccess_order + orders = args.process_order temp_video_path = None for order in orders: diff --git a/configs/cyclegan_cityscapes.yaml b/configs/cyclegan_cityscapes.yaml index 66daebff3f778d43255d362e56c677a028e6243d..b1a93786319b34e53f0336be4e836dd8417e4af8 100644 --- a/configs/cyclegan_cityscapes.yaml +++ b/configs/cyclegan_cityscapes.yaml @@ -27,6 +27,7 @@ dataset: name: UnpairedDataset dataroot: data/cityscapes num_workers: 0 + batch_size: 1 phase: train max_dataset_size: inf direction: AtoB diff --git a/configs/cyclegan_horse2zebra.yaml b/configs/cyclegan_horse2zebra.yaml index 7c098ddf5417a662f322fd34af3424ce3c3e959d..e4b68166ca543f962976878bd2ed305ebcf9deb8 100644 --- a/configs/cyclegan_horse2zebra.yaml +++ b/configs/cyclegan_horse2zebra.yaml @@ -26,6 +26,8 @@ dataset: train: name: UnpairedDataset dataroot: data/horse2zebra + num_workers: 0 + batch_size: 1 phase: train max_dataset_size: inf direction: AtoB diff --git a/configs/pix2pix_cityscapes.yaml b/configs/pix2pix_cityscapes.yaml index 6d8e22eee7ff27e2d7bb888ae1de747fa4c0e5cc..a7bfb121b16181ecf83f3d2b655c4024a6d99d39 100644 --- a/configs/pix2pix_cityscapes.yaml +++ b/configs/pix2pix_cityscapes.yaml @@ -25,6 +25,7 @@ dataset: name: PairedDataset dataroot: data/cityscapes num_workers: 4 + batch_size: 1 phase: train max_dataset_size: inf direction: BtoA diff --git a/configs/pix2pix_cityscapes_2gpus.yaml b/configs/pix2pix_cityscapes_2gpus.yaml index f40c63ac55f3dd01204184e7c865ecc4a4e18869..64484387251afc4f8e6c2e7b6309faf0e5a4ea8a 100644 --- a/configs/pix2pix_cityscapes_2gpus.yaml +++ b/configs/pix2pix_cityscapes_2gpus.yaml @@ -24,6 +24,8 @@ dataset: train: name: PairedDataset dataroot: data/cityscapes + num_workers: 0 + batch_size: 1 phase: train max_dataset_size: inf direction: BtoA diff --git a/configs/pix2pix_facades.yaml b/configs/pix2pix_facades.yaml index e345870055d6d93eb48a9603916b48a8258358b2..1db2c13d656f47c8aa978f43c0f8aebba891b123 100644 --- a/configs/pix2pix_facades.yaml +++ b/configs/pix2pix_facades.yaml @@ -24,6 +24,8 @@ dataset: train: name: PairedDataset dataroot: data/facades/ + num_workers: 0 + batch_size: 1 phase: train max_dataset_size: inf direction: BtoA diff --git a/docs/en_US/install.md b/docs/en_US/install.md index 7b4b0e445fa46e65f036c12a3d434409d1b716b6..748749da0dcd36cbcc043c4f2815665dc7272480 100644 --- a/docs/en_US/install.md +++ b/docs/en_US/install.md @@ -46,3 +46,13 @@ git clone https://github.com/PaddlePaddle/PaddleGAN cd PaddleGAN pip install -v -e . # or "python setup.py develop" ``` + +### 4. Installation of other tools that may be used + +#### 4.1 ffmpeg + +If you need to use ppgan to handle video-related tasks, you need to install ffmpeg. It is recommended that you use [conda](https://docs.conda.io/en/latest/miniconda.html) to install: + +``` +conda install x264=='1!152.20180717' ffmpeg=4.0.2 -c conda-forge +``` diff --git a/docs/en_US/tutorials/psgan.md b/docs/en_US/tutorials/psgan.md index 278ee451f811674be23a5442edd86af9d958d298..74af4a6bb413b4aaf03c63c0ddaf4577142d8cff 100644 --- a/docs/en_US/tutorials/psgan.md +++ b/docs/en_US/tutorials/psgan.md @@ -19,7 +19,7 @@ python tools/psgan_infer.py \ --config-file configs/makeup.yaml \ --model_path /your/model/path \ --source_path docs/imgs/ps_source.png \ - --reference_dir docs/imgs/ref/ps_ref \ + --reference_dir docs/imgs/ref \ --evaluate-only True ``` **params:** diff --git a/docs/imgs/ref/ps_ref.png b/docs/imgs/ref/ps_ref.png index d95d8040f255c385bad4badf640d148c563c5937..d6399478ba8039f439853a670fca3d6c48f88840 100644 Binary files a/docs/imgs/ref/ps_ref.png and b/docs/imgs/ref/ps_ref.png differ diff --git a/docs/zh_CN/data_prepare.md b/docs/zh_CN/data_prepare.md index 0abd857213b2e4559b8536df1ec7fcd770c51228..4602d75e457e7ab83231bd0795910764c6b677e9 100644 --- a/docs/zh_CN/data_prepare.md +++ b/docs/zh_CN/data_prepare.md @@ -70,7 +70,7 @@ custom_datasets #### 从网页下载 -pixel2pixel模型相关的数据集可以在[这里](hhttps://people.eecs.berkeley.edu/~tinghuiz/projects/pix2pix/datasets/)下载 +pixel2pixel模型相关的数据集可以在[这里](https://people.eecs.berkeley.edu/~tinghuiz/projects/pix2pix/datasets/)下载 #### 使用脚本下载 diff --git a/docs/zh_CN/install.md b/docs/zh_CN/install.md index 48e5ad9d3b16191d764adf85638ba21b4e6f7811..c03ab636263700d09dd41ad07a113d1099cbc049 100644 --- a/docs/zh_CN/install.md +++ b/docs/zh_CN/install.md @@ -47,3 +47,14 @@ pip install -v -e . # or "python setup.py develop" ``` 按照上述方法安装成功后,本地的修改也会自动同步到ppgan中 + + +### 4. 其他可能用到的工具安装 + +#### 4.1 ffmpeg + +如果需要使用ppgan处理视频相关的任务,则需要安装ffmpeg。这里推荐您使用[conda](https://docs.conda.io/en/latest/miniconda.html)安装: + +``` +conda install x264=='1!152.20180717' ffmpeg=4.0.2 -c conda-forge +``` diff --git a/docs/zh_CN/tutorials/psgan.md b/docs/zh_CN/tutorials/psgan.md index 1f33638d020a4b070ff40cf82c143efad34026ce..5d55f146dc46ab9f6df9bb4cda3a4d722efe3aed 100644 --- a/docs/zh_CN/tutorials/psgan.md +++ b/docs/zh_CN/tutorials/psgan.md @@ -19,7 +19,7 @@ python tools/psgan_infer.py \ --config-file configs/makeup.yaml \ --model_path /your/model/path \ --source_path docs/imgs/ps_source.png \ - --reference_dir docs/imgs/ref/ps_ref \ + --reference_dir docs/imgs/ref \ --evaluate-only True ``` **参数说明:** diff --git a/docs/zh_CN/tutorials/video_restore.md b/docs/zh_CN/tutorials/video_restore.md index 06dcd1e93c431004cfc9495167651b16b3243821..88b12a9ff5c0621d314c4c2d96e7a8c99bedff5d 100644 --- a/docs/zh_CN/tutorials/video_restore.md +++ b/docs/zh_CN/tutorials/video_restore.md @@ -5,13 +5,13 @@ ### 使用applications中的video-enhance.py工具进行快速开始视频修复 ``` cd applications -python tools/video-enhance.py --input you_video_path.mp4 --proccess_order DAIN DeOldify EDVR --output output_dir +python tools/video-enhance.py --input you_video_path.mp4 --process_order DAIN DeOldify EDVR --output output_dir ``` #### 参数 - `--input (str)`: 输入的视频路径。 - `--output (str)`: 输出的视频路径。 -- `--proccess_order`: 调用的模型名字和顺序,比如输入为 `DAIN DeOldify EDVR`,则会顺序调用 `DAINPredictor` `DeOldifyPredictor` `EDVRPredictor` 。 +- `--process_order`: 调用的模型名字和顺序,比如输入为 `DAIN DeOldify EDVR`,则会顺序调用 `DAINPredictor` `DeOldifyPredictor` `EDVRPredictor` 。 #### 效果展示 ![](../../imgs/color_sr_peking.gif) diff --git a/ppgan/apps/deoldify_predictor.py b/ppgan/apps/deoldify_predictor.py index 6379d4d3e6de099f0631b18a33e442f269ebba51..d826f3125b8a05db3f0c91cdb76173ec4e5bcc3a 100644 --- a/ppgan/apps/deoldify_predictor.py +++ b/ppgan/apps/deoldify_predictor.py @@ -23,6 +23,7 @@ import paddle from ppgan.utils.download import get_path_from_url from ppgan.utils.video import frames2video, video2frames from ppgan.models.generators.deoldify import build_model +from ppgan.utils.logger import get_logger from .base_predictor import BasePredictor @@ -150,5 +151,7 @@ class DeOldifyPredictor(BasePredictor): base_name = 'result' out_path = os.path.join(self.output, base_name + '.png') pred_img.save(out_path) + logger = get_logger() + logger.info('Image saved to {}'.format(out_path)) return pred_img, out_path diff --git a/ppgan/apps/psgan_predictor.py b/ppgan/apps/psgan_predictor.py index fef0f9140928e571dc4c1614b676f9283dda1445..488a7a8b61b206dc8c9a6df9ee1bf74ddc3a7729 100644 --- a/ppgan/apps/psgan_predictor.py +++ b/ppgan/apps/psgan_predictor.py @@ -210,8 +210,10 @@ class PSGANPredictor(BasePredictor): ref_img_name = os.path.split(reference_path)[1] if not os.path.exists(self.output_path): - os.makedirs(sefl.output_path) + os.makedirs(self.output_path) save_path = os.path.join(self.output_path, 'transfered_ref_' + ref_img_name) image.save(save_path) + print('Transfered image {} has been saved!'.format(save_path)) + print('done!!!') diff --git a/ppgan/apps/realsr_predictor.py b/ppgan/apps/realsr_predictor.py index 3f471d44a7cac06e1949c52eff96a0f38ef31ffb..759d8107f480e5e01f0466a0ecfcaf1cecf29524 100644 --- a/ppgan/apps/realsr_predictor.py +++ b/ppgan/apps/realsr_predictor.py @@ -23,6 +23,8 @@ import paddle from ppgan.models.generators import RRDBNet from ppgan.utils.video import frames2video, video2frames from ppgan.utils.download import get_path_from_url +from ppgan.utils.logger import get_logger + from .base_predictor import BasePredictor REALSR_WEIGHT_URL = 'https://paddlegan.bj.bcebos.com/applications/DF2K_JPEG.pdparams' @@ -113,5 +115,7 @@ class RealSRPredictor(BasePredictor): base_name = 'result' out_path = os.path.join(self.output, base_name + '.png') pred_img.save(out_path) + logger = get_logger() + logger.info('Image saved to {}'.format(out_path)) return pred_img, out_path diff --git a/ppgan/engine/trainer.py b/ppgan/engine/trainer.py index 145480480cb9ffff91ad59970ae0454e1a48c281..1fe21e84247c62e7681cd06ff0e78b4693149b1a 100644 --- a/ppgan/engine/trainer.py +++ b/ppgan/engine/trainer.py @@ -105,8 +105,9 @@ class Trainer: step_start_time = time.time() - self.logger.info('train one epoch time: {}'.format(time.time() - - start_time)) + self.logger.info( + 'train one epoch use time: {:.3f} seconds.'.format(time.time() - + start_time)) if self.validate_interval > -1 and epoch % self.validate_interval: self.validate() self.model.lr_scheduler.step() diff --git a/ppgan/models/pix2pix_model.py b/ppgan/models/pix2pix_model.py index 99253fbec7ac65798949c87bfe13553118f2c4dc..e44bba0d9df566a8cb8ed0c97ae9eda05df788bf 100644 --- a/ppgan/models/pix2pix_model.py +++ b/ppgan/models/pix2pix_model.py @@ -80,8 +80,10 @@ class Pix2PixModel(BaseModel): AtoB = self.cfg.dataset.train.direction == 'AtoB' - self.real_A = paddle.to_tensor(input['A' if AtoB else 'B']) - self.real_B = paddle.to_tensor(input['B' if AtoB else 'A']) + self.real_A = paddle.fluid.dygraph.to_variable( + input['A' if AtoB else 'B']) + self.real_B = paddle.fluid.dygraph.to_variable( + input['B' if AtoB else 'A']) self.image_paths = input['A_paths' if AtoB else 'B_paths'] diff --git a/ppgan/utils/logger.py b/ppgan/utils/logger.py index ede86d4fe5c222eef1d114460f34448e9f266494..6fb9701f89b27920d826fcdad699264f29d79585 100644 --- a/ppgan/utils/logger.py +++ b/ppgan/utils/logger.py @@ -18,12 +18,12 @@ import sys from paddle.distributed import ParallelEnv -logger_initialized = {} +logger_initialized = [] def setup_logger(output=None, name="ppgan"): """ - Initialize the detectron2 logger and set its verbosity level to "INFO". + Initialize the ppgan logger and set its verbosity level to "INFO". Args: output (str): a file name or a directory to save log. If None, will not save log file. @@ -35,6 +35,8 @@ def setup_logger(output=None, name="ppgan"): logging.Logger: a logger """ logger = logging.getLogger(name) + if name in logger_initialized: + return logger logger.setLevel(logging.INFO) logger.propagate = False @@ -67,13 +69,13 @@ def setup_logger(output=None, name="ppgan"): fh.setLevel(logging.DEBUG) fh.setFormatter(plain_formatter) logger.addHandler(fh) - + logger_initialized.append(name) return logger -def get_logger(name, output=None): +def get_logger(name='ppgan'): logger = logging.getLogger(name) if name in logger_initialized: return logger - return setup_logger(name=name, output=name) + return setup_logger(name=name)