From 532f199e3ed70c1a7c62a731d9df9cfa0c73aba9 Mon Sep 17 00:00:00 2001 From: Puiho Chan <361202089@qq.com.com> Date: Mon, 24 Aug 2020 10:45:14 +0800 Subject: [PATCH] first commit --- README.md | 165 +++++++++ Recorder.py | 104 ++++++ config.py | 61 ++++ criterion.py | 26 ++ data_preprocess.sh | 56 +++ data_utils.py | 71 ++++ extract_audio_and_video.py | 86 +++++ extract_feature.py | 168 +++++++++ extract_mel_spectrogram.py | 46 +++ extract_rgb_flow.py | 62 ++++ gen_list.py | 31 ++ logger.py | 39 +++ model.py | 507 +++++++++++++++++++++++++++ overview.png | Bin 0 -> 286833 bytes requirements.txt | 12 + test.py | 123 +++++++ train.py | 155 +++++++++ tsn/bninception/__init__.py | 0 tsn/bninception/bn_inception.yaml | 558 ++++++++++++++++++++++++++++++ tsn/bninception/layer_factory.py | 84 +++++ tsn/bninception/pytorch_load.py | 70 ++++ tsn/models.py | 76 ++++ tsn/ops/__init__.py | 1 + tsn/ops/basic_ops.py | 47 +++ tsn/ops/utils.py | 35 ++ wavenet_vocoder/__init__.py | 4 + wavenet_vocoder/builder.py | 40 +++ wavenet_vocoder/conv.py | 65 ++++ wavenet_vocoder/mixture.py | 153 ++++++++ wavenet_vocoder/modules.py | 191 ++++++++++ wavenet_vocoder/util.py | 25 ++ wavenet_vocoder/wavenet.py | 380 ++++++++++++++++++++ 32 files changed, 3441 insertions(+) create mode 100644 README.md create mode 100644 Recorder.py create mode 100644 config.py create mode 100644 criterion.py create mode 100644 data_preprocess.sh create mode 100644 data_utils.py create mode 100644 extract_audio_and_video.py create mode 100644 extract_feature.py create mode 100644 extract_mel_spectrogram.py create mode 100644 extract_rgb_flow.py create mode 100644 gen_list.py create mode 100644 logger.py create mode 100644 model.py create mode 100644 overview.png create mode 100644 requirements.txt create mode 100644 test.py create mode 100644 train.py create mode 100644 tsn/bninception/__init__.py create mode 100644 tsn/bninception/bn_inception.yaml create mode 100644 tsn/bninception/layer_factory.py create mode 100644 tsn/bninception/pytorch_load.py create mode 100644 tsn/models.py create mode 100644 tsn/ops/__init__.py create mode 100644 tsn/ops/basic_ops.py create mode 100644 tsn/ops/utils.py create mode 100644 wavenet_vocoder/__init__.py create mode 100644 wavenet_vocoder/builder.py create mode 100644 wavenet_vocoder/conv.py create mode 100644 wavenet_vocoder/mixture.py create mode 100644 wavenet_vocoder/modules.py create mode 100644 wavenet_vocoder/util.py create mode 100644 wavenet_vocoder/wavenet.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..609e505 --- /dev/null +++ b/README.md @@ -0,0 +1,165 @@ +# Generating Visually Aligned Sound from Videos + +This is the official pytorch implementation of the TIP paper "[Generating Visually Aligned Sound from Videos][REGNET]" and the corresponding Visually Aligned Sound (VAS) dataset. + +Demo videos containing sound generation results can be found [here][demo]. + +![](https://github.com/PeihaoChen/regnet/blob/master/overview.png) + + +# Contents +---- + +* [Usage Guide](#usage-guide) + * [Getting Started](#getting-started) + * [Installation](#installation) + * [Download Datasets](#download-datasets) + * [Data Preprocessing](#data-preprocessing) + * [Training REGNET](#training-regnet) + * [Generating Sound](#generating-sound) +* [Other Info](#other-info) + * [Citation](#citation) + * [Contact](#contact) + + +---- +# Usage Guide + +## Getting Started +[[back to top](#Generating-Visually-Aligned-Sound-from-Videos)] + +### Installation + +Clone this repository into a directory. We refer to that directory as *`REGNET_ROOT`*. + +```bash +git clone https://github.com/PeihaoChen/regnet +cd regnet +``` +Create a new Conda environment. +```bash +conda create -n regnet python=3.7.1 +conda activate regnet +``` +Install [PyTorch][pytorch] and other dependencies. +```bash +conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 +conda install ffmpeg -n regnet -c conda-forge +pip install -r requirements.txt +``` + +### Download Datasets + +In our paper, we collect 8 sound types (Dog, Fireworks, Drum, Baby form [VEGAS][vegas] and Gun, Sneeze, Cough, Hammer from [AudioSet][audioset]) to build our [Visually Aligned Sound (VAS)][VAS] dataset. +Please first download VAS dataset and unzip the data to *`$REGNET_ROOT/data/`* folder. + +For each sound type in AudioSet, we download all videos from Youtube and clean data on Amazon Mechanical Turk (AMT) using the same way as [VEGAS][visual_to_sound]. + + +```bash +unzip ./data/VAS.zip -d ./data +``` + + + +### Data Preprocessing + +Run `data_preprocess.sh` to preprocess data and extract RGB and optical flow features. + +Notice: The script we provided to calculate optical flow is easy to run but is resource-consuming and will take a long time. We strongly recommend you to refer to [TSN repository][TSN] and their built [docker image][TSN_docker] (our paper also uses this solution) to speed up optical flow extraction and to restrictly reproduce the results. +```bash +source data_preprocess.sh +``` + + +## Training REGNET + +Training the REGNET from scratch. The results will be saved to `ckpt/dog`. + +```bash +CUDA_VISIBLE_DEVICES=7 python train.py \ +save_dir ckpt/dog \ +auxiliary_dim 64 \ +rgb_feature_dir data/features/dog/feature_rgb_bninception_dim1024_21.5fps \ +flow_feature_dir data/features/dog/feature_flow_bninception_dim1024_21.5fps \ +mel_dir data/features/dog/melspec_10s_22050hz \ +checkpoint_path '' +``` + +In case that the program stops unexpectedly, you can continue training. +```bash +CUDA_VISIBLE_DEVICES=7 python train.py \ +-c ckpt/dog/opts.yml \ +checkpoint_path ckpt/dog/checkpoint_018081 +``` + +## Generating Sound + + +During inference, our RegNet will generate visually aligned spectrogram, and then use [WaveNet][wavenet] as vocoder to generate waveform from spectrogram. You should first download our trained WaveNet model for different sound categories ( +[Dog](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/dog_checkpoint_step000200000_ema.pth), +[Fireworks](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/fireworks_checkpoint_step000267000_ema.pth), +[Drum](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/drum_checkpoint_step000160000_ema.pth), +[Baby](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/baby_checkpoint_step000470000_ema.pth), +[Gun](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/gun_checkpoint_step000152000_ema.pth), +[Sneeze](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/sneeze_checkpoint_step000071000_ema.pth), +[Cough](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/cough_checkpoint_step000079000_ema.pth), +[Hammer](https://github.com/PeihaoChen/regnet/releases/download/WaveNet_model/hammer_checkpoint_step000137000_ema.pth) +). + +The generated spectrogram and waveform will be saved at `ckpt/dog/inference_result` +```bash +CUDA_VISIBLE_DEVICES=7 python test.py \ +-c ckpt/dog/opts.yml \ +aux_zero True \ +checkpoint_path ckpt/dog/checkpoint_041000 \ +save_dir ckpt/dog/inference_result \ +wavenet_path /path/to/wavenet_dog.pth +``` + +If you want to train your own WaveNet model, you can use [WaveNet repository][wavenet_repository]. +```bash +git clone https://github.com/r9y9/wavenet_vocoder && cd wavenet_vocoder +git checkout 2092a64 +``` + +Enjoy your experiments! + + +# Other Info +[[back to top](#Generating-Visually-Aligned-Sound-from-Videos)] + +## Citation + + +Please cite the following paper if you feel REGNET useful to your research +``` +@Article{chen2020regnet, + author = {Peihao Chen, Yang Zhang, Mingkui Tan, Hongdong Xiao, Deng Huang and Chuang Gan}, + title = {Generating Visually Aligned Sound from Videos}, + journal = {TIP}, + year = {2020}, +} +``` + +## Contact +For any question, please file an issue or contact +``` +Peihao Chen: phchencs@gmail.com +Hongdong Xiao: xiaohongdonghd@gmail.com +``` + +[REGNET]:https://arxiv.org/abs/2008.00820 +[audioset]:https://research.google.com/audioset/index.html +[VEGAS_link]:http://bvision11.cs.unc.edu/bigpen/yipin/visual2sound_webpage/VEGAS.zip +[pytorch]:https://github.com/pytorch/pytorch +[wavenet]:https://arxiv.org/abs/1609.03499 +[wavenet_repository]:https://github.com/r9y9/wavenet_vocoder +[opencv]:https://github.com/opencv/opencv +[dense_flow]:https://github.com/yjxiong/dense_flow +[VEGAS]: http://bvision11.cs.unc.edu/bigpen/yipin/visual2sound_webpage/visual2sound.html +[visual_to_sound]: https://arxiv.org/abs/1712.01393 +[TSN]: https://github.com/yjxiong/temporal-segment-networks +[VAS]: https://drive.google.com/file/d/14birixmH7vwIWKxCHI0MIWCcZyohF59g/view?usp=sharing +[TSN_docker]: https://hub.docker.com/r/bitxiong/tsn/tags +[demo]: https://youtu.be/fI_h5mZG7bg diff --git a/Recorder.py b/Recorder.py new file mode 100644 index 0000000..62a898a --- /dev/null +++ b/Recorder.py @@ -0,0 +1,104 @@ +import os +import shutil +import time +import sys + + +class Recorder(object): + def __init__(self, snapshot_pref, exclude_dirs=None, max_file_size=10): + """ + :param snapshot_pref: The dir you want to save the backups + :param exclude_dirs: The dir name you want to exclude; eg ["results", "data"] + :param max_file_size: The minimum size of backups file; unit is MB + """ + date = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + if not os.path.isdir(snapshot_pref): + os.makedirs(snapshot_pref, exist_ok=True) + self.save_path = snapshot_pref + self.log_file = self.save_path + "log.txt" + self.readme = self.save_path + "README.md" + self.opt_file = self.save_path + "opt.log" + self.code_path = os.path.join(self.save_path, "code_{}/".format(date)) + self.exclude_dirs = exclude_dirs + self.max_file_size = max_file_size + if os.path.isfile(self.readme): + os.remove(self.readme) + if not os.path.isdir(self.code_path): + os.mkdir(self.code_path) + self.copy_code(dst=self.code_path) + self.tee_stdout(os.path.join(snapshot_pref, "log.txt")) + print ("|===>Backups will be saved at", self.save_path) + + def copy_code(self, src="./", dst="./code/"): + start_time = time.time() + file_abs_list = [] + src_abs = os.path.abspath(src) + for root, dirs, files in os.walk(src_abs): + exclude_flag = True in [root.find(exclude_dir)>=0 for exclude_dir in self.exclude_dirs] + if not exclude_flag: + for name in files: + file_abs_list.append(root + "/" + name) + + for file_abs in file_abs_list: + file_split = file_abs.split("/")[-1].split('.') + # if len(file_split) >= 2 and file_split[1] == "py": + if os.path.getsize(file_abs) / 1024 / 1024 < self.max_file_size and not file_split[-1] == "pyc": + src_file = file_abs + dst_file = dst + file_abs.replace(src_abs, "") + if not os.path.exists(os.path.dirname(dst_file)): + os.makedirs(os.path.dirname(dst_file)) + # shutil.copyfile(src=src_file, dst=dst_file) + try: + shutil.copy2(src=src_file, dst=dst_file) + except: + print("copy file error") + print("|===>Backups using time: %.3f s"%(time.time() - start_time)) + + def tee_stdout(self, log_path): + log_file = open(log_path, 'a', 1) + stdout = sys.stdout + + class Tee: + + def write(self, string): + log_file.write(string) + stdout.write(string) + + def flush(self): + log_file.flush() + stdout.flush() + + sys.stdout = Tee() + + def writeopt(self, opt): + with open(self.opt_file, "w") as f: + for k, v in opt.__dict__.items(): + f.write(str(k)+": "+str(v)+"\n") + + def writelog(self, input_data): + txt_file = open(self.log_file, 'a+') + txt_file.write(str(input_data) + "\n") + txt_file.close() + + def writereadme(self, input_data): + txt_file = open(self.readme, 'a+') + txt_file.write(str(input_data) + "\n") + txt_file.close() + + def gennetwork(self, var): + self.graph.draw(var=var) + + def savenetwork(self): + self.graph.save(file_name=self.save_path+"network.svg") + + """def writeweights(self, input_data, block_id, layer_id, epoch_id): + txt_path = self.weight_folder + "conv_weight_" + str(epoch_id) + ".log" + txt_file = open(txt_path, 'a+') + write_str = "%d\t%d\t%d\t" % (epoch_id, block_id, layer_id) + for x in input_data: + write_str += str(x) + "\t" + txt_file.write(write_str+"\n") + + def drawhist(self): + drawer = DrawHistogram(txt_folder=self.weight_folder, fig_folder=self.weight_fig_folder) + drawer.draw()""" \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..c4b997e --- /dev/null +++ b/config.py @@ -0,0 +1,61 @@ +from yacs.config import CfgNode as CN + +_C = CN() +_C.epochs = 1000 +_C.num_epoch_save = 10 +_C.seed = 123 +_C.dynamic_loss_scaling = True +_C.dist_backend = "nccl" +_C.dist_url = "tcp://localhost:54321" +_C.cudnn_enabled = True +_C.cudnn_benchmark = False +_C.save_dir = 'ckpt/dog' +_C.checkpoint_path = '' +_C.epoch_count = 0 +_C.exclude_dirs = ['ckpt', 'data'] +_C.training_files = 'filelists/dog_train.txt' +_C.test_files = 'filelists/dog_test.txt' +_C.rgb_feature_dir = "data/features/dog/feature_rgb_bninception_dim1024_21.5fps" +_C.flow_feature_dir = "data/features/dog/feature_flow_bninception_dim1024_21.5fps" +_C.mel_dir = "data/features/dog/melspec_10s_22050hz" +_C.video_samples = 215 +_C.audio_samples = 10 +_C.mel_samples = 860 +_C.visual_dim = 2048 +_C.n_mel_channels = 80 + +# Encoder parameters +_C.random_z_dim = 512 +_C.encoder_n_lstm = 2 +_C.encoder_embedding_dim = 2048 +_C.encoder_kernel_size = 5 +_C.encoder_n_convolutions = 3 + +# Auxiliary parameters +_C.auxiliary_type = "lstm_last" +_C.auxiliary_dim = 256 +_C.auxiliary_sample_rate = 32 +_C.mode_input = "" +_C.aux_zero = False + +# Decoder parameters +_C.decoder_conv_dim = 1024 + +# Mel-post processing network parameters +_C.postnet_embedding_dim = 512 +_C.postnet_kernel_size = 5 +_C.postnet_n_convolutions = 5 + +_C.loss_type = "MSE" +_C.weight_decay = 1e-6 +_C.grad_clip_thresh = 1.0 +_C.batch_size = 64 +_C.lr = 0.0002 +_C.beta1 = 0.5 +_C.continue_train = False +_C.lambda_Oriloss = 10000.0 +_C.lambda_Silenceloss = 0 +_C.niter = 100 +_C.D_interval = 1 +_C.wo_G_GAN = False +_C.wavenet_path = "" diff --git a/criterion.py b/criterion.py new file mode 100644 index 0000000..6744b23 --- /dev/null +++ b/criterion.py @@ -0,0 +1,26 @@ +from torch import nn + + +class RegnetLoss(nn.Module): + def __init__(self, loss_type): + super(RegnetLoss, self).__init__() + self.loss_type = loss_type + print("Loss type: {}".format(self.loss_type)) + + def forward(self, model_output, targets): + + mel_target = targets + mel_target.requires_grad = False + mel_out, mel_out_postnet = model_output + + if self.loss_type == "MSE": + loss_fn = nn.MSELoss() + elif self.loss_type == "L1Loss": + loss_fn = nn.L1Loss() + else: + print("ERROR LOSS TYPE!") + + mel_loss = loss_fn(mel_out, mel_target) + \ + loss_fn(mel_out_postnet, mel_target) + + return mel_loss \ No newline at end of file diff --git a/data_preprocess.sh b/data_preprocess.sh new file mode 100644 index 0000000..3cfc5f5 --- /dev/null +++ b/data_preprocess.sh @@ -0,0 +1,56 @@ + +soundlist=" "dog" "fireworks" "drum" "baby" "gun" "sneeze" "cough" "hammer" " + +for soundtype in $soundlist +do + + # Data preprocessing. We will first pad all videos to 10s and change video FPS and audio + # sampling rate. + python extract_audio_and_video.py \ + -i data/VAS/videos/${soundtype} \ + -o data/features/${soundtype} + + # Generating RGB frame and optical flow. This script uses CPU to calculate optical flow, + # which may take a very long time. We strongly recommend you to refer to TSN repository + # (https://github.com/yjxiong/temporal-segment-networks) to speed up this process. + python extract_rgb_flow.py \ + -i data/features/${soundtype}/videos_10s_21.5fps \ + -o data/features/${soundtype}/OF_10s_21.5fps + + #Split training/testing list + python gen_list.py \ + -i data/VAS/videos/${soundtype} \ + -o filelists --prefix ${soundtype} + + #Extract Mel-spectrogram from audio + python extract_mel_spectrogram.py \ + -i data/features/${soundtype}/audio_10s_22050hz \ + -o data/features/${soundtype}/melspec_10s_22050hz + + #Extract RGB feature + CUDA_VISIBLE_DEVICES=6 python extract_feature.py \ + -t filelists/${soundtype}_train.txt \ + -m RGB \ + -i data/features/${soundtype}/OF_10s_21.5fps \ + -o data/features/${soundtype}/feature_rgb_bninception_dim1024_21.5fps + + CUDA_VISIBLE_DEVICES=6 python extract_feature.py \ + -t filelists/${soundtype}_test.txt \ + -m RGB \ + -i data/features/${soundtype}/OF_10s_21.5fps \ + -o data/features/${soundtype}/feature_rgb_bninception_dim1024_21.5fps + + #Extract optical flow feature + CUDA_VISIBLE_DEVICES=6 python extract_feature.py \ + -t filelists/${soundtype}_train.txt \ + -m Flow \ + -i data/features/${soundtype}/OF_10s_21.5fps \ + -o data/features/${soundtype}/feature_flow_bninception_dim1024_21.5fps + + CUDA_VISIBLE_DEVICES=6 python extract_feature.py \ + -t filelists/${soundtype}_test.txt \ + -m Flow \ + -i data/features/${soundtype}/OF_10s_21.5fps \ + -o data/features/${soundtype}/feature_flow_bninception_dim1024_21.5fps + +done \ No newline at end of file diff --git a/data_utils.py b/data_utils.py new file mode 100644 index 0000000..6319373 --- /dev/null +++ b/data_utils.py @@ -0,0 +1,71 @@ +import os +import pickle +import random +import numpy as np +import torch +import torch.utils.data +from config import _C as config + + +class RegnetLoader(torch.utils.data.Dataset): + """ + loads image, flow feature, mel-spectrogramsfiles + """ + + def __init__(self, list_file, max_sample=-1): + self.video_samples = config.video_samples + self.audio_samples = config.audio_samples + self.mel_samples = config.mel_samples + + with open(list_file, encoding='utf-8') as f: + self.video_ids = [line.strip() for line in f] + + def get_feature_mel_pair(self, video_id): + im_path = os.path.join(config.rgb_feature_dir, video_id+".pkl") + flow_path = os.path.join(config.flow_feature_dir, video_id+".pkl") + mel_path = os.path.join(config.mel_dir, video_id+"_mel.npy") + im = self.get_im(im_path) + flow = self.get_flow(flow_path) + mel = self.get_mel(mel_path) + feature = np.concatenate((im, flow), 1) + feature = torch.FloatTensor(feature.astype(np.float32)) + return (feature, mel, video_id) + + def get_mel(self, filename): + melspec = np.load(filename) + if melspec.shape[1] < self.mel_samples: + melspec_padded = np.zeros((melspec.shape[0], self.mel_samples)) + melspec_padded[:, 0:melspec.shape[1]] = melspec + else: + melspec_padded = melspec[:, 0:self.mel_samples] + melspec_padded = torch.from_numpy(melspec_padded).float() + return melspec_padded + + def get_im(self, im_path): + with open(im_path, 'rb') as f: + im = pickle.load(f, encoding='bytes') + f.close() + if im.shape[0] < self.video_samples: + im_padded = np.zeros((self.video_samples, im.shape[1])) + im_padded[0:im.shape[0], :] = im + else: + im_padded = im[0:self.video_samples, :] + assert im_padded.shape[0] == self.video_samples + return im_padded + + def get_flow(self, flow_path): + with open(flow_path, 'rb') as f: + flow = pickle.load(f, encoding='bytes') + f.close() + if flow.shape[0] < self.video_samples: + flow_padded = np.zeros((self.video_samples, flow.shape[1])) + flow_padded[0:flow.shape[0], :] = flow + else: + flow_padded = flow[0:self.video_samples, :] + return flow_padded + + def __getitem__(self, index): + return self.get_feature_mel_pair(self.video_ids[index]) + + def __len__(self): + return len(self.video_ids) \ No newline at end of file diff --git a/extract_audio_and_video.py b/extract_audio_and_video.py new file mode 100644 index 0000000..03c17b0 --- /dev/null +++ b/extract_audio_and_video.py @@ -0,0 +1,86 @@ +import os +from glob import glob +import numpy as np +import os.path as P +import argparse +from multiprocessing import Pool +from functools import partial + +def execCmd(cmd): + r = os.popen(cmd) + text = r.read() + r.close() + return text + +def pipline(video_path, output_dir, fps, sr, duration_target): + video_name = os.path.basename(video_path) + audio_name = video_name.replace(".mp4", ".wav") + + # Extract Original Audio + ori_audio_dir = P.join(output_dir, "audio_ori") + os.makedirs(ori_audio_dir, exist_ok=True) + os.system(f"ffmpeg -i {video_path} -loglevel error -f wav -vn -y {P.join(ori_audio_dir, audio_name)}") + + # Cut Video According to Audio + align_video_dir = P.join(output_dir, "videos_algin") + os.makedirs(align_video_dir, exist_ok=True) + duration = execCmd(f"ffmpeg -i {P.join(ori_audio_dir, audio_name)} 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//") + duration = duration.replace('\n', "") + os.system("ffmpeg -ss 0 -t {} -i {} -loglevel error -c:v libx264 -c:a aac -strict experimental -b:a 98k -y {}".format( + duration, video_path, P.join(align_video_dir, video_name))) + + # Repeat Video + repeat_video_dir = P.join(output_dir, "videos_repeat") + os.makedirs(repeat_video_dir, exist_ok=True) + hour, min, sec = [float(_) for _ in duration.split(":")] + duration_second = 3600*hour + 60*min + sec + n_repeat = duration_target//duration_second + 1 + os.system("ffmpeg -stream_loop {} -i {} -loglevel error -c copy -fflags +genpts -y {}".format(n_repeat, + P.join(align_video_dir, video_name), P.join(repeat_video_dir, video_name))) + + # Cut Video + cut_video_dir = P.join(output_dir, f"videos_{duration_target}s") + os.makedirs(cut_video_dir, exist_ok=True) + os.system("ffmpeg -ss 0 -t {} -i {} -loglevel error -c:v libx264 -c:a aac -strict experimental -b:a 98k -y {}".format(duration_target, + P.join(repeat_video_dir, video_name), P.join(cut_video_dir, video_name))) + + # Extract Audio + cut_audio_dir = P.join(output_dir, f"audio_{duration_target}s") + os.makedirs(cut_audio_dir, exist_ok=True) + os.system("ffmpeg -i {} -loglevel error -f wav -vn -y {}".format( + P.join(cut_video_dir, video_name), P.join(cut_audio_dir, audio_name))) + + # change audio sample rate + sr_audio_dir = P.join(output_dir, f"audio_{duration_target}s_{sr}hz") + os.makedirs(sr_audio_dir, exist_ok=True) + os.system("ffmpeg -i {} -loglevel error -ac 1 -ab 16k -ar {} -y {}".format( + P.join(cut_audio_dir, audio_name), sr, P.join(sr_audio_dir, audio_name))) + + # change video fps + fps_audio_dir = P.join(output_dir, f"videos_{duration_target}s_{fps}fps") + os.makedirs(fps_audio_dir, exist_ok=True) + os.system("ffmpeg -y -i {} -loglevel error -r {} -c:v libx264 -strict -2 {}".format( + P.join(cut_video_dir, video_name), fps, P.join(fps_audio_dir, video_name))) + +if __name__ == '__main__': + + paser = argparse.ArgumentParser() + paser.add_argument("-i", "--input_dir", default="data/VAS/dog/videos") + paser.add_argument("-o", "--output_dir", default="data/features/dog") + paser.add_argument("-d", "--duration", type=int, default=10) + paser.add_argument("-a", '--audio_sample_rate', default='22050') + paser.add_argument("-v", '--video_fps', default='21.5') + paser.add_argument("-n", '--num_worker', type=int, default=32) + args = paser.parse_args() + input_dir = args.input_dir + output_dir = args.output_dir + duration_target = args.duration + sr = args.audio_sample_rate + fps = args.video_fps + + video_paths = glob(P.join(input_dir, "*.mp4")) + video_paths.sort() + + with Pool(args.num_worker) as p: + p.map(partial(pipline, output_dir=output_dir, + sr=sr, fps=fps, duration_target=duration_target), video_paths) diff --git a/extract_feature.py b/extract_feature.py new file mode 100644 index 0000000..835e282 --- /dev/null +++ b/extract_feature.py @@ -0,0 +1,168 @@ +import argparse +import time +import os +import numpy as np +import pickle as pkl +import torch.nn.parallel +from PIL import Image +from torch.utils.data import Dataset +import torch.optim +import torchvision +from glob import glob +from tsn.models import TSN + + +class GroupScale(object): + def __init__(self, size, interpolation=Image.BILINEAR): + self.worker = torchvision.transforms.Scale(size, interpolation) + + def __call__(self, img_group): + return [self.worker(img) for img in img_group] + +class GroupNormalize(object): + def __init__(self, mean, std): + self.mean = mean + self.std = std + + def __call__(self, tensor): + rep_mean = self.mean * (tensor.size()[0]//len(self.mean)) + rep_std = self.std * (tensor.size()[0]//len(self.std)) + + for t, m, s in zip(tensor, rep_mean, rep_std): + t.sub_(m).div_(s) + + return tensor + +class Stack(object): + + def __init__(self, roll=False): + self.roll = roll + + def __call__(self, img_group): + if img_group[0].mode == 'L': + return np.concatenate([np.expand_dims(x, 2) for x in img_group], axis=2) + elif img_group[0].mode == 'RGB': + if self.roll: + return np.concatenate([np.array(x)[:, :, ::-1] for x in img_group], axis=2) + else: + return np.concatenate(img_group, axis=2) + +class ToTorchFormatTensor(object): + """ Converts a PIL.Image (RGB) or numpy.ndarray (H x W x C) in the range [0, 255] + to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0] """ + def __init__(self, div=True): + self.div = div + + def __call__(self, pic): + if isinstance(pic, np.ndarray): + # handle numpy array + img = torch.from_numpy(pic).permute(2, 0, 1).contiguous() + else: + # handle PIL Image + img = torch.ByteTensor(torch.ByteStorage.from_buffer(pic.tobytes())) + img = img.view(pic.size[1], pic.size[0], len(pic.mode)) + # put it from HWC to CHW format + # yikes, this transpose takes 80% of the loading time/CPU + img = img.transpose(0, 1).transpose(0, 2).contiguous() + return img.float().div(255) if self.div else img.float() + + +class TSNDataSet(Dataset): + def __init__(self, root_path, list_file, modality='RGB', + image_tmpl='img_{:05d}.jpg', transform=None): + + self.root_path = root_path + self.list_file = list_file + self.modality = modality + self.image_tmpl = image_tmpl + self.transform = transform + with open(list_file) as f: + self.video_list = [line.strip() for line in f] + f.close() + + def _load_image(self, directory, idx): + if self.modality == 'RGB': + return [Image.open(os.path.join(directory, self.image_tmpl.format(idx))).convert('RGB')] + elif self.modality == 'Flow': + x_img = Image.open(os.path.join(directory, self.image_tmpl.format('x', idx))).convert('L') + y_img = Image.open(os.path.join(directory, self.image_tmpl.format('y', idx))).convert('L') + return [x_img, y_img] + + def __getitem__(self, index): + video_path = os.path.join(self.root_path, self.video_list[index]) + images = list() + if self.modality == 'RGB': + num_frames = len(glob(os.path.join(video_path, "img*.jpg"))) + elif self.modality == 'Flow': + num_frames = len(glob(os.path.join(video_path, "flow_x*.jpg"))) + for ind in (np.arange(num_frames)+1): + images.extend(self._load_image(video_path, ind)) + process_data = self.transform(images) + return process_data, video_path + + def __len__(self): + return len(self.video_list) + +def eval_video(data): + if args.modality == 'RGB': + length = 3 + elif args.modality == 'Flow': + length = 2 + else: + raise ValueError("Unknown modality "+args.modality) + input_var = torch.autograd.Variable(data.view(-1, length, data.size(2), data.size(3)), + volatile=True) + baseout = np.squeeze(net(input_var).data.cpu().numpy().copy()) + return baseout + + +if __name__ == '__main__': + # options + parser = argparse.ArgumentParser() + parser.add_argument('-i', '--input_dir', type=str) + parser.add_argument('-o', '--output_dir', type=str) + parser.add_argument('-m', '--modality', type=str, choices=['RGB', 'Flow']) + parser.add_argument('-t', '--test_list', type=str) + parser.add_argument('--input_size', type=int, default=224) + parser.add_argument('--crop_fusion_type', type=str, default='avg', + choices=['avg', 'max', 'topk']) + parser.add_argument('--dropout', type=float, default=0.7) + parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', + help='number of data loading workers (default: 4)') + parser.add_argument('--flow_prefix', type=str, default='') + + args = parser.parse_args() + + net = TSN(args.modality, + consensus_type=args.crop_fusion_type, + dropout=args.dropout) + + cropping = torchvision.transforms.Compose([ + GroupScale((net.input_size, net.input_size)), + ]) + + data_loader = torch.utils.data.DataLoader( + TSNDataSet(args.input_dir, args.test_list, + modality=args.modality, + image_tmpl="img_{:05d}.jpg" if args.modality == 'RGB' else args.flow_prefix+"flow_{}_{:05d}.jpg", + transform=torchvision.transforms.Compose([ + cropping, Stack(roll=True), + ToTorchFormatTensor(div=False), + GroupNormalize(net.input_mean, net.input_std), + ])), + batch_size=1, shuffle=False, + num_workers=1, pin_memory=True) + + net = torch.nn.DataParallel(net).cuda() + net.eval() + for i, (data, video_path) in enumerate(data_loader): + os.makedirs(args.output_dir, exist_ok=True) + ft_path = os.path.join(args.output_dir, video_path[0].split(os.sep)[-1]+".pkl") + if args.modality == 'RGB': + length = 3 + elif args.modality == 'Flow': + length = 2 + input_var = torch.autograd.Variable(data.view(-1, length, data.size(2), data.size(3)), + volatile=True) + rst = np.squeeze(net(input_var).data.cpu().numpy().copy()) + pkl.dump(rst, open(ft_path, "wb")) \ No newline at end of file diff --git a/extract_mel_spectrogram.py b/extract_mel_spectrogram.py new file mode 100644 index 0000000..f7cf050 --- /dev/null +++ b/extract_mel_spectrogram.py @@ -0,0 +1,46 @@ +import numpy as np +import os +import librosa +import argparse +import os.path as P +from multiprocessing import Pool +from functools import partial +from glob import glob + +mel_basis = librosa.filters.mel(22050, n_fft=1024, fmin=125, fmax=7600, n_mels=80) + +def get_spectrogram(audio_path, save_dir, length): + wav, _ = librosa.load(audio_path, sr=None) + y = np.zeros(length) + if wav.shape[0] < length: + y[:len(wav)] = wav + else: + y = wav[:length] + spectrogram = np.abs(librosa.stft(y, n_fft=1024, hop_length=256)) + mel_spec = np.dot(mel_basis, spectrogram) + mel_spec = 20 * np.log10(np.maximum(1e-5, mel_spec)) - 20 + mel_spec = np.clip((mel_spec + 100) / 100, 0, 1.0) + + mel_spec = mel_spec[:, :860] + os.makedirs(save_dir, exist_ok=True) + audio_name = os.path.basename(audio_path).split('.')[0] + np.save(P.join(save_dir, audio_name + "_mel.npy"), mel_spec) + np.save(P.join(save_dir, audio_name + "_audio.npy"), y) + + +if __name__ == '__main__': + paser = argparse.ArgumentParser() + paser.add_argument("-i", "--input_dir", default="data/features/dog/audio_10s_22050hz") + paser.add_argument("-o", "--output_dir", default="data/features/dog/melspec_10s_22050hz") + paser.add_argument("-l", "--length", default=220500) + paser.add_argument("-n", '--num_worker', type=int, default=32) + args = paser.parse_args() + input_dir = args.input_dir + output_dir = args.output_dir + length = args.length + + audio_paths = glob(P.join(input_dir, "*.wav")) + audio_paths.sort() + + with Pool(args.num_worker) as p: + p.map(partial(get_spectrogram, save_dir=output_dir, length=length), audio_paths) diff --git a/extract_rgb_flow.py b/extract_rgb_flow.py new file mode 100644 index 0000000..3cbc632 --- /dev/null +++ b/extract_rgb_flow.py @@ -0,0 +1,62 @@ +import cv2 +from glob import glob +import os +import os.path as P +import argparse +from multiprocessing import Pool +from functools import partial +import numpy as np + +def cal_for_frames(video_path, output_dir, width, height): + save_dir = P.join(output_dir, P.basename(video_path).split('.')[0]) + os.makedirs(save_dir, exist_ok=True) + video = cv2.VideoCapture(video_path) + _, prev = video.read() + num = 1 + prev = cv2.resize(prev, (width, height)) + cv2.imwrite(P.join(save_dir, f"img_{num:05d}.jpg"), prev) + prev = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY) + while video.isOpened(): + reg, curr = video.read() + if not reg: + break + curr = cv2.resize(curr, (width, height)) + cv2.imwrite(P.join(save_dir, f"img_{num:05d}.jpg"), curr) + curr = cv2.cvtColor(curr, cv2.COLOR_BGR2GRAY) + flow = compute_TVL1(prev, curr) + cv2.imwrite(P.join(save_dir, f"flow_x_{num:05d}.jpg"), flow[:, :, 0]) + cv2.imwrite(P.join(save_dir, f"flow_y_{num:05d}.jpg"), flow[:, :, 1]) + prev = curr + num += 1 + if num < 215: + print(video_path) + +def compute_TVL1(prev, curr, bound=20): + """Compute the TV-L1 optical flow.""" + TVL1 = cv2.DualTVL1OpticalFlow_create() + flow = TVL1.calc(prev, curr, None) + flow[flow>bound]=bound + flow[flow<-bound]=-bound + flow-=-bound + flow*=(255/float(2*bound)) + return flow + +if __name__ == '__main__': + paser = argparse.ArgumentParser() + paser.add_argument("-i", "--input_dir", default="data/features/dog/videos_10s_21.5fps") + paser.add_argument("-o", "--output_dir", default="data/features/dog/OF_10s_21.5fps") + paser.add_argument("-w", "--width", type=int, default=340) + paser.add_argument("-g", "--height", type=int, default=256) + paser.add_argument("-n", '--num_worker', type=int, default=16) + + args = paser.parse_args() + input_dir = args.input_dir + output_dir = args.output_dir + width = args.width + height = args.height + + video_paths = glob(P.join(input_dir, "*.mp4")) + video_paths.sort() + with Pool(args.num_worker) as p: + p.map(partial(cal_for_frames, output_dir=output_dir, + width=width, height=height), video_paths) \ No newline at end of file diff --git a/gen_list.py b/gen_list.py new file mode 100644 index 0000000..82986c1 --- /dev/null +++ b/gen_list.py @@ -0,0 +1,31 @@ +import os +import os.path as P +from glob import glob +import argparse + +if __name__ == '__main__': + paser = argparse.ArgumentParser() + paser.add_argument("-i", "--input_dir", default="dataset/VEGAS/dog/videos") + paser.add_argument("-o", "--output_dir", default="filelists") + paser.add_argument("-p", "--prefix", default="dog", choices=["dog", "fireworks", "baby", "drum", "gun", "sneeze", "cough", "hammer"]) + args = paser.parse_args() + input_dir = args.input_dir + output_dir = args.output_dir + os.makedirs(output_dir, exist_ok=True) + + video_paths = glob(P.join(input_dir, "*.mp4")) + video_paths.sort(key=lambda x: int(x.split('_')[-1].split(".")[0])) + if args.prefix in ["dog", "fireworks", "baby", "drum"]: + n_test = 128 + else: + n_test = 64 + + with open(P.join(output_dir, args.prefix+"_train.txt"), 'w') as f: + for video_path in video_paths[:-n_test]: + f.write(f"{os.path.basename(video_path).split('.')[0]}\n") + f.close() + + with open(P.join(output_dir, args.prefix+"_test.txt"), 'w') as f: + for video_path in video_paths[-n_test:]: + f.write(f"{os.path.basename(video_path).split('.')[0]}\n") + f.close() \ No newline at end of file diff --git a/logger.py b/logger.py new file mode 100644 index 0000000..acfabc4 --- /dev/null +++ b/logger.py @@ -0,0 +1,39 @@ +import random +from torch.utils.tensorboard import SummaryWriter + +class RegnetLogger(SummaryWriter): + def __init__(self, logdir): + super(RegnetLogger, self).__init__(logdir) + + def log_training(self, model, reduced_loss, learning_rate, duration, + iteration): + self.add_scalar("training.loss", reduced_loss, iteration) + self.add_scalar("learning.rate", learning_rate, iteration) + self.add_scalar("training.loss_G", model.loss_G, iteration) + self.add_scalar("training.loss_D", model.loss_D, iteration) + self.add_scalar("training.loss_G_GAN", model.loss_G_GAN, iteration) + self.add_scalar("training.loss_G_L1", model.loss_G_L1, iteration) + self.add_scalar("training.loss_G_silence", model.loss_G_silence, iteration) + self.add_scalar("training.loss_D_fake", model.loss_D_fake, iteration) + self.add_scalar("training.loss_D_real", model.loss_D_real, iteration) + self.add_scalar("training.score_D_r-f", (model.pred_real - model.pred_fake).mean(), iteration) + self.add_scalar("duration", duration, iteration) + + def log_testing(self, reduced_loss, epoch): + self.add_scalar("testing.loss", reduced_loss, epoch) + + def log_plot(self, model, iteration, split="train"): + output = model.fake_B + output_postnet = model.fake_B_postnet + target = model.real_B + video_name = model.video_name + + idx = random.randint(0, output.size(0) - 1) + + self.add_image( + "mel_spectrogram_{}".format(mode), + plot_spectrogram(target[idx].data.cpu().numpy(), + output[idx].data.cpu().numpy(), + output_postnet[idx].data.cpu().numpy(), + video_name[idx], mode), + iteration) \ No newline at end of file diff --git a/model.py b/model.py new file mode 100644 index 0000000..5a86658 --- /dev/null +++ b/model.py @@ -0,0 +1,507 @@ +import glob +import math +import os +import torch +from torch import nn +from torch.nn import functional as F +from torch.nn import init +from torch.optim import lr_scheduler +from criterion import RegnetLoss +from config import _C as config + +def to_gpu(x, device): + x = x.contiguous() + if torch.cuda.is_available(): + x = x.cuda(device, non_blocking=True) + return torch.autograd.Variable(x) + +class ConvNorm(torch.nn.Module): + def __init__(self, in_channels, out_channels, kernel_size=1, stride=1, + padding=None, dilation=1, bias=True, w_init_gain='linear'): + super(ConvNorm, self).__init__() + if padding is None: + assert(kernel_size % 2 == 1) + padding = int(dilation * (kernel_size - 1) / 2) + + self.conv = torch.nn.Conv1d(in_channels, out_channels, + kernel_size=kernel_size, stride=stride, + padding=padding, dilation=dilation, + bias=bias) + + torch.nn.init.xavier_uniform_( + self.conv.weight, gain=torch.nn.init.calculate_gain(w_init_gain)) + + def forward(self, signal): + conv_signal = self.conv(signal) + return conv_signal + +class Postnet(nn.Module): + """Postnet + - Five 1-d convolution with 512 channels and kernel size 5 + """ + + def __init__(self): + super(Postnet, self).__init__() + self.convolutions = nn.ModuleList() + + self.convolutions.append( + nn.Sequential( + ConvNorm(config.n_mel_channels, config.postnet_embedding_dim, + kernel_size=config.postnet_kernel_size, stride=1, + padding=int((config.postnet_kernel_size - 1) / 2), + dilation=1, w_init_gain='tanh'), + nn.BatchNorm1d(config.postnet_embedding_dim)) + ) + + for i in range(1, config.postnet_n_convolutions - 1): + self.convolutions.append( + nn.Sequential( + ConvNorm(config.postnet_embedding_dim, + config.postnet_embedding_dim, + kernel_size=config.postnet_kernel_size, stride=1, + padding=int((config.postnet_kernel_size - 1) / 2), + dilation=1, w_init_gain='tanh'), + nn.BatchNorm1d(config.postnet_embedding_dim)) + ) + + self.convolutions.append( + nn.Sequential( + ConvNorm(config.postnet_embedding_dim, config.n_mel_channels, + kernel_size=config.postnet_kernel_size, stride=1, + padding=int((config.postnet_kernel_size - 1) / 2), + dilation=1, w_init_gain='linear'), + nn.BatchNorm1d(config.n_mel_channels)) + ) + + def forward(self, x): + for i in range(len(self.convolutions) - 1): + x = torch.tanh(self.convolutions[i](x)) + x = self.convolutions[-1](x) + + return x + + +class Encoder(nn.Module): + + def __init__(self): + super(Encoder, self).__init__() + self.random_z_dim = config.random_z_dim + self.encoder_dim_with_z = config.visual_dim + self.random_z_dim + + convolutions = [] + for i in range(config.encoder_n_convolutions): + conv_input_dim = self.encoder_dim_with_z if i==0 else config.encoder_embedding_dim + conv_layer = nn.Sequential( + ConvNorm(conv_input_dim, + config.encoder_embedding_dim, + kernel_size=config.encoder_kernel_size, stride=1, + padding=int((config.encoder_kernel_size - 1) / 2), + dilation=1, w_init_gain='relu'), + nn.BatchNorm1d(config.encoder_embedding_dim)) + convolutions.append(conv_layer) + self.convolutions = nn.ModuleList(convolutions) + + self.BiLSTM = nn.LSTM(config.encoder_embedding_dim, + int(config.encoder_embedding_dim / 4), config.encoder_n_lstm, + batch_first=True, bidirectional=True) + self.BiLSTM_proj = nn.Linear(int(config.encoder_embedding_dim/2), int(config.encoder_embedding_dim/2)) + + def forward(self, x): + x = x.transpose(1, 2) + z = torch.randn(x.shape[0], self.random_z_dim).to('cuda:0') + z = z.view(z.size(0), z.size(1), 1).expand(z.size(0), z.size(1), x.size(2)) + x = torch.cat([x, z], 1) + for conv in self.convolutions: + x = F.dropout(F.relu(conv(x)), 0.5, self.training) + x = x.transpose(1, 2) + x, _ = self.BiLSTM(x) + x = self.BiLSTM_proj(x) + return x + + +class Auxiliary_lstm_last(nn.Module): + + def __init__(self): + super(Auxiliary_lstm_last, self).__init__() + self.BiLSTM = nn.LSTM(config.n_mel_channels, int(config.auxiliary_dim), 2, + batch_first=True, bidirectional=True) + self.BiLSTM_proj = nn.Linear(config.auxiliary_dim, config.auxiliary_dim) + + def forward(self, x): + x = x.transpose(1, 2) + x, (h, c) = self.BiLSTM(x) + x = self.BiLSTM_proj(h[-1]) + bs, c = x.shape + x = x.unsqueeze(1).expand(bs, 215, c) + return x + + +class Auxiliary_lstm_sample(nn.Module): + + def __init__(self): + super(Auxiliary_lstm_sample, self).__init__() + self.BiLSTM = nn.LSTM(config.n_mel_channels, int(config.auxiliary_dim/2), 2, + batch_first=True, bidirectional=True) + self.auxiliary_sample_rate = config.auxiliary_sample_rate + + def forward(self, x): + x = x.transpose(1, 2) + x, (h, c) = self.BiLSTM(x) + bs, T, C = x.shape + forword = x[:, :, :int(C/2)] + backword = x[:, :, int(C/2):] + + forword_sampled = forword[:, torch.arange(0, T, self.auxiliary_sample_rate).long(), :] + backword_sampled = backword[:, torch.arange(0, T, self.auxiliary_sample_rate).long()+1, :] + sampled = torch.cat([forword_sampled, backword_sampled], dim=-1) + sampled_repeat = sampled.unsqueeze(1).repeat(1, int(self.auxiliary_sample_rate/4), 1, 1).view(bs, -1, C) + assert sampled_repeat.shape[1] == math.ceil(860/self.auxiliary_sample_rate) * int(self.auxiliary_sample_rate/4) + sampled_repeat = sampled_repeat[:, :215, :] + return sampled_repeat + + +class Auxiliary_conv(nn.Module): + + def __init__(self): + super(Auxiliary_conv, self).__init__() + self.conv = nn.Sequential( + nn.Conv1d(config.n_mel_channels, 32, kernel_size=3, stride=2, padding=1), + nn.BatchNorm1d(32), + nn.ReLU(True), + + nn.Conv1d(32, config.auxiliary_dim, kernel_size=3, stride=2, padding=1), + nn.BatchNorm1d(config.auxiliary_dim), + nn.ReLU(True), + ) + + def forward(self, x): + x = self.conv(x) + x = x.transpose(1, 2) + return x + + +class Decoder(nn.Module): + def __init__(self): + super(Decoder, self).__init__() + self.n_mel_channels = config.n_mel_channels + model = [] + model += [nn.ConvTranspose1d(in_channels=config.decoder_conv_dim + config.auxiliary_dim, out_channels=int(config.decoder_conv_dim / 2), + kernel_size=4, stride=2, padding=1)] + model += [nn.BatchNorm1d(int(config.decoder_conv_dim / 2))] + model += [nn.ReLU(True)] + + model += [nn.Conv1d(in_channels=int(config.decoder_conv_dim / 2), out_channels=int(config.decoder_conv_dim / 2), + kernel_size=5, stride=1, padding=2)] + model += [nn.BatchNorm1d(int(config.decoder_conv_dim / 2))] + model += [nn.ReLU(True)] + + model += [nn.ConvTranspose1d(in_channels=int(config.decoder_conv_dim / 2), out_channels=self.n_mel_channels, + kernel_size=4, stride=2, padding=1)] + model += [nn.BatchNorm1d(self.n_mel_channels)] + model += [nn.ReLU(True)] + + model += [nn.Conv1d(in_channels=int(self.n_mel_channels), out_channels=self.n_mel_channels, + kernel_size=5, stride=1, padding=2)] + + self.model = nn.Sequential(*model) + + def forward(self, decoder_inputs): + x = decoder_inputs.transpose(1, 2) + + x = self.model(x) + return x + + +class Regnet_G(nn.Module): + def __init__(self): + super(Regnet_G, self).__init__() + auxiliary_class = None + if config.auxiliary_type == "lstm_last": + auxiliary_class = Auxiliary_lstm_last + elif config.auxiliary_type == "lstm_sample": + auxiliary_class = Auxiliary_lstm_sample + elif config.auxiliary_type == "conv": + auxiliary_class = Auxiliary_conv + self.n_mel_channels = config.n_mel_channels + self.encoder = Encoder() + self.auxiliary = auxiliary_class() + self.decoder = Decoder() + self.postnet = Postnet() + if config.mode_input == "": + self.mode_input = "vis_spec" if self.training else "vis" + else: + self.mode_input = config.mode_input + self.aux_zero = config.aux_zero + + def forward(self, inputs, real_B): + if self.mode_input == "vis_spec": + vis_thr, spec_thr = 1, 1 + elif self.mode_input == "vis": + vis_thr, spec_thr = 1, 0 + elif self.mode_input == "spec": + vis_thr, spec_thr = 0, 1 + else: + print(self.mode_input) + encoder_output = self.encoder(inputs * vis_thr) + gt_auxilitary = self.auxiliary(real_B * spec_thr) + if self.aux_zero: + gt_auxilitary = gt_auxilitary * 0 + encoder_output = torch.cat([encoder_output, gt_auxilitary], dim=2) + mel_output_decoder = self.decoder(encoder_output) + mel_output_postnet = self.postnet(mel_output_decoder) + mel_output = mel_output_decoder + mel_output_postnet + self.gt_auxilitary = gt_auxilitary + return mel_output, mel_output_decoder + + +class Regnet_D(nn.Module): + def __init__(self): + super(Regnet_D, self).__init__() + + self.feature_conv = nn.Sequential( + nn.ConvTranspose1d(config.visual_dim, config.decoder_conv_dim, + kernel_size=4, stride=2, padding=1), + nn.BatchNorm1d(config.decoder_conv_dim), + nn.LeakyReLU(0.2, True), + nn.ConvTranspose1d(config.decoder_conv_dim, 64, + kernel_size=4, stride=2, padding=1), + ) + + self.mel_conv = nn.ConvTranspose1d(config.n_mel_channels, 64, + kernel_size=1, stride=1) + + sequence = [ + nn.Conv1d(128, 256, kernel_size=4, stride=2, padding=1), + nn.LeakyReLU(0.2, True), + + nn.Conv1d(256, 512, kernel_size=4, stride=2, padding=1), + nn.BatchNorm1d(512), + nn.LeakyReLU(0.2, True), + + nn.Conv1d(512, 1024, kernel_size=4, stride=1, padding=1), + nn.BatchNorm1d(1024), + nn.LeakyReLU(0.2, True), + + nn.Conv1d(1024, 1, kernel_size=4, stride=1, padding=1), + ] + self.down_sampling = nn.Sequential(*sequence) # receptive field = 34 + + def forward(self, *inputs): + feature, mel = inputs + feature_conv = self.feature_conv(feature.transpose(1, 2)) + mel_conv = self.mel_conv(mel) + input_cat = torch.cat((feature_conv, mel_conv), 1) + out = self.down_sampling(input_cat) + out = nn.Sigmoid()(out) + return out + + +class GANLoss(nn.Module): + def __init__(self, use_lsgan=False, target_real_label=1.0, target_fake_label=0.0): + super(GANLoss, self).__init__() + self.register_buffer('real_label', torch.tensor(target_real_label)) + self.register_buffer('fake_label', torch.tensor(target_fake_label)) + if use_lsgan: + self.loss = nn.MSELoss() + else: + self.loss = nn.BCELoss() + + def get_target_tensor(self, input, target_is_real): + if target_is_real: + target_tensor = self.real_label + else: + target_tensor = self.fake_label + return target_tensor.expand_as(input) + + def __call__(self, input, target_is_real): + target_tensor = self.get_target_tensor(input, target_is_real) + return self.loss(input, target_tensor) + + +def init_net(net, device, init_type='normal', init_gain=0.02): + assert (torch.cuda.is_available()) + net.to(device) + net = torch.nn.DataParallel(net, range(torch.cuda.device_count())) + init_weights(net, init_type, gain=init_gain) + return net + + +def init_weights(net, init_type='normal', gain=0.02): + def init_func(m): + classname = m.__class__.__name__ + if hasattr(m, 'weight') and (classname.find('Conv') != -1 or classname.find('Linear') != -1): + if init_type == 'normal': + init.normal_(m.weight.data, 0.0, gain) + elif init_type == 'xavier': + init.xavier_normal_(m.weight.data, gain=gain) + elif init_type == 'kaiming': + init.kaiming_normal_(m.weight.data, a=0, mode='fan_in') + elif init_type == 'orthogonal': + init.orthogonal_(m.weight.data, gain=gain) + else: + raise NotImplementedError('initialization method [%s] is not implemented' % init_type) + if hasattr(m, 'bias') and m.bias is not None: + init.constant_(m.bias.data, 0.0) + elif classname.find('BatchNorm2d') != -1: + init.normal_(m.weight.data, 1.0, gain) + init.constant_(m.bias.data, 0.0) + + print('initialize network with %s' % init_type) + net.apply(init_func) + + +class Regnet(nn.Module): + def __init__(self): + super(Regnet, self).__init__() + self.config = config + self.n_mel_channels = config.n_mel_channels + self.model_names = ['G', 'D'] + self.device = torch.device('cuda:0') + self.netG = init_net(Regnet_G(), self.device) + self.netD = init_net(Regnet_D(), self.device) + self.criterionGAN = GANLoss().to(self.device) + self.criterionL1 = RegnetLoss(config.loss_type).to(self.device) + + self.optimizers = [] + self.optimizer_G = torch.optim.Adam(self.netG.parameters(), + lr=config.lr, betas=(config.beta1, 0.999)) + self.optimizer_D = torch.optim.Adam(self.netD.parameters(), + lr=config.lr, betas=(config.beta1, 0.999)) + self.optimizers.append(self.optimizer_G) + self.optimizers.append(self.optimizer_D) + self.D_interval = config.D_interval + self.n_iter = -1 + self.wo_G_GAN = config.wo_G_GAN + + def parse_batch(self, batch): + input, mel, video_name = batch + self.real_A = input.to(self.device).float() + self.real_B = mel.to(self.device).float() + self.video_name = video_name + + def forward(self): + self.fake_B, self.fake_B_postnet = self.netG(self.real_A, self.real_B) + + def get_scheduler(self, optimizer, config): + def lambda_rule(epoch): + # lr_l = 1.0 - max(0, epoch + 2 - config.niter) / float(config.epochs - config.niter + 1) + lr_l = 1.0 - max(0, epoch + 2 + config.epoch_count - config.niter) / float(config.epochs - config.niter + 1) + return lr_l + + scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_rule) + return scheduler + + def setup(self): + self.schedulers = [self.get_scheduler(optimizer, config) for optimizer in self.optimizers] + + def load_checkpoint(self, checkpoint_path): + for name in self.model_names: + filepath = "{}_net{}".format(checkpoint_path, name) + print("Loading net{} from checkpoint '{}'".format(name, filepath)) + state_dict = torch.load(filepath, map_location='cpu') + if hasattr(state_dict, '_metadata'): + del state_dict._metadata + + net = getattr(self, 'net' + name) + if isinstance(net, torch.nn.DataParallel): + net = net.module + checkpoint_state = state_dict["optimizer_net{}".format(name)] + net.load_state_dict(checkpoint_state) + self.iteration = state_dict["iteration"] + + learning_rate = state_dict["learning_rate"] + for index in range(len(self.optimizers)): + for param_group in self.optimizers[index].param_groups: + param_group['lr'] = learning_rate + + def save_checkpoint(self, save_directory, iteration): + lr = self.optimizers[0].param_groups[0]['lr'] + for name in self.model_names: + filepath = os.path.join(save_directory, "checkpoint_{:0>6d}_net{}".format(iteration, name)) + print("Saving net{} and optimizer state at iteration {} to {}".format( + name, iteration, filepath)) + net = getattr(self, 'net' + name) + if torch.cuda.is_available(): + torch.save({"iteration": iteration, + "learning_rate": lr, + "optimizer_net{}".format(name): net.module.cpu().state_dict()}, filepath) + net.to(self.device) + else: + torch.save({"iteration": iteration, + "learning_rate": lr, + "optimizer_net{}".format(name): net.cpu().state_dict()}, filepath) + + """delete old model""" + model_list = glob.glob(os.path.join(save_directory, "checkpoint_*_*")) + model_list.sort() + for model_path in model_list[:-2]: + cmd = "rm {}".format(model_path) + print(cmd) + os.system(cmd) + return model_list[-1][:-5] + + + def update_learning_rate(self): + for scheduler in self.schedulers: + scheduler.step() + lr = self.optimizers[0].param_groups[0]['lr'] + print('learning rate = %.7f' % lr) + + def set_requires_grad(self, nets, requires_grad=False): + if not isinstance(nets, list): + nets = [nets] + for net in nets: + if net is not None: + for param in net.parameters(): + param.requires_grad = requires_grad + + def backward_D(self): + # Fake + # stop backprop to the generator by detaching fake_B + pred_fake = self.netD(self.real_A.detach(), self.fake_B.detach()) + self.pred_fake = pred_fake.data.cpu() + self.loss_D_fake = self.criterionGAN(pred_fake, False) + + # Real + pred_real = self.netD(self.real_A, self.real_B) + self.pred_real = pred_real.data.cpu() + self.loss_D_real = self.criterionGAN(pred_real, True) + + # Combined loss + self.loss_D = (self.loss_D_fake + self.loss_D_real) * 0.5 + + self.loss_D.backward() + + def backward_G(self): + # First, G(A) should fake the discriminator + if not self.wo_G_GAN: + pred_fake = self.netD(self.real_A, self.fake_B) + self.loss_G_GAN = self.criterionGAN(pred_fake, True) + else: + self.loss_G_GAN = 0 + + # Second, G(A) = B + self.loss_G_L1 = self.criterionL1((self.fake_B, self.fake_B_postnet), self.real_B) + + # Third, silence loss + self.loss_G_silence = self.criterionL1((self.fake_B, self.fake_B_postnet), torch.zeros_like(self.real_B)) + + self.loss_G = self.loss_G_GAN + self.loss_G_L1 * self.config.lambda_Oriloss + self.loss_G_silence * self.config.lambda_Silenceloss + + self.loss_G.backward() + + def optimize_parameters(self): + self.n_iter += 1 + self.forward() + # update D + if self.n_iter % self.D_interval == 0: + self.set_requires_grad(self.netD, True) + self.optimizer_D.zero_grad() + self.backward_D() + self.optimizer_D.step() + + # update G + self.set_requires_grad(self.netD, False) + self.optimizer_G.zero_grad() + self.backward_G() + self.optimizer_G.step() \ No newline at end of file diff --git a/overview.png b/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..524635b92cbb186f8ccff43a7888a4a70e1d595c GIT binary patch literal 286833 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

@M0cAH4!q;=-DjQR3uW{oF~ zhyMAoD=Vk!LN=!@vC9@Ay`9`c(M-Sht;MXN04$fE#%JO7wleH(zCD}Mxz$UGi+d-= z`q$M*J=Zb4P!)KW<4856w?AyvHXY26zSwM-=X)lsALwli@oRJubZ9bp>AN?iXMwc3 z=qYEIKH1a(g^3FXbH{#c^qJ=NJrslAP9>gS^o{xo;xu9t@Za@#%Ur0th=n6!#jl<) zsb?h>v;lU*$>`{)mu9V3;_k>o;*;}-51SDJogUBqo)HldrTB?YaRccUciEM1Ia9LG z-4W2b`e4_3cQ`3=!avALnV%||5w+V~Kd4eZ{sQxG3A>Tf8A{45FSE)i=@3EGCd&U}gT&NS&xve#z#)@VOmV<$K&f0 zh2xXKC1PNQ*Gj;2k(R@f`w~Hg=~ai8AdTn~V!y><^Abc#S+4<|M)YQ&4|dcXIWMTIK8sW4}S$n=7@(pW6Vd*HaYfuH-;cy)G0G)6zpXt{EM zTfUQ-adXj{umCw$PEi*^IVSbMl)dGFMeJM5m(Kr#b^rH4!?+64)8{M#s7G^_bcz4^ z#NMroJ;%lG=?AyZ0nm3QeC2mW&8I>9ysOXg{ z!9XLMc&xz-e*kqwfYZm(jZW!ODL$|L$eKF*6`yTpajxbD{m`Xr@v*fQ+dh~bHdrRx zk%YFco)OBmlFz9W9p(Hbm4}7uE5T+iOT)ux3nLhZ!}lmGGGO5Oo0(?s^`C5=NG@04 z$$@|wjB%VGJjD)X1#)4^uC?!-y{dqUV*hJnZyr>hexkWjrP;wo0VUtpm+BFSiVeCu zV4?6lO_T!d}3+_X?Ze4MWgTuK{Z{fzqM#IzF2wub; z(|^y$(dB4W79Abk@YL^TH~~{BPf+U*fn+Eh{EE0`F`tE>^P!gf&o_%FzU%74(woy? z6mVnY$CjT&JyV1^q|R^hhOa$%~@Wf~&9+V;6L=^Fa5i4K{f_TYKWnyBI@bsSgu)-X5SmgoV{b1@HD728yLy0=Vl87!~*YKxOW(1dXDE-W9 zOta7;(+__j<~Z5mJ4Xb%`l?aXu?b`wmAvKcfoJa1-;Q{*#4fbn>w2MoZz|-RbnDWz z>j-SZ(A8*r@ELRe1Nc_Tt;8Tv*a}h8u3-Tg)(c^V*KodW!57+LNEP$rKn$dV!Md?0 zimqIuri5~^DFOR#!l)>+k4|mY-Ju09X+dN|&xL3HO&$Syl#(Ip^#>u5f{8==Pl~bs zjIi`yAH$!0Z%VaU*!}Xyr2|f-RzS+kLeyhFx;V~iOrQIU>=Pw=29iHw|I zTrb@}lb7!;X-)C^{dEhad_y{YEb$P(L;!}ag{t;s9OJshi(S{thWH8moG!oy9A)&>*sF^N<(<`VBaRVZt;N8QU9}_< z{+Cvkw2Zjfflk?+py2Pc{4a^u@R{E2Zhvv|Uf;zhst*YR++wTU*!XzGRZZXcI022{ zNxXXqN;jT#2E;sRoo$A=xtbDJTM+>`1ScB0KVM_J8U_zLjF$0rqBQ+v_M+IqtTSQx_o~@{ z5l-Ntk#qn@z@>oS6_B0T+_VG`!aX2Vl(m(-7=9!1B9+^s-{RgfkIVD$-ETbx!x+>< zLYLhBrXe-IxR@0%^k>q*Q7`uC5);Q?S*HWC?$O(@&R7a;%44MF!@z|>^Q#((qJsxt z4Zo5cO%gSa%?h6BVluJ(BV!(w7X3#EYW-@`Y@8s}X?5h<)3@(!?dQFB2<{F;yOnjq zVi<=a3t!WOnQP`oqzsWV3*QN_KNaF`;_tu!$XI$P%GX?_PgYtlvT0Cq6Zzg8(Q5Mzac03`5cn?I(zyZg2<*&BkW@u#OeD+Ik4~)8x7eV)INY>;20G}0Wx{6+!89tjukO27=D`(I9y%7O+d7Z+CK)yF>Vz+)0 zM>#Xtf(V!8erlodL6I;|)Gj6NrzS^O!<%9U_fyMSojnbSHZlt#XsW0wc~MM8$XA|Y zF8g09Dx^HvHN_jW{IBp#$|b|F!-Bh{p8+VSsHmtU21whX=T^K~61?4a45$&u|4)*p z%9?-kY-F9uH!oy~PIb#lOV^j2P!1dQ5P-BBcyMUxW>Y|iO8u$on~q;-yr1iGTN}SH z5HTSl(nd8#!kU_ek;7%us+MF=87-?}X$hiuGl`okTmy2H^8wU8^%Ai$X&56q6ei{T z?U4LXxb{K?U+%Y7iUnL-UXFjhnmklFwIo&4h8y^0VqvT9FE zIgPL}0~}Z|=mdDaJ+>7kf9pKko(Lk;=G*{#HvQTk-jIJUy`ViV3rEb?1BG^vYO%ijNQH)t9+@rQEN_G(+S}i#vHVS}uKnxAQ8xyBTWCW6 z)D%g;MHfwJ4Z6XNhRlRjwqHnIUfw{f_|@rNXmOTz|G(B9xIB04S`5J*F`_*a@qLV# z<61re0hbZun7q=4l2}_jNXMqoNHGdoC3EF+?S^dIu}$BtWBpn<<<_p4#s#7;Tb`2% zVbWF*A_`Qo`;!e0BOzicMp|>&ZJjbp%8ntlsP}h#POhlC3m;OGZZcRvM=% zx20;B68Vo(i@)j&R_$R*yy@8mgS(*Jwn!VH^ z4uR+{a$X+SX?`R|vgE{xJ8c>2Ah!*nU(KJ3C!7u9VT0f3-Ht+4HXU@)43SsZ1ePt-{L+TN|nWCYKJi}VO_+9#* zZw=o+Hcla(23m_41z(TSI|bl|P?x@0&vm)@H+&N|h7 z#|ErVStBMRE_K5Ta-Q1hcn8Aw*%g=ddSPliQr)_b(5xs{v`j;MK4JJD{{)&4VJ0%A z-u8;;8!s<=aj zyJos|?;ke-co347Q!>`oULE0JL;4QJ2X~(Xr)fo}1BPl{FTD~%U0u6yLfB|uYAmEo8& z(Id1b*4WB%aXXB}bc+_dSDKN+MMK5AFA_(>*X5t;kuoevkZ|=Gg{kbz{2-)iW>v7& z)78cp;-~j*#>2`TRKT%*Gu94IbE-~;`Me82p zPF6&v&6J~o*kxmWTqipOd078 z5O#Oox*#6gtuAU*-D#`_9@<_CH#4!4a8rxu;chzo@@x!krIf2#XPw5 z5pFOxYmH%`QfNyR`#FsRnar2VTS54h$Cb-u-BX21f++F3+V_*%om74Y^6#-(=*HO( z(hqj}Y5yO-gas%ZH~w0Zr-OTce_kd(0W3WTr@7shPw^WZ$-%!a(W$5(`fJrzmKf*? zG1Qb#4+9X-6ni5%@7y?;5E%ju9scl-T2PQ+GYi{cw%ulT?5&x%8bnBR2J3pm`?Joc z<3TnxsiH40(viWHigGx8-0<8XqO=vgvOcDSSMl_x3NCD$=<2Jn)w*wkRrp-!!Zan^ zloKNH4U@=~a2ze-rTSn6*RJs=%c7vO^q_U0>bPHq5$1JrdHRt(<1M?*R(uJ8X>qIi zxrKGV2PP5}-0ps>w5snEtj}$|+{pDUz+sWAuJFEpsH&hn#TZma$1ka@93MxgC>v{| ziVscl&zq8I7-be#GmUS~y99+P2#eS7!}&?9sH zj*_vT2PybAyv+lHPWlrVz0vxngQMoFGSCZBDtzCP_-$|qsKPc#jk{f9>Sxyi3!-`8 z=M#-c#H{QCDT*TQ1xwe`)#-Rtj}4NJiWj!hUIi{2u?zpgpV`}G=K92rSyyB_r3 zo{I%t|DM=f2mqQU7i@>b&i{BzXr3Rm9#fzCN_5&c%*PlwG$qq4Ej_{TcM1IFdbvRiK5axu(o!{u*Chmuoeo6wEDfmyX$yNqf2Ad7Nj!T<)!*q z>N&*ZqE9MHEV*}MXTCweRp<>qML9dMCsJRRF5b;~VGMK1o?Vnu+oK~BU#E~5r?37c zXIIoVL@Y#&v%2{YJ7b3|ej&x37jcjpKdno_Lq+k4G?@3x6br~98$rd2-ooIp^d9;! z#8rL=k7hi#FjJJ}YXLPwX~OT+uD-m2Wy^v_sMBmjf+q9%7H!WrV&=Deq?@{d<}9+- z64?Y$V>Pq*Z6)Vdn?Vzt#oVCh)j^M{maXKlj zt}K0;X(@x`+;^9a0uL{}59vZ9$WYn+5RWxvt6HJNvI7e*3**A1|3=z!I+<&@Z=_0kfDf#ha#6EeH4c97;C}_g;56g?V5Z04jO27N<(N;4= zh=QArvDtSg#ZPc>g3{9|fd5J8#lFo(R~KmCIpR=*^iZ?Q-i+eoh-qL=m9aZ%^k$wg zs_khc^tUXcg+hfJ-`fWd5Zeou?gvp6do}4nz+~TGVDBImfok6)j)Tnvx7MEB`jNmK zJ^cgtMVKW>jFZIqA>Whq_cDhnJih%3O>SK^2nzq*w104ThFd^Z3WUymEwB$D5kmTz zx~N3ezC}L$rrr7(1uxixKL1m;3{6p%_+J$cR7!&OJ@69c&Ip+a^$28!EzWW2rX4Ja z<}{nGPewB=h=8deWT$Q`y0FziAM4GoG7-sm2Qan!(OZ0IMuBF7KECqfC43&k$%d`~ zN2euf?GWIvgpDa}NN zC#2uPaS9-@u00ARAA+yD}?U7D9G;obPbK zpyD*gTZPI|pyq`$w{=T2<>%eHgaBJW#H-h!Hwsc1Md@6ixu`JSN0CIkZR=XIWe(r; z^le;Ko}^pLsJJjC+)xN|$y%T(YJY>`rFU$gNG z%M`eAT{)y9{J1pdS-uKD-kUO=_ve9#PqUR;{rJy4ujs&qa{UWm($=58U#<3c=E`LI z^6E%7FzT%V1o2j^B8vgyYsj=T=9^#%%DZT8Ds&@i`7EepsuxVG$Xa1bkaCs32tgLJ zyt5L+k0I)^OZl9dS4$X9AB)LOv{9+xM{U=%+}uia7KuBr)n8Jbu4R+Njr}F}%rP+j zKh4Jx;M@B5qGjE5;Vf4;bn?56gzt`;DTB&Y*G=z;xER6=uRJC(>OwmAIY6gcVqDWn@JoqWri+e-WD2=>`el*S3h5x8v1K|{xTXQ_dbB3f>!GtuU zh#0bEiK+LhT3|(Cf|MruDk8qlcB$a2S72uG1PJm`q>m)HiKRB!2MShfU2m5oR!xIx z9#43&1f;A&B23DY74E?GpJC*j7>W%;Qq?{Tnm4=gFBU^|>pmcz@S)zssvrbxi8#DC zb)7?1yGL`U<5_n+OmlDCF6Rzfbz~H#Hu?5>A8k{JEVOJkwx#ZgSJBg$5_c!P8H|I4 zXs5+7#A&%LuWKyJxg7RE#rUq8d+S5B0e2_T;qb&`_)u-C#`rpD~?cKJs3a#m6*#2zcNpNiH}mq}ie3iou2b;5Aoz4_d8l{_jC zPYqq_L}k7@&+)G0-j5flI=Q*kURuqiJoeKfp`eKT{o4T`helqkC#sj0{Efa2{X)eQFgjYV{Sm4}_H+$fJl~=ZikW!Uia9XiWpc zwFf{Uw-MOoWPg__wRU%X(2L5n=@@3C5AwG=t1{i3Pq-*H#XW)^PLHBL-;J*=Cpc4{ z@Jb9P`*B^ zqWlgOz8c6KwnfnQG65`&^i{gWDaxH(sT~$%SCk!ll>ka^Vq~mJ#CUP4Mc3DJTat(L zvkPEmIhE&DW?irv0W!PeyB(qh8pf>I`k)2D=xZ&8>#3S$C2GTAW@e5BEA~10YE~Ag z*z+>=-ZG2(ZN6UFhLTHrwz5~Uvb}ICqU8HXdK1}}GNfGrwRRH3#b|2C;vR;~Ueag89&ZjJN_q~B$4QNw`O>PW~~G=HbN$kv847+ zE2A;ZUhW5kppD=Ax%33J_hjlyfmWAwvhiukrfqe^nSgKeLzA^rRM^$W7mfg6CnddH zROO|_W%Al`$0tMa-D|;!$VmHtEB=5uhU47yff1xS{5AD_!0N5AoSc{D78Wb_w{7=U zMmy=!g{E+(jy93It$@4Urd5GZ|0kw)Wp-p!e++a^((KD7#wC3`*-?wQ_^0-EE&#`B zVsw;#40JQk8kQ8V0jIjqy(jAkU_j0qRur%0$BI{%Ukv8bT+HeNZv*?@8p@}6{LgB# zXHakJ`#Y&hpf}WMtM`f=G@BV!S>5dFv{iq7tKM4&Qr@{IFt9syYrebMnt9pKSUp$-JEP$NpB&r)=ZZSIM?T$)@u9i!Nm00?0Nmp!ljJKA2lZ%nN>dmWeZpuEnC z?e^A$d<yaWrYf^d(7S@UJDYmJGKDcmX2Ml!2ueuci|Y9_)mDN~>xYe$PPCmJZ0Q5CNW ziU9Z0&+_3F4IR54Rq+#>8*@k~?Ab8C-X~S$z=sam33H}i`In75C~8*)=@*9H(y`ac zF+4C5QE`I!sEHx09rZB9Etkjssg;+k;Z>9kXJ;ARnluer0}%L6OX_m_BnA3h3%O}? z0&J1lipnF*&$=fG_z|eX?C@rg&{sf3l6va+v$dhFgnYhsV2t(C#;We zotCek-fHKT{mTsk_}veZHLG;loIZT0zqDG=iMC_z0H&yzx|U@TBsH(LMcAe%ksp%R+91a(}w;tp+Gsfz)W1Ms{pt zObA~Na`k!!j?O$}p`W+=8)tvA1V7y0-HJEWxEiF*4MuLZOvRfiH3Xv^-(D#ph7OrycTfMlTCSso$+~h zrAgw*yz zHe=5w?zkRdmi=BeCs`;C%4l%sIBmdzUJ)C%)?;2z^nHaQ{%LG2rFL$09vdVDyOM#3jzHG z(04#+ZM`a^8tHMC81Jj)WcI0oY*Wi$eN*fFMUDcjGMZwWX zR0GL$qceT)DiA81m9);dy1Ld3{rXp`iGWnM!eG@cmg)dqHH-GI_^AN#e{Z8l{025u z-UWB>&o!)71l*ROj%{v$Rs?L9>U$Jfm+>6ZW3Z#+p>zn2q>~e;l(aM+G4WaS<7E0@ z%uH$-m0tnBR_8yQl9*`r*EC(WhAK^>9HH6SuNlCl$+^4N4FWE0`??`Z$_0rsTJ-WU zwSduzlFR@5#?n7x!FR3oCJg+glj*lY2XjpSid05%$=HrLc9b+xKgs3ezAl%9I_v+6qj1HR6|>3e4y5 zr$QRIu~dUjFY!$IkDTo4+T)dO?cawEeAZUe4yGy9h!uI)rm*L?F3SuP#ZF11sGWas z-FsRYAoci~L9VgZ4*oJh3-Ue2n=be#P_r0Bv-*T_7E8WT8I%=?FK2m?q}#eZNGRiC zn}Cz2LO#FtQlL)=G>BV;eky2}11){| zxc-e>7Xsdm(A3NbsV?tnDN1nPZ56gkh8oTe>rcjN8k|sqI(5}X>p(vgQf2Fp>oQ=o z$iRZNW4u2qM8$B^*w39Fj$)Co9xF-1&wrI_`Q(U){&=(z2F;c{y;ZAEH_R+h!w_%>f1)+LqQkT*Kmm6~*y#?&8Qs8^| zM`a9ea|_yyR)rzHyq z7#9T)Q1VKe-)xPhN=bywX!_xCwF&p0vrvo*Lq_c z{$i;gVkYT@Wka{|yt{G6HPz?oS)jcPXwsIcFZlbqZvn4F$+DI5YpK1D zSxK7#Q^0IG$F!hP$2l9}X(uGXG9#}UL7>%KKXlcYI8~HeScJ3#Z{>$3{-`dhKwjjX z(1f$PM?1o?TIVSA)GiN7*8T+4Hh?Z`yY)#ZiM0Y%_CNNaPqCLBPS5;Ii0DTb7A^n8 zll=C5RlC7HmSSr=4gu33<%Ihu1@v;xb`v9}4BTBF#P5)bI?4zM*KI1Mu+13;oTJL&;{VU39i3f2IX z=1Bn72)gekq0G)5kmH{F3;umZQAR2B8C5l)4sX4882+lmfa7@LyDGpaJ)T%-BUTWd z)(2D}(_;~3kpBHT{>;n861VU{Kx5weokI5_#MX9-v+GgHxO9K#fkH|wE&dzAC+U-r z$rSS^eHAqNGwH1{VTi>wAeN}VeDpI5HCas>I4Y;!sG~yp_o(z;h)1woou3x&0Zq80 zv$NiV_u8%0Sed1v<4?tIfC*>SZfj~Aw11p1n$LMVy|7fUC3t5@{_QM?y1c=pKCUHRN*&@;hcx1|SX>bQ9tMCCi6dN?=p58g0wyN?F} zHiGtgZ@Ky_?lWw7M&9h48uom8(~7CKPfHn5%$|ssBXhVMek3~0>D|*G{KwaHCM2mQ z5T7|*rhHjHIm^?psg2K*JuC#!T-csKuT^{`Z7L3VABpZEk82aHdAs`FZ}uV+Sq%4| zx2Ssu#G5HTAx9}xQhlA;Rt2!!a=m>z}Qr7`RAcbA}f`-(zx#5 zrqN?D%aDdYcnMbVMZQ)Lo)+Y-CCxj7rxM@i@)8!ty(&x+EqHi@SLTbGjGzZ^=-IEx zXunJ@OSiGykuhaqZVXpGVR+2vY$J}Z07|r`N_Y#(1d8)6dgAyzAlp}}vJ4O4=*GV0 z6bT1|vJrk&ld%z38l$IN+A~D6{To--Kra|%_O*9vmZMpMn{S2;Q6XI6L3}|IfHarX z-#?Zp+GE8W&^^O4iMyYdsbR;M$-5wJfbsQ#CK0YIJufTh>+D7kF0)`lPjjh&Ts zZLA|-F1qt@r7J!oV?JLJewZcIQi=+9z&bisD7&ykjIs-c%GF8TStvsfOz?brP3Jy)X+09^q^uRd?yt0c)8=u9z`WG ziNY#VW6I$P^QaHtBrV?$odyPj{>>g-4hJ|GfiLPwg-0Lg)I5|_pLz$B#R@WqWIL;$iYvV7c6~xlP$7FAGg3lkTO!qbT0I zOzcP%Wn>O01u8u1ed4{tm6^X)+zX1brb-*=WA!$2PAbqGme7s`3IV>#K&5o)W96r0 zL+yB_`^#T8%j-#9N@6KDu8x)M#RU{^cW=K{*voJ8OgKTNrnLepgTKG_R=6DIqkSo@ z93CG;&n%mboowXBomRSMZNrk_u1IUEjz&JQx3k`Aa$*P~-*Xy3{R#VH2 zZ>J}lPQm+^nEtoS^<)X}KdR9-Zb;G2N^|>zHh{?hROZ5aBjY_wQwJV2y|?ek>BVv4 zPF%4NCs!4G{TgGC*O@%R8_W>IPd`)fFkIT8af*-ufiImV z$e#2|CzcT4JuD;!CuI}T+9*6a4~Zxo^948+cniO8OF=3qi;ELOWbmd^l8C`TU05k^wlzgd5!FCE$uZ0Y&l zw&ySrBTNu7YG>UJb3e6&q6g_@cq3YN`qw>EJK!x=lLI08|UwD7|k;E^^KH<8`bfrKRA_@%+ zGV2MG&__!dEF-Pee7?oO(~S5@nxM+C`_swrUC?;QGeJk&Eq`c=3{fP^4IeCrZVv90 zPozInj>=fi<@U(VoE|7ogy#;jeNkAibGrp%f$2}#g7E41 zzI5M~-R$ahg02N#qC%Vn)_8^65>pY~vAEK_v5!gfbStubWrV%>pP|fI&@^++;lbN4 zriu`_`viMvkqN}BTFytNsxMwP1Uenb^{5)TCSRRWbL7S}#$>)}h+Jr;F zxjKWkINq3F_(V(t<9wgp$uln!gXVN|wbhW!HoGa>X;y)Oh!1Pqn%`N8MU<$So z#aDF(+ZzTBN$9YCl*gi1f`awK3RCofvfIaCJf^J9Il-eOUq_CFz;s<|204ws)@Q_; zwHyphbn@GJn!#H4uM)W8?G^kRA1Df_$&RUx#|ajEoKk94FC&Cw$DzNL6|n zPFzx0xQg`CUyEFaCV3By5Ocsul9d9L1{F27=xp9HDYJ9X2x>lG!Y7bA)1f~#e<<|~ zazrgp#qsH0%N<~p6(--6O!ZSg8=6{d>*9Wt0T3Yc_RCz0!!1(kNsz9}p`bcPuK4If zM6J_owE0U^!Sn`64w`{k>5Rq6aRjG|T8m3DQRosj!7d>YqdH}ZHhfAS!Dwt;jo|(8 zD^b(g(*F|}`^%OMT6}3*OUiT=An63EM__={6?sS(niDKPtf;CK2WvBkl@BNNVi z;KGxENWM3)HSbt8Qo4;-_$O6Yca$%wK5s1G_u%doKD#QB=s*y_uKp#vqXq3;GtWuqy!G(;=D;TlaB|Bb^5l0KT<`vck)M4~2XB<6r!YIRX%{;m12bz<@v(x*ltyWp4+K!q@v`|^wJ5xR+^*6VK z!)n-hUg41S^H+Mw+d2b&|d|h8UBnS=@(eLy_1ZJ0qtZ9m2zlasa_KjpagcWzkQn&i-u2j`vaTv_% zLPjZBWaY77ht6`JUpla-!ScG3<^2RA%j4j3#Psv7w$>D;YqNN9@N)Lr_AmYDyS3(% z%f8s1NZQ|+DPy_>AbOFFNT$-CojwDB_SQAC`EuQ| zb{1$xb8NdcBUi!B5?rTb@i+xp+Mru}v_0e>RxTOgO2!m{&y4H7 zWGF6|x2s75Kjfu9ucv!Rkm?`@K}_`ZVyj7O~BYn6ei?Tu|i=MJZd_i8qr+Erxu`_l)+HE-bqVnwcg;|gO zPMe>*lWzXmq{?jzuaJBp9&^X$*ZlDFN&jF;<$S(Wytv%tyZnT}lRL%3OTv;{=u~2< zi|!jN{<_{>(l#1=*E0s&wthU48MHPpeVaE|rN2lh^aMjxxNLV`pZeoZEP|G}9``j2 z|0Uj)zkre)N%RuuBAO{THi)cs&&kEBvM#^--aS0qWt}+PfWeG{YXZE<2C%u~va(`+ z{oXo^cb^s5Tn!a$%^?N&aIb7LZb;U=;bUjss%;g(TzE}nse+*WhiHAM?!EN^H^b0wBix=`| z*&Bo|01z<0as! z>BuWaf&glWL)@7Ck;!0KthHovq1<@QeniB>&h2fzFq z-J|~fzk%!sMK{jgYL*sI@zhm`_WD5mT~y#X;8i;B0isN@jA_KR9FgAgqIJkEH~Xpd z1{$;TMx|zNA2q)8JOOjg!w#N0J6J7Ma-l14B8;1!rI{G(`4(-}y*X$hC9>f0rb}C4 zyAY!%RNpg5HIG`$o-HB4P$}L`ojBoONal}yP5hrV!-8oN`W=7w>-_hi>&Yt0@dC}q z#dUddySjw&wRs7?Y~L`6=#DzRD)?JduXY*e3HHc)yzFVwRJMSd%}26iDP6eJX)hGJ z5fxU|W@$m5RVD`O*76m~nnrXJhqE?SB)|A2bKyyUK9IK;vJOA5EBm5+$B>;`A%_>) z4#aRy`s00hePw-UZNBya@Y1}skPm{64xhTNo=sPbRiPIo=}m*^2Lxx=8grvb4XrI7 zTDQ$V2$hd!L%iyf3q<7<`AWKD`I$~`yaCX>xQQP z7w4WFascrKy^}F+-m~PIoHQrlPzz{#tG;0Q!Lo}RBrE1h&N&v*i*qqcFFB76kn+g&P_@q-|0u>@M-kgJNw0g~?s_y3Epw+^bZ?cTpt z1V!owq)TDb-3@|tN(&MS(n@!VfHX)860%{--XPuGBDsl8N=vuErsF-mzt8W!pMRcr z#&O0Ool&prI?uI^^*N4ZBdL<9Whg`R0s^)1Co&YsCNempc8dnT?yFTC<0*vq3btA3 zuqVVO=B39a5pTLvbFXT@8wA@>XKVowl6K*CMv7=MDGuu!*Qdp&66aaRMxT+ZH*y0! zC+SuD5Ge$|I0*E48R#T9U#rZHw7*bJBHr|cK?y4_JVM7_xw*<1KfYI3`@AOyzRpUr&6g|A$OFa560?vB zL)Ug1MKJ6r@k+AP~ z8bO@lAda%JP4$={UMUQ}uZ}}tM`66144-0$dzmSvT^%+wyp{VNo&q1h6J6b%;bhim`I+-Zz8ptNHK`Q zPz-Hle?_#ZbF{J)$=6`N;>-wvn(EHPu{9^&lN45E_rc47w6YkEbt!X_>Lq>EMv^_H zXICbE3JQ*T_%^KxnW$08ap&E6^?}9`3yl@$^2pv>ScOflQzeftIf%fH7-TJ-D74 zKj)9)N%g2;!Xu+xG<>UY`kaP{E)7)MHNe^BHqp(YI|$X-bXqwiRLKIXy71EuvakFWnZFyAv*Qc|0BGg zIypaAP{}x+Jc__kCP7nB^&wl2uv=s71-}-yM4VBTMl9yzQMK?#yu@R%c?(Q=A`cn5 zithACRT)89^3vqh%)O`*{OtkbJy_2221@vNR2}%HJ_HtHw($?l@JHSy!lvGQn*4AQ z?l4v_qt1aKf{Hy^xmMC;l&h@hgpLHn=i-J_!b~yHt=jekdiJgbws(8jXrS=MdDwDt zx~3%ttGqm4ghD5|BoR2K$}e>g7EAd>uYftk`F2jvg5CQZSvcWpS%3t(iqDl zMQ26E*aqJiN2S2ET>-i1pLKgmx1fwfIreaD?O6zfpsGcK@ekq@@m4Fe#oY0{V?D3~ zueNQM3!H+!#+6xTcGuBwM|Yn}*IT_4E`rkkP`*X{(dRH-Ze=jp8 zTwMEo1ai%(JW^XaNb`m7Gfn}Q2+QjpX7HpEY!B%J+UfE zO$aQekYcoI{xG6@tQs?uA2}lJCSg;J{VFjgoOV1E$h4;%{!5(4t?_pJrkAm?cz!wnFk2tjJrwKukq{L!@X@$%pE7qfZoJ|p zy-f0wVT>1%zD&%_=g8vRkpS>v85U9HMzC$(lc$fAPxeu>WitvUHeeN#gLk8%BFFO+ z0+Z^Y-M zr`hQ{ahU@gw@rkqobUAJ%Iv5jrc=GG0Hp46Ckit5g;7BS-sJv#0^uKPX_XS7`+?V` za=b9=xU*1pz#yB(KPy&&IFPit%j%k%#gIg>k$CYJN(yo2pH}jhUTZh=T8HH=Snjq{ z_ddz#P79A7+0B}A-mE$+hxiQnbWn{{P1fnQg#G|hL0_NrfHbo_t-Stp(ff^^hN8+B ze%jg#{2Bii48LF2InGyor~4I-^aWDgbf!jOtJ}lmo3EdCr_!NNjJ%ow71M-#w-Vr*PJiq zVs#PbF*_O@#EXU&TDdP&@43HV9CK;%n1lClwfNy&x(X;0@dc~QYaR5qk9_ZW{lUJ0 z!c@<0&=`j~cU@3BVME(cIzjWXj{1E~oorRn4YIxU2@l)P~Nq+bAd%tnhc%0 zv}{nxRKpd)<-^IVoSEU{V&F?LpHtv)G4q!CWf4s;$Ue^j9m$uUp_wx|m z_nvP;8{Zkac9x{(w9CY*su`OlH~zwiJe}^c16GDZtE!Y~>l%H2iA~OZE|@@CwWjVd zvP#|G!;ZFxR}oz|Wa?WW$&{v;eJ?_C&Y;Q~yb2HXPPeHy?-7K|;t99zj>~bJtxTj9 zM4b*;bU2BltI8YjB2)v;kax$s#d)r1i=r3Q8E9Jy=Et(Lg&(;O#av1Vtd+m=#F_c( zkt1UMNV=M}KJ3&Ek%1`;k? zoc$$Xhw;B-TK+DR?%z=UXL@yn1>6dY<+^dD7<%Mr{B-1pPmizH?ygEj zO-2QJkq`D^n6avYX+)(hq>t|v03!!C;{^#8siCfRtQ<)M6C1B}i^9Dycas^#o~f6M zhjS#Pr)#z@uYVZxOHkHVRgrzFL(wF+9NOgZ19WgHK(U&^h!@xLG8+>|h}X#dmV=s^(Abuk59%k4fr`RI z>!Dw7!=eddoMT*yAi)T{1*CeX)O+h4&cuEBp9w9_(!>r({H|Tyy64)V`SY{C_Lpz` zl_~>{(XI62Qd&6JWDCF9$U|AQeb@87Nm96=c zf7FV5A|ms+z>t|rMx9^@Jkgxk4|xY$uMkR&U?Kq_LFYp+bjRa}3{Zh=LS;A+V6gQ^ zodp#f`A9nq1CjA46|J+zsz;Kn;-bQituzveWb|}?AE~+=BlL)V;7ddi#NBux*S+?V z4*f0Cpc^GRPtR|xrf|CR=E=eDGbL?{_6_Q2alzC+&gqif_Ai#3lB2Ye#lcb2s@alw z_XEDBpNu>E-`k5yY`Z%_TE(nxr`c;uH{ewH>C{KjoyO!>IZS;gGgkWE2^MGacmJ*e zlyPE2A4bAAD6Pe@DxMuDzeFK8NOHZ6=)im_>QDcAAP9X>ds+xnYR-hj(l|VrSj;Tp z(aUZb3wo9!d9^>ZJ$o937CB6YZa&@q^!wxZy~26Pa9e5DGxtc%`9PvXno8Y?G3X}! zb*Tjt?M8`m!O!4cr+rU@{N`(q!EenxRS6+iH07l?eP6dbB$en;*%Q?bJs4>}rE108 z(G#vb`4TU8Cfspkr%gL*Q2wg_lo6*v4F6YD0BzOn!|gU-`}nI7j()MvK_iEWAAKFL zK4gB1JI#eT{hWRfhL@QUO`o<@Urihz#?Et4cW2j9&`T48I%|9B;ltEphC1CbJWaN> z{QPTGT_~`^cQI+`IE%Kp@qf@5d7a>hz~mCc$@hgfW?m5yZ`1J~xEE&{QHDd39i3~? z`l`2w-#)3PxNW#8H2OY=1EF?5{b_gq{r+d&8yV?Ou?tICnKX>G4p?~`V|;ZO=ToCX z*6~x+wQ`lkC{874KsiCEYvdGt8%#l`t9WUYqHTUHKZL>P5n&{ZMG5ZVv2v^yUC^eZ)(}e*D%+XP1h+i-R{=oaI z5&Kw8YhLn}&c##T6+`tmRjTZA)gU8Wy!m6oNx_ zUR;Vw2C%llq`3K$T~XtQT+FPKz&Z7|g|CD}ulDrbH`RuFS4zvcxUySR)sbudA5yoj zcs^>YUu9}JZCh+Pvzt9G;JWs}{P2Qta^Pvhe#$_-AKCA)9sX~8n-8?mXBRw*^Zi79 zyD85q%}&|;-3VKZg>XHc`L;dsI4;m+-GNO46g9tp2ko=@;|Eq`)g?r=7)DiIRGtjo z#B)e+;uZeCQWAIqZ~t?B+%{AQ*+$5Wt5$scz4V4ukFi8ec9=bpcf(C6-v?0tS7Hfz zCQkFy?ZDnuotMQDvXw%*8~^&|QxKN-{h}}u<*%oc_~_@|2T|Hu zC?r7dfDDpU97&!FL%;C9N*kfVrPxdV{34!r#>3HGzu?D`|1L-9?wx%2N2S!J?mXtL^V}x5~=#)@N=3 zddAUb;#ob{5h(?mdm-(Gl$QTq0G|j{xIZ_0E46B8|C>NZ?lf)-HNRhE z<%Nb1F%~DU`OpKJ3_OLq0|N9@g%5xfD+6^Dl>JJ+sA0K{%fv;n{-o!zJ08s;r@ zK^j^LT~wfLj|4}xD_)kh!mWq`Lnbav@{bPfeIw;I0SsAPMR9BwXi{Ch z|LgIE9pR~);2!4yMP+@I>P`H!gMw#!p0N@0(mPXMx{ogFaE)NW!Cm*Q({-$ZJR^Me zKxVUK5?1A{WKFP!wx2Ac~Xgrc$<{=%54f2=a(Ff0cNXak!*f`)S-jvER%Piu}ov^*fx^?8|y{pTPFb;hOSi;8i&H z3M8f7%r9=qk*3WmC0EqQXpJbLR7`zU(1ez(O|`@E^TA5af=r_7W6wm6xo1YhG^5*# zW^lF?ARK2q22q0l)iZqf4{ehpyw5H`|5B4?#4ID`8=3WEotV0{ues+{&g6&2w6a-1 z*8Yw!@@?zg;i^yyOVa%ZK3~&SN9ExcN%bysL--RyMQeo03@VaZ>D@hV-e3Ll*%e=T zEzrh2AN?a>035@hhl&;68r-!-Q3~p&wxX_LFwI~D?Vt8 zh}e{Toi3`rB5YuipB1cvs|}4D(MQ#=d8JSgT2#$xCuKqN9wu+7hTE)kJM+@an6ZJk z18?G76_3X8bp%P~w^&4X(if;;J5%AWTwIPi5fgyuixTN9{;IS;twUwBebDIlwPlNH zQAS!H(&`jM9>*UKSSa!{k7o#1w?+6UA^eZ0X7AtlyK^8UJcZiicN%^XVHp49Y~-#C zYphY=2YmXK$tdG2#=%K|$%) z3AXyh+~X?l!xDKCsSeeuW+U5{+YT(=yM5XlC6oMXkBbBrc37Vuvs0aa{|Y}Rzu==? z-f|!(e;-@Z%r$U?jlV3>Zu^xxsz6$rmq@rwWOHi$B$s0P4xM!9(Y?wEL7rL~vkRh! zbbH9k$g-gOZvw71U;nq}{nx+8{FFk-Zi&KTpUxLw3vw6JjEE%zrksTpghWCdS=(D* z{ysL4AOhUMNZ5^%HlF13o)d&|CdhNqSoP9L&!1`64(&bF+GD$5K1!!HoWLe)O2ML+ zk%isH7**#;hF@lP+~GGis%ln7SwvjukbLwS8DB0B3{8KQ^Yi0|kzvb6TLnP-Ge``C z=MbZ=ri?bEiC*X$@%*hjsD;PbJ&k<9_$M?Z!I9=99a`>>Qf2$Ft5eRVm#BvFW#cN= zQPshlaFu3Dc!r7s=Y5d8J}x61E}Y_{k)RDJRMG}Ypp){G^j|p>uTVYS>t2${s%)#- zpT9Gbx|*d&DCfIAHyWljWh+zaa5W&N7IuS68k~3nRNUz0JKxOlzO973^86P#v7Dzc7g-xJ1N-gjM+Et zLp(W>{j;B&!F3TTYe06p=Jgv6-Rv0nbZLn;LaM>>ze%^8Lsy3pyr41j$p`N5>?tI|;TY~-((o-*Ct66*SyWLNxQ@@-pKdG)V z7=LoNs`=jl5YYSs6VBg_A&_AO6vI9?39DIgShL4)LBut^d78k_h8nh@|Os$t{1El3PmysKv{%S;5F7NL>9LYT8iCXa-k ze)32$;O#NeWZ!)yIAg@-lvHJwET(XvqWXN;A0vvL4Nr*?L)oLwo#LZYEjhX*MrK!) z|Ks6^8falY6Ti^`a`R@-oe*01`zSpj%yIjDqR-BnncX(0^;1HR3*DTyh1zmWf4TGxs$1K5`94BMvmtSP@yj< zp~vw=HW0iEzIi3x#U<`C$c9kS<(y{u@BaC-M*%0DHZ$^wuh#?&{(ENLn|hNE^|F_y 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

d5*+BFryg^#(A_ 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⁡CB$i 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 literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..05653cf --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +numba==0.48.0 +librosa==0.6.1 +matplotlib +opencv-python==3.4.4.19 +pillow==5.0 +tqdm +yacs +future +numpy +scipy +sklearn +tensorboard diff --git a/test.py b/test.py new file mode 100644 index 0000000..9514bc7 --- /dev/null +++ b/test.py @@ -0,0 +1,123 @@ +# coding: utf-8 +import argparse +import os +import torch +from torch.utils.data import DataLoader +import numpy as np +import librosa +from data_utils import RegnetLoader +from model import Regnet +from config import _C as config +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from tqdm import tqdm + +from wavenet_vocoder import builder + +def build_wavenet(checkpoint_path=None, device='cuda:0'): + model = builder.wavenet( + out_channels=30, + layers=24, + stacks=4, + residual_channels=512, + gate_channels=512, + skip_out_channels=256, + cin_channels=80, + gin_channels=-1, + weight_normalization=True, + n_speakers=None, + dropout=0.05, + kernel_size=3, + upsample_conditional_features=True, + upsample_scales=[4, 4, 4, 4], + freq_axis_kernel_size=3, + scalar_input=True, + ) + + model = model.to(device) + if checkpoint_path: + print("Load WaveNet checkpoint from {}".format(checkpoint_path)) + checkpoint = torch.load(checkpoint_path, map_location=device) + model.load_state_dict(checkpoint["state_dict"]) + model.eval() + model.make_generation_fast_() + + return model + +def gen_waveform(model, save_path, c, device): + initial_input = torch.zeros(1, 1, 1).to(device) + if c.shape[1] != config.n_mel_channels: + c = np.swapaxes(c, 0, 1) + length = c.shape[0] * 256 + c = torch.FloatTensor(c.T).unsqueeze(0).to(device) + with torch.no_grad(): + y_hat = model.incremental_forward( + initial_input, c=c, g=None, T=length, tqdm=tqdm, softmax=True, quantize=True, + log_scale_min=np.log(1e-14)) + waveform = y_hat.view(-1).cpu().data.numpy() + librosa.output.write_wav(save_path, waveform, sr=22050) + +def test_model(): + torch.manual_seed(config.seed) + torch.cuda.manual_seed(config.seed) + model = Regnet() + valset = RegnetLoader(config.test_files) + test_loader = DataLoader(valset, num_workers=4, shuffle=False, + batch_size=config.batch_size, pin_memory=False) + if config.checkpoint_path != '': + model.load_checkpoint(config.checkpoint_path) + model.setup() + model.eval() + + device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + wavenet_model = build_wavenet(config.wavenet_path, device) + with torch.no_grad(): + for i, batch in enumerate(test_loader): + model.parse_batch(batch) + model.forward() + for j in range(len(model.fake_B)): + plt.figure(figsize=(8, 9)) + plt.subplot(311) + plt.imshow(model.real_B[j].data.cpu().numpy(), + aspect='auto', origin='lower') + plt.title(model.video_name[j]+"_ground_truth") + plt.subplot(312) + plt.imshow(model.fake_B[j].data.cpu().numpy(), + aspect='auto', origin='lower') + plt.title(model.video_name[j]+"_predict") + plt.subplot(313) + plt.imshow(model.fake_B_postnet[j].data.cpu().numpy(), + aspect='auto', origin='lower') + plt.title(model.video_name[j]+"_postnet") + plt.tight_layout() + os.makedirs(config.save_dir, exist_ok=True) + plt.savefig(os.path.join(config.save_dir, model.video_name[j]+".jpg")) + plt.close() + np.save(os.path.join(config.save_dir, model.video_name[j]+".npy"), + model.fake_B[j].data.cpu().numpy()) + mel_spec = model.fake_B[j].data.cpu().numpy() + save_path = os.path.join(config.save_dir, model.video_name[j]+".wav") + gen_waveform(wavenet_model, save_path, mel_spec, device) + model.train() + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config_file', type=str, default='', + help='file for configuration') + parser.add_argument("opts", default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + + if args.config_file: + config.merge_from_file(args.config_file) + + config.merge_from_list(args.opts) + # config.freeze() + + torch.backends.cudnn.enabled = config.cudnn_enabled + torch.backends.cudnn.benchmark = config.cudnn_benchmark + print("Dynamic Loss Scaling:", config.dynamic_loss_scaling) + print("cuDNN Enabled:", config.cudnn_enabled) + print("cuDNN Benchmark:", config.cudnn_benchmark) + + test_model() \ No newline at end of file diff --git a/train.py b/train.py new file mode 100644 index 0000000..0e8acc2 --- /dev/null +++ b/train.py @@ -0,0 +1,155 @@ +import argparse +import math +import os +import random +import shutil +import time + +import torch +from torch.utils.data import DataLoader +import numpy as np +from Recorder import Recorder +from data_utils import RegnetLoader +from logger import RegnetLogger +from criterion import RegnetLoss +from model import Regnet +# from test import test_checkpoint +from contextlib import redirect_stdout +from config import _C as config +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt + + +def prepare_dataloaders(): + # Get data, data loaders and collate function ready + trainset = RegnetLoader(config.training_files) + valset = RegnetLoader(config.test_files) + + train_loader = DataLoader(trainset, num_workers=4, shuffle=True, + batch_size=config.batch_size, pin_memory=False, + drop_last=True) + test_loader = DataLoader(valset, num_workers=4, shuffle=False, + batch_size=config.batch_size, pin_memory=False) + return train_loader, test_loader + + +def test_model(model, criterion, test_loader, epoch, logger, visualization=False): + model.eval() + reduced_loss_ = [] + with torch.no_grad(): + for i, batch in enumerate(test_loader): + model.parse_batch(batch) + model.forward() + if visualization: + for j in range(len(model.fake_B)): + plt.figure(figsize=(8, 9)) + plt.subplot(311) + plt.imshow(model.real_B[j].data.cpu().numpy(), + aspect='auto', origin='lower') + plt.title(model.video_name[j]+"_ground_truth") + plt.subplot(312) + plt.imshow(model.fake_B[j].data.cpu().numpy(), + aspect='auto', origin='lower') + plt.title(model.video_name[j]+"_predict") + plt.subplot(313) + plt.imshow(model.fake_B_postnet[j].data.cpu().numpy(), + aspect='auto', origin='lower') + plt.title(model.video_name[j]+"_postnet") + plt.tight_layout() + viz_dir = os.path.join(config.save_dir, "viz", f'epoch_{epoch:05d}') + os.makedirs(viz_dir, exist_ok=True) + plt.savefig(os.path.join(viz_dir, model.video_name[j]+".jpg")) + plt.close() + loss = criterion((model.fake_B, model.fake_B_postnet), model.real_B) + reduced_loss = loss.item() + reduced_loss_.append(reduced_loss) + if not math.isnan(reduced_loss): + print("Test loss epoch:{} iter:{} {:.6f} ".format(epoch, i, reduced_loss)) + logger.log_testing(np.mean(reduced_loss_), epoch) + model.train() + + +def train(): + torch.manual_seed(config.seed) + torch.cuda.manual_seed(config.seed) + + model = Regnet() + + criterion = RegnetLoss(config.loss_type) + + logger = RegnetLogger(os.path.join(config.save_dir, 'logs')) + + train_loader, test_loader = prepare_dataloaders() + + # Load checkpoint if one exists + iteration = 0 + epoch_offset = 0 + + if config.checkpoint_path != '': + model.load_checkpoint(config.checkpoint_path) + iteration = model.iteration + iteration += 1 # next iteration is iteration + 1 + epoch_offset = max(0, int(iteration / len(train_loader))) + config.epoch_count = epoch_offset + model.setup() + + model.train() + # ================ MAIN TRAINNIG LOOP! =================== + for epoch in range(epoch_offset, config.epochs): + print("Epoch: {}".format(epoch)) + for i, batch in enumerate(train_loader): + start = time.perf_counter() + model.zero_grad() + model.parse_batch(batch) + model.optimize_parameters() + learning_rate = model.optimizers[0].param_groups[0]['lr'] + loss = criterion((model.fake_B, model.fake_B_postnet), model.real_B) + reduced_loss = loss.item() + + if not math.isnan(reduced_loss): + duration = time.perf_counter() - start + print("epoch:{} iter:{} loss:{:.6f} G:{:.6f} D:{:.6f} D_r-f:{:.6f} G_s:{:.6f} time:{:.2f}s/it".format( + epoch, i, reduced_loss, model.loss_G, model.loss_D, (model.pred_real - model.pred_fake).mean(), model.loss_G_silence, duration)) + logger.log_training(model, reduced_loss, learning_rate, duration, iteration) + + iteration += 1 + if epoch % config.num_epoch_save != 0: + test_model(model, criterion, test_loader, epoch, logger) + if epoch % config.num_epoch_save == 0: + print("evaluation and save model") + test_model(model, criterion, test_loader, epoch, logger, visualization=True) + model.save_checkpoint(config.save_dir, iteration) + + model.update_learning_rate() + model_path = model.save_checkpoint(config.save_dir, iteration) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config_file', type=str, default='', + help='file for configuration') + parser.add_argument("opts", default=None, nargs=argparse.REMAINDER) + args = parser.parse_args() + + if args.config_file: + config.merge_from_file(args.config_file) + + config.merge_from_list(args.opts) + # config.freeze() + + os.makedirs(config.save_dir, exist_ok=True) + with open(os.path.join(config.save_dir, 'opts.yml'), 'w') as f: + with redirect_stdout(f): + print(config.dump()) + f.close() + + recorder = Recorder(config.save_dir, config.exclude_dirs) + + torch.backends.cudnn.enabled = config.cudnn_enabled + torch.backends.cudnn.benchmark = config.cudnn_benchmark + print("Dynamic Loss Scaling:", config.dynamic_loss_scaling) + print("cuDNN Enabled:", config.cudnn_enabled) + print("cuDNN Benchmark:", config.cudnn_benchmark) + + train() diff --git a/tsn/bninception/__init__.py b/tsn/bninception/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tsn/bninception/bn_inception.yaml b/tsn/bninception/bn_inception.yaml new file mode 100644 index 0000000..52909ea --- /dev/null +++ b/tsn/bninception/bn_inception.yaml @@ -0,0 +1,558 @@ +inputs: [] +layers: +- attrs: {kernel_size: 7, num_output: 64, pad: 3, stride: 2} + expr: conv1_7x7_s2<=Convolution<=data + id: conv1_7x7_s2 +- attrs: {frozen: true} + expr: conv1_7x7_s2_bn<=BN<=conv1_7x7_s2 + id: conv1_7x7_s2_bn +- {expr: conv1_7x7_s2_bn<=ReLU<=conv1_7x7_s2_bn, id: conv1_relu_7x7} +- attrs: {kernel_size: 3, mode: max, stride: 2} + expr: pool1_3x3_s2<=Pooling<=conv1_7x7_s2_bn + id: pool1_3x3_s2 +- attrs: {kernel_size: 1, num_output: 64} + expr: conv2_3x3_reduce<=Convolution<=pool1_3x3_s2 + id: conv2_3x3_reduce +- attrs: {frozen: true} + expr: conv2_3x3_reduce_bn<=BN<=conv2_3x3_reduce + id: conv2_3x3_reduce_bn +- {expr: conv2_3x3_reduce_bn<=ReLU<=conv2_3x3_reduce_bn, id: conv2_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 192, pad: 1} + expr: conv2_3x3<=Convolution<=conv2_3x3_reduce_bn + id: conv2_3x3 +- attrs: {frozen: true} + expr: conv2_3x3_bn<=BN<=conv2_3x3 + id: conv2_3x3_bn +- {expr: conv2_3x3_bn<=ReLU<=conv2_3x3_bn, id: conv2_relu_3x3} +- attrs: {kernel_size: 3, mode: max, stride: 2} + expr: pool2_3x3_s2<=Pooling<=conv2_3x3_bn + id: pool2_3x3_s2 +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3a_1x1<=Convolution<=pool2_3x3_s2 + id: inception_3a_1x1 +- attrs: {frozen: true} + expr: inception_3a_1x1_bn<=BN<=inception_3a_1x1 + id: inception_3a_1x1_bn +- {expr: inception_3a_1x1_bn<=ReLU<=inception_3a_1x1_bn, id: inception_3a_relu_1x1} +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3a_3x3_reduce<=Convolution<=pool2_3x3_s2 + id: inception_3a_3x3_reduce +- attrs: {frozen: true} + expr: inception_3a_3x3_reduce_bn<=BN<=inception_3a_3x3_reduce + id: inception_3a_3x3_reduce_bn +- {expr: inception_3a_3x3_reduce_bn<=ReLU<=inception_3a_3x3_reduce_bn, id: inception_3a_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 64, pad: 1} + expr: inception_3a_3x3<=Convolution<=inception_3a_3x3_reduce_bn + id: inception_3a_3x3 +- attrs: {frozen: true} + expr: inception_3a_3x3_bn<=BN<=inception_3a_3x3 + id: inception_3a_3x3_bn +- {expr: inception_3a_3x3_bn<=ReLU<=inception_3a_3x3_bn, id: inception_3a_relu_3x3} +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3a_double_3x3_reduce<=Convolution<=pool2_3x3_s2 + id: inception_3a_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_3a_double_3x3_reduce_bn<=BN<=inception_3a_double_3x3_reduce + id: inception_3a_double_3x3_reduce_bn +- {expr: inception_3a_double_3x3_reduce_bn<=ReLU<=inception_3a_double_3x3_reduce_bn, + id: inception_3a_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 96, pad: 1} + expr: inception_3a_double_3x3_1<=Convolution<=inception_3a_double_3x3_reduce_bn + id: inception_3a_double_3x3_1 +- attrs: {frozen: true} + expr: inception_3a_double_3x3_1_bn<=BN<=inception_3a_double_3x3_1 + id: inception_3a_double_3x3_1_bn +- {expr: inception_3a_double_3x3_1_bn<=ReLU<=inception_3a_double_3x3_1_bn, id: inception_3a_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 96, pad: 1} + expr: inception_3a_double_3x3_2<=Convolution<=inception_3a_double_3x3_1_bn + id: inception_3a_double_3x3_2 +- attrs: {frozen: true} + expr: inception_3a_double_3x3_2_bn<=BN<=inception_3a_double_3x3_2 + id: inception_3a_double_3x3_2_bn +- {expr: inception_3a_double_3x3_2_bn<=ReLU<=inception_3a_double_3x3_2_bn, id: inception_3a_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: ave, pad: 1, stride: 1} + expr: inception_3a_pool<=Pooling<=pool2_3x3_s2 + id: inception_3a_pool +- attrs: {kernel_size: 1, num_output: 32} + expr: inception_3a_pool_proj<=Convolution<=inception_3a_pool + id: inception_3a_pool_proj +- attrs: {frozen: true} + expr: inception_3a_pool_proj_bn<=BN<=inception_3a_pool_proj + id: inception_3a_pool_proj_bn +- {expr: inception_3a_pool_proj_bn<=ReLU<=inception_3a_pool_proj_bn, id: inception_3a_relu_pool_proj} +- {expr: 'inception_3a_output<=Concat<=inception_3a_1x1_bn,inception_3a_3x3_bn,inception_3a_double_3x3_2_bn,inception_3a_pool_proj_bn', + id: inception_3a_output} +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3b_1x1<=Convolution<=inception_3a_output + id: inception_3b_1x1 +- attrs: {frozen: true} + expr: inception_3b_1x1_bn<=BN<=inception_3b_1x1 + id: inception_3b_1x1_bn +- {expr: inception_3b_1x1_bn<=ReLU<=inception_3b_1x1_bn, id: inception_3b_relu_1x1} +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3b_3x3_reduce<=Convolution<=inception_3a_output + id: inception_3b_3x3_reduce +- attrs: {frozen: true} + expr: inception_3b_3x3_reduce_bn<=BN<=inception_3b_3x3_reduce + id: inception_3b_3x3_reduce_bn +- {expr: inception_3b_3x3_reduce_bn<=ReLU<=inception_3b_3x3_reduce_bn, id: inception_3b_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 96, pad: 1} + expr: inception_3b_3x3<=Convolution<=inception_3b_3x3_reduce_bn + id: inception_3b_3x3 +- attrs: {frozen: true} + expr: inception_3b_3x3_bn<=BN<=inception_3b_3x3 + id: inception_3b_3x3_bn +- {expr: inception_3b_3x3_bn<=ReLU<=inception_3b_3x3_bn, id: inception_3b_relu_3x3} +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3b_double_3x3_reduce<=Convolution<=inception_3a_output + id: inception_3b_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_3b_double_3x3_reduce_bn<=BN<=inception_3b_double_3x3_reduce + id: inception_3b_double_3x3_reduce_bn +- {expr: inception_3b_double_3x3_reduce_bn<=ReLU<=inception_3b_double_3x3_reduce_bn, + id: inception_3b_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 96, pad: 1} + expr: inception_3b_double_3x3_1<=Convolution<=inception_3b_double_3x3_reduce_bn + id: inception_3b_double_3x3_1 +- attrs: {frozen: true} + expr: inception_3b_double_3x3_1_bn<=BN<=inception_3b_double_3x3_1 + id: inception_3b_double_3x3_1_bn +- {expr: inception_3b_double_3x3_1_bn<=ReLU<=inception_3b_double_3x3_1_bn, id: inception_3b_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 96, pad: 1} + expr: inception_3b_double_3x3_2<=Convolution<=inception_3b_double_3x3_1_bn + id: inception_3b_double_3x3_2 +- attrs: {frozen: true} + expr: inception_3b_double_3x3_2_bn<=BN<=inception_3b_double_3x3_2 + id: inception_3b_double_3x3_2_bn +- {expr: inception_3b_double_3x3_2_bn<=ReLU<=inception_3b_double_3x3_2_bn, id: inception_3b_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: ave, pad: 1, stride: 1} + expr: inception_3b_pool<=Pooling<=inception_3a_output + id: inception_3b_pool +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3b_pool_proj<=Convolution<=inception_3b_pool + id: inception_3b_pool_proj +- attrs: {frozen: true} + expr: inception_3b_pool_proj_bn<=BN<=inception_3b_pool_proj + id: inception_3b_pool_proj_bn +- {expr: inception_3b_pool_proj_bn<=ReLU<=inception_3b_pool_proj_bn, id: inception_3b_relu_pool_proj} +- {expr: 'inception_3b_output<=Concat<=inception_3b_1x1_bn,inception_3b_3x3_bn,inception_3b_double_3x3_2_bn,inception_3b_pool_proj_bn', + id: inception_3b_output} +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_3c_3x3_reduce<=Convolution<=inception_3b_output + id: inception_3c_3x3_reduce +- attrs: {frozen: true} + expr: inception_3c_3x3_reduce_bn<=BN<=inception_3c_3x3_reduce + id: inception_3c_3x3_reduce_bn +- {expr: inception_3c_3x3_reduce_bn<=ReLU<=inception_3c_3x3_reduce_bn, id: inception_3c_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 160, pad: 1, stride: 2} + expr: inception_3c_3x3<=Convolution<=inception_3c_3x3_reduce_bn + id: inception_3c_3x3 +- attrs: {frozen: true} + expr: inception_3c_3x3_bn<=BN<=inception_3c_3x3 + id: inception_3c_3x3_bn +- {expr: inception_3c_3x3_bn<=ReLU<=inception_3c_3x3_bn, id: inception_3c_relu_3x3} +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_3c_double_3x3_reduce<=Convolution<=inception_3b_output + id: inception_3c_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_3c_double_3x3_reduce_bn<=BN<=inception_3c_double_3x3_reduce + id: inception_3c_double_3x3_reduce_bn +- {expr: inception_3c_double_3x3_reduce_bn<=ReLU<=inception_3c_double_3x3_reduce_bn, + id: inception_3c_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 96, pad: 1} + expr: inception_3c_double_3x3_1<=Convolution<=inception_3c_double_3x3_reduce_bn + id: inception_3c_double_3x3_1 +- attrs: {frozen: true} + expr: inception_3c_double_3x3_1_bn<=BN<=inception_3c_double_3x3_1 + id: inception_3c_double_3x3_1_bn +- {expr: inception_3c_double_3x3_1_bn<=ReLU<=inception_3c_double_3x3_1_bn, id: inception_3c_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 96, pad: 1, stride: 2} + expr: inception_3c_double_3x3_2<=Convolution<=inception_3c_double_3x3_1_bn + id: inception_3c_double_3x3_2 +- attrs: {frozen: true} + expr: inception_3c_double_3x3_2_bn<=BN<=inception_3c_double_3x3_2 + id: inception_3c_double_3x3_2_bn +- {expr: inception_3c_double_3x3_2_bn<=ReLU<=inception_3c_double_3x3_2_bn, id: inception_3c_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: max, stride: 2} + expr: inception_3c_pool<=Pooling<=inception_3b_output + id: inception_3c_pool +- {expr: 'inception_3c_output<=Concat<=inception_3c_3x3_bn,inception_3c_double_3x3_2_bn,inception_3c_pool', + id: inception_3c_output} +- attrs: {kernel_size: 1, num_output: 224} + expr: inception_4a_1x1<=Convolution<=inception_3c_output + id: inception_4a_1x1 +- attrs: {frozen: true} + expr: inception_4a_1x1_bn<=BN<=inception_4a_1x1 + id: inception_4a_1x1_bn +- {expr: inception_4a_1x1_bn<=ReLU<=inception_4a_1x1_bn, id: inception_4a_relu_1x1} +- attrs: {kernel_size: 1, num_output: 64} + expr: inception_4a_3x3_reduce<=Convolution<=inception_3c_output + id: inception_4a_3x3_reduce +- attrs: {frozen: true} + expr: inception_4a_3x3_reduce_bn<=BN<=inception_4a_3x3_reduce + id: inception_4a_3x3_reduce_bn +- {expr: inception_4a_3x3_reduce_bn<=ReLU<=inception_4a_3x3_reduce_bn, id: inception_4a_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 96, pad: 1} + expr: inception_4a_3x3<=Convolution<=inception_4a_3x3_reduce_bn + id: inception_4a_3x3 +- attrs: {frozen: true} + expr: inception_4a_3x3_bn<=BN<=inception_4a_3x3 + id: inception_4a_3x3_bn +- {expr: inception_4a_3x3_bn<=ReLU<=inception_4a_3x3_bn, id: inception_4a_relu_3x3} +- attrs: {kernel_size: 1, num_output: 96} + expr: inception_4a_double_3x3_reduce<=Convolution<=inception_3c_output + id: inception_4a_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_4a_double_3x3_reduce_bn<=BN<=inception_4a_double_3x3_reduce + id: inception_4a_double_3x3_reduce_bn +- {expr: inception_4a_double_3x3_reduce_bn<=ReLU<=inception_4a_double_3x3_reduce_bn, + id: inception_4a_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 128, pad: 1} + expr: inception_4a_double_3x3_1<=Convolution<=inception_4a_double_3x3_reduce_bn + id: inception_4a_double_3x3_1 +- attrs: {frozen: true} + expr: inception_4a_double_3x3_1_bn<=BN<=inception_4a_double_3x3_1 + id: inception_4a_double_3x3_1_bn +- {expr: inception_4a_double_3x3_1_bn<=ReLU<=inception_4a_double_3x3_1_bn, id: inception_4a_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 128, pad: 1} + expr: inception_4a_double_3x3_2<=Convolution<=inception_4a_double_3x3_1_bn + id: inception_4a_double_3x3_2 +- attrs: {frozen: true} + expr: inception_4a_double_3x3_2_bn<=BN<=inception_4a_double_3x3_2 + id: inception_4a_double_3x3_2_bn +- {expr: inception_4a_double_3x3_2_bn<=ReLU<=inception_4a_double_3x3_2_bn, id: inception_4a_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: ave, pad: 1, stride: 1} + expr: inception_4a_pool<=Pooling<=inception_3c_output + id: inception_4a_pool +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4a_pool_proj<=Convolution<=inception_4a_pool + id: inception_4a_pool_proj +- attrs: {frozen: true} + expr: inception_4a_pool_proj_bn<=BN<=inception_4a_pool_proj + id: inception_4a_pool_proj_bn +- {expr: inception_4a_pool_proj_bn<=ReLU<=inception_4a_pool_proj_bn, id: inception_4a_relu_pool_proj} +- {expr: 'inception_4a_output<=Concat<=inception_4a_1x1_bn,inception_4a_3x3_bn,inception_4a_double_3x3_2_bn,inception_4a_pool_proj_bn', + id: inception_4a_output} +- attrs: {kernel_size: 1, num_output: 192} + expr: inception_4b_1x1<=Convolution<=inception_4a_output + id: inception_4b_1x1 +- attrs: {frozen: true} + expr: inception_4b_1x1_bn<=BN<=inception_4b_1x1 + id: inception_4b_1x1_bn +- {expr: inception_4b_1x1_bn<=ReLU<=inception_4b_1x1_bn, id: inception_4b_relu_1x1} +- attrs: {kernel_size: 1, num_output: 96} + expr: inception_4b_3x3_reduce<=Convolution<=inception_4a_output + id: inception_4b_3x3_reduce +- attrs: {frozen: true} + expr: inception_4b_3x3_reduce_bn<=BN<=inception_4b_3x3_reduce + id: inception_4b_3x3_reduce_bn +- {expr: inception_4b_3x3_reduce_bn<=ReLU<=inception_4b_3x3_reduce_bn, id: inception_4b_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 128, pad: 1} + expr: inception_4b_3x3<=Convolution<=inception_4b_3x3_reduce_bn + id: inception_4b_3x3 +- attrs: {frozen: true} + expr: inception_4b_3x3_bn<=BN<=inception_4b_3x3 + id: inception_4b_3x3_bn +- {expr: inception_4b_3x3_bn<=ReLU<=inception_4b_3x3_bn, id: inception_4b_relu_3x3} +- attrs: {kernel_size: 1, num_output: 96} + expr: inception_4b_double_3x3_reduce<=Convolution<=inception_4a_output + id: inception_4b_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_4b_double_3x3_reduce_bn<=BN<=inception_4b_double_3x3_reduce + id: inception_4b_double_3x3_reduce_bn +- {expr: inception_4b_double_3x3_reduce_bn<=ReLU<=inception_4b_double_3x3_reduce_bn, + id: inception_4b_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 128, pad: 1} + expr: inception_4b_double_3x3_1<=Convolution<=inception_4b_double_3x3_reduce_bn + id: inception_4b_double_3x3_1 +- attrs: {frozen: true} + expr: inception_4b_double_3x3_1_bn<=BN<=inception_4b_double_3x3_1 + id: inception_4b_double_3x3_1_bn +- {expr: inception_4b_double_3x3_1_bn<=ReLU<=inception_4b_double_3x3_1_bn, id: inception_4b_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 128, pad: 1} + expr: inception_4b_double_3x3_2<=Convolution<=inception_4b_double_3x3_1_bn + id: inception_4b_double_3x3_2 +- attrs: {frozen: true} + expr: inception_4b_double_3x3_2_bn<=BN<=inception_4b_double_3x3_2 + id: inception_4b_double_3x3_2_bn +- {expr: inception_4b_double_3x3_2_bn<=ReLU<=inception_4b_double_3x3_2_bn, id: inception_4b_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: ave, pad: 1, stride: 1} + expr: inception_4b_pool<=Pooling<=inception_4a_output + id: inception_4b_pool +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4b_pool_proj<=Convolution<=inception_4b_pool + id: inception_4b_pool_proj +- attrs: {frozen: true} + expr: inception_4b_pool_proj_bn<=BN<=inception_4b_pool_proj + id: inception_4b_pool_proj_bn +- {expr: inception_4b_pool_proj_bn<=ReLU<=inception_4b_pool_proj_bn, id: inception_4b_relu_pool_proj} +- {expr: 'inception_4b_output<=Concat<=inception_4b_1x1_bn,inception_4b_3x3_bn,inception_4b_double_3x3_2_bn,inception_4b_pool_proj_bn', + id: inception_4b_output} +- attrs: {kernel_size: 1, num_output: 160} + expr: inception_4c_1x1<=Convolution<=inception_4b_output + id: inception_4c_1x1 +- attrs: {frozen: true} + expr: inception_4c_1x1_bn<=BN<=inception_4c_1x1 + id: inception_4c_1x1_bn +- {expr: inception_4c_1x1_bn<=ReLU<=inception_4c_1x1_bn, id: inception_4c_relu_1x1} +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4c_3x3_reduce<=Convolution<=inception_4b_output + id: inception_4c_3x3_reduce +- attrs: {frozen: true} + expr: inception_4c_3x3_reduce_bn<=BN<=inception_4c_3x3_reduce + id: inception_4c_3x3_reduce_bn +- {expr: inception_4c_3x3_reduce_bn<=ReLU<=inception_4c_3x3_reduce_bn, id: inception_4c_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 160, pad: 1} + expr: inception_4c_3x3<=Convolution<=inception_4c_3x3_reduce_bn + id: inception_4c_3x3 +- attrs: {frozen: true} + expr: inception_4c_3x3_bn<=BN<=inception_4c_3x3 + id: inception_4c_3x3_bn +- {expr: inception_4c_3x3_bn<=ReLU<=inception_4c_3x3_bn, id: inception_4c_relu_3x3} +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4c_double_3x3_reduce<=Convolution<=inception_4b_output + id: inception_4c_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_4c_double_3x3_reduce_bn<=BN<=inception_4c_double_3x3_reduce + id: inception_4c_double_3x3_reduce_bn +- {expr: inception_4c_double_3x3_reduce_bn<=ReLU<=inception_4c_double_3x3_reduce_bn, + id: inception_4c_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 160, pad: 1} + expr: inception_4c_double_3x3_1<=Convolution<=inception_4c_double_3x3_reduce_bn + id: inception_4c_double_3x3_1 +- attrs: {frozen: true} + expr: inception_4c_double_3x3_1_bn<=BN<=inception_4c_double_3x3_1 + id: inception_4c_double_3x3_1_bn +- {expr: inception_4c_double_3x3_1_bn<=ReLU<=inception_4c_double_3x3_1_bn, id: inception_4c_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 160, pad: 1} + expr: inception_4c_double_3x3_2<=Convolution<=inception_4c_double_3x3_1_bn + id: inception_4c_double_3x3_2 +- attrs: {frozen: true} + expr: inception_4c_double_3x3_2_bn<=BN<=inception_4c_double_3x3_2 + id: inception_4c_double_3x3_2_bn +- {expr: inception_4c_double_3x3_2_bn<=ReLU<=inception_4c_double_3x3_2_bn, id: inception_4c_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: ave, pad: 1, stride: 1} + expr: inception_4c_pool<=Pooling<=inception_4b_output + id: inception_4c_pool +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4c_pool_proj<=Convolution<=inception_4c_pool + id: inception_4c_pool_proj +- attrs: {frozen: true} + expr: inception_4c_pool_proj_bn<=BN<=inception_4c_pool_proj + id: inception_4c_pool_proj_bn +- {expr: inception_4c_pool_proj_bn<=ReLU<=inception_4c_pool_proj_bn, id: inception_4c_relu_pool_proj} +- {expr: 'inception_4c_output<=Concat<=inception_4c_1x1_bn,inception_4c_3x3_bn,inception_4c_double_3x3_2_bn,inception_4c_pool_proj_bn', + id: inception_4c_output} +- attrs: {kernel_size: 1, num_output: 96} + expr: inception_4d_1x1<=Convolution<=inception_4c_output + id: inception_4d_1x1 +- attrs: {frozen: true} + expr: inception_4d_1x1_bn<=BN<=inception_4d_1x1 + id: inception_4d_1x1_bn +- {expr: inception_4d_1x1_bn<=ReLU<=inception_4d_1x1_bn, id: inception_4d_relu_1x1} +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4d_3x3_reduce<=Convolution<=inception_4c_output + id: inception_4d_3x3_reduce +- attrs: {frozen: true} + expr: inception_4d_3x3_reduce_bn<=BN<=inception_4d_3x3_reduce + id: inception_4d_3x3_reduce_bn +- {expr: inception_4d_3x3_reduce_bn<=ReLU<=inception_4d_3x3_reduce_bn, id: inception_4d_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 192, pad: 1} + expr: inception_4d_3x3<=Convolution<=inception_4d_3x3_reduce_bn + id: inception_4d_3x3 +- attrs: {frozen: true} + expr: inception_4d_3x3_bn<=BN<=inception_4d_3x3 + id: inception_4d_3x3_bn +- {expr: inception_4d_3x3_bn<=ReLU<=inception_4d_3x3_bn, id: inception_4d_relu_3x3} +- attrs: {kernel_size: 1, num_output: 160} + expr: inception_4d_double_3x3_reduce<=Convolution<=inception_4c_output + id: inception_4d_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_4d_double_3x3_reduce_bn<=BN<=inception_4d_double_3x3_reduce + id: inception_4d_double_3x3_reduce_bn +- {expr: inception_4d_double_3x3_reduce_bn<=ReLU<=inception_4d_double_3x3_reduce_bn, + id: inception_4d_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 192, pad: 1} + expr: inception_4d_double_3x3_1<=Convolution<=inception_4d_double_3x3_reduce_bn + id: inception_4d_double_3x3_1 +- attrs: {frozen: true} + expr: inception_4d_double_3x3_1_bn<=BN<=inception_4d_double_3x3_1 + id: inception_4d_double_3x3_1_bn +- {expr: inception_4d_double_3x3_1_bn<=ReLU<=inception_4d_double_3x3_1_bn, id: inception_4d_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 192, pad: 1} + expr: inception_4d_double_3x3_2<=Convolution<=inception_4d_double_3x3_1_bn + id: inception_4d_double_3x3_2 +- attrs: {frozen: true} + expr: inception_4d_double_3x3_2_bn<=BN<=inception_4d_double_3x3_2 + id: inception_4d_double_3x3_2_bn +- {expr: inception_4d_double_3x3_2_bn<=ReLU<=inception_4d_double_3x3_2_bn, id: inception_4d_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: ave, pad: 1, stride: 1} + expr: inception_4d_pool<=Pooling<=inception_4c_output + id: inception_4d_pool +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4d_pool_proj<=Convolution<=inception_4d_pool + id: inception_4d_pool_proj +- attrs: {frozen: true} + expr: inception_4d_pool_proj_bn<=BN<=inception_4d_pool_proj + id: inception_4d_pool_proj_bn +- {expr: inception_4d_pool_proj_bn<=ReLU<=inception_4d_pool_proj_bn, id: inception_4d_relu_pool_proj} +- {expr: 'inception_4d_output<=Concat<=inception_4d_1x1_bn,inception_4d_3x3_bn,inception_4d_double_3x3_2_bn,inception_4d_pool_proj_bn', + id: inception_4d_output} +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_4e_3x3_reduce<=Convolution<=inception_4d_output + id: inception_4e_3x3_reduce +- attrs: {frozen: true} + expr: inception_4e_3x3_reduce_bn<=BN<=inception_4e_3x3_reduce + id: inception_4e_3x3_reduce_bn +- {expr: inception_4e_3x3_reduce_bn<=ReLU<=inception_4e_3x3_reduce_bn, id: inception_4e_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 192, pad: 1, stride: 2} + expr: inception_4e_3x3<=Convolution<=inception_4e_3x3_reduce_bn + id: inception_4e_3x3 +- attrs: {frozen: true} + expr: inception_4e_3x3_bn<=BN<=inception_4e_3x3 + id: inception_4e_3x3_bn +- {expr: inception_4e_3x3_bn<=ReLU<=inception_4e_3x3_bn, id: inception_4e_relu_3x3} +- attrs: {kernel_size: 1, num_output: 192} + expr: inception_4e_double_3x3_reduce<=Convolution<=inception_4d_output + id: inception_4e_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_4e_double_3x3_reduce_bn<=BN<=inception_4e_double_3x3_reduce + id: inception_4e_double_3x3_reduce_bn +- {expr: inception_4e_double_3x3_reduce_bn<=ReLU<=inception_4e_double_3x3_reduce_bn, + id: inception_4e_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 256, pad: 1} + expr: inception_4e_double_3x3_1<=Convolution<=inception_4e_double_3x3_reduce_bn + id: inception_4e_double_3x3_1 +- attrs: {frozen: true} + expr: inception_4e_double_3x3_1_bn<=BN<=inception_4e_double_3x3_1 + id: inception_4e_double_3x3_1_bn +- {expr: inception_4e_double_3x3_1_bn<=ReLU<=inception_4e_double_3x3_1_bn, id: inception_4e_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 256, pad: 1, stride: 2} + expr: inception_4e_double_3x3_2<=Convolution<=inception_4e_double_3x3_1_bn + id: inception_4e_double_3x3_2 +- attrs: {frozen: true} + expr: inception_4e_double_3x3_2_bn<=BN<=inception_4e_double_3x3_2 + id: inception_4e_double_3x3_2_bn +- {expr: inception_4e_double_3x3_2_bn<=ReLU<=inception_4e_double_3x3_2_bn, id: inception_4e_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: max, stride: 2} + expr: inception_4e_pool<=Pooling<=inception_4d_output + id: inception_4e_pool +- {expr: 'inception_4e_output<=Concat<=inception_4e_3x3_bn,inception_4e_double_3x3_2_bn,inception_4e_pool', + id: inception_4e_output} +- attrs: {kernel_size: 1, num_output: 352} + expr: inception_5a_1x1<=Convolution<=inception_4e_output + id: inception_5a_1x1 +- attrs: {frozen: true} + expr: inception_5a_1x1_bn<=BN<=inception_5a_1x1 + id: inception_5a_1x1_bn +- {expr: inception_5a_1x1_bn<=ReLU<=inception_5a_1x1_bn, id: inception_5a_relu_1x1} +- attrs: {kernel_size: 1, num_output: 192} + expr: inception_5a_3x3_reduce<=Convolution<=inception_4e_output + id: inception_5a_3x3_reduce +- attrs: {frozen: true} + expr: inception_5a_3x3_reduce_bn<=BN<=inception_5a_3x3_reduce + id: inception_5a_3x3_reduce_bn +- {expr: inception_5a_3x3_reduce_bn<=ReLU<=inception_5a_3x3_reduce_bn, id: inception_5a_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 320, pad: 1} + expr: inception_5a_3x3<=Convolution<=inception_5a_3x3_reduce_bn + id: inception_5a_3x3 +- attrs: {frozen: true} + expr: inception_5a_3x3_bn<=BN<=inception_5a_3x3 + id: inception_5a_3x3_bn +- {expr: inception_5a_3x3_bn<=ReLU<=inception_5a_3x3_bn, id: inception_5a_relu_3x3} +- attrs: {kernel_size: 1, num_output: 160} + expr: inception_5a_double_3x3_reduce<=Convolution<=inception_4e_output + id: inception_5a_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_5a_double_3x3_reduce_bn<=BN<=inception_5a_double_3x3_reduce + id: inception_5a_double_3x3_reduce_bn +- {expr: inception_5a_double_3x3_reduce_bn<=ReLU<=inception_5a_double_3x3_reduce_bn, + id: inception_5a_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 224, pad: 1} + expr: inception_5a_double_3x3_1<=Convolution<=inception_5a_double_3x3_reduce_bn + id: inception_5a_double_3x3_1 +- attrs: {frozen: true} + expr: inception_5a_double_3x3_1_bn<=BN<=inception_5a_double_3x3_1 + id: inception_5a_double_3x3_1_bn +- {expr: inception_5a_double_3x3_1_bn<=ReLU<=inception_5a_double_3x3_1_bn, id: inception_5a_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 224, pad: 1} + expr: inception_5a_double_3x3_2<=Convolution<=inception_5a_double_3x3_1_bn + id: inception_5a_double_3x3_2 +- attrs: {frozen: true} + expr: inception_5a_double_3x3_2_bn<=BN<=inception_5a_double_3x3_2 + id: inception_5a_double_3x3_2_bn +- {expr: inception_5a_double_3x3_2_bn<=ReLU<=inception_5a_double_3x3_2_bn, id: inception_5a_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: ave, pad: 1, stride: 1} + expr: inception_5a_pool<=Pooling<=inception_4e_output + id: inception_5a_pool +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_5a_pool_proj<=Convolution<=inception_5a_pool + id: inception_5a_pool_proj +- attrs: {frozen: true} + expr: inception_5a_pool_proj_bn<=BN<=inception_5a_pool_proj + id: inception_5a_pool_proj_bn +- {expr: inception_5a_pool_proj_bn<=ReLU<=inception_5a_pool_proj_bn, id: inception_5a_relu_pool_proj} +- {expr: 'inception_5a_output<=Concat<=inception_5a_1x1_bn,inception_5a_3x3_bn,inception_5a_double_3x3_2_bn,inception_5a_pool_proj_bn', + id: inception_5a_output} +- attrs: {kernel_size: 1, num_output: 352} + expr: inception_5b_1x1<=Convolution<=inception_5a_output + id: inception_5b_1x1 +- attrs: {frozen: true} + expr: inception_5b_1x1_bn<=BN<=inception_5b_1x1 + id: inception_5b_1x1_bn +- {expr: inception_5b_1x1_bn<=ReLU<=inception_5b_1x1_bn, id: inception_5b_relu_1x1} +- attrs: {kernel_size: 1, num_output: 192} + expr: inception_5b_3x3_reduce<=Convolution<=inception_5a_output + id: inception_5b_3x3_reduce +- attrs: {frozen: true} + expr: inception_5b_3x3_reduce_bn<=BN<=inception_5b_3x3_reduce + id: inception_5b_3x3_reduce_bn +- {expr: inception_5b_3x3_reduce_bn<=ReLU<=inception_5b_3x3_reduce_bn, id: inception_5b_relu_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 320, pad: 1} + expr: inception_5b_3x3<=Convolution<=inception_5b_3x3_reduce_bn + id: inception_5b_3x3 +- attrs: {frozen: true} + expr: inception_5b_3x3_bn<=BN<=inception_5b_3x3 + id: inception_5b_3x3_bn +- {expr: inception_5b_3x3_bn<=ReLU<=inception_5b_3x3_bn, id: inception_5b_relu_3x3} +- attrs: {kernel_size: 1, num_output: 192} + expr: inception_5b_double_3x3_reduce<=Convolution<=inception_5a_output + id: inception_5b_double_3x3_reduce +- attrs: {frozen: true} + expr: inception_5b_double_3x3_reduce_bn<=BN<=inception_5b_double_3x3_reduce + id: inception_5b_double_3x3_reduce_bn +- {expr: inception_5b_double_3x3_reduce_bn<=ReLU<=inception_5b_double_3x3_reduce_bn, + id: inception_5b_relu_double_3x3_reduce} +- attrs: {kernel_size: 3, num_output: 224, pad: 1} + expr: inception_5b_double_3x3_1<=Convolution<=inception_5b_double_3x3_reduce_bn + id: inception_5b_double_3x3_1 +- attrs: {frozen: true} + expr: inception_5b_double_3x3_1_bn<=BN<=inception_5b_double_3x3_1 + id: inception_5b_double_3x3_1_bn +- {expr: inception_5b_double_3x3_1_bn<=ReLU<=inception_5b_double_3x3_1_bn, id: inception_5b_relu_double_3x3_1} +- attrs: {kernel_size: 3, num_output: 224, pad: 1} + expr: inception_5b_double_3x3_2<=Convolution<=inception_5b_double_3x3_1_bn + id: inception_5b_double_3x3_2 +- attrs: {frozen: true} + expr: inception_5b_double_3x3_2_bn<=BN<=inception_5b_double_3x3_2 + id: inception_5b_double_3x3_2_bn +- {expr: inception_5b_double_3x3_2_bn<=ReLU<=inception_5b_double_3x3_2_bn, id: inception_5b_relu_double_3x3_2} +- attrs: {kernel_size: 3, mode: max, pad: 1, stride: 1} + expr: inception_5b_pool<=Pooling<=inception_5a_output + id: inception_5b_pool +- attrs: {kernel_size: 1, num_output: 128} + expr: inception_5b_pool_proj<=Convolution<=inception_5b_pool + id: inception_5b_pool_proj +- attrs: {frozen: true} + expr: inception_5b_pool_proj_bn<=BN<=inception_5b_pool_proj + id: inception_5b_pool_proj_bn +- {expr: inception_5b_pool_proj_bn<=ReLU<=inception_5b_pool_proj_bn, id: inception_5b_relu_pool_proj} +- {expr: 'inception_5b_output<=Concat<=inception_5b_1x1_bn,inception_5b_3x3_bn,inception_5b_double_3x3_2_bn,inception_5b_pool_proj_bn', + id: inception_5b_output} +- attrs: {kernel_size: 7, mode: ave, stride: 1} + expr: global_pool<=Pooling<=inception_5b_output + id: global_pool +#- attrs: {num_output: 1000} +# expr: fc_action<=InnerProduct<=global_pool +# id: fc +name: BN-Inception diff --git a/tsn/bninception/layer_factory.py b/tsn/bninception/layer_factory.py new file mode 100644 index 0000000..be02c3f --- /dev/null +++ b/tsn/bninception/layer_factory.py @@ -0,0 +1,84 @@ +import torch +from torch import nn + + +LAYER_BUILDER_DICT=dict() + + +def parse_expr(expr): + parts = expr.split('<=') + return parts[0].split(','), parts[1], parts[2].split(',') + + +def get_basic_layer(info, channels=None, conv_bias=False): + id = info['id'] + attr = info['attrs'] if 'attrs' in info else list() + + out, op, in_vars = parse_expr(info['expr']) + assert(len(out) == 1) + assert(len(in_vars) == 1) + mod, out_channel, = LAYER_BUILDER_DICT[op](attr, channels, conv_bias) + + return id, out[0], mod, out_channel, in_vars[0] + + +def build_conv(attr, channels=None, conv_bias=False): + out_channels = attr['num_output'] + ks = attr['kernel_size'] if 'kernel_size' in attr else (attr['kernel_h'], attr['kernel_w']) + if 'pad' in attr or 'pad_w' in attr and 'pad_h' in attr: + padding = attr['pad'] if 'pad' in attr else (attr['pad_h'], attr['pad_w']) + else: + padding = 0 + if 'stride' in attr or 'stride_w' in attr and 'stride_h' in attr: + stride = attr['stride'] if 'stride' in attr else (attr['stride_h'], attr['stride_w']) + else: + stride = 1 + + conv = nn.Conv2d(channels, out_channels, ks, stride, padding, bias=conv_bias) + + return conv, out_channels + + +def build_pooling(attr, channels=None, conv_bias=False): + method = attr['mode'] + pad = attr['pad'] if 'pad' in attr else 0 + if method == 'max': + pool = nn.MaxPool2d(attr['kernel_size'], attr['stride'], pad, + ceil_mode=True) # all Caffe pooling use ceil model + elif method == 'ave': + pool = nn.AvgPool2d(attr['kernel_size'], attr['stride'], pad, + ceil_mode=True) # all Caffe pooling use ceil model + else: + raise ValueError("Unknown pooling method: {}".format(method)) + + return pool, channels + + +def build_relu(attr, channels=None, conv_bias=False): + return nn.ReLU(inplace=True), channels + + +def build_bn(attr, channels=None, conv_bias=False): + return nn.BatchNorm2d(channels, momentum=0.1), channels + + +def build_linear(attr, channels=None, conv_bias=False): + return nn.Linear(channels, attr['num_output']), channels + + +def build_dropout(attr, channels=None, conv_bias=False): + return nn.Dropout(p=attr['dropout_ratio']), channels + + +LAYER_BUILDER_DICT['Convolution'] = build_conv + +LAYER_BUILDER_DICT['Pooling'] = build_pooling + +LAYER_BUILDER_DICT['ReLU'] = build_relu + +LAYER_BUILDER_DICT['Dropout'] = build_dropout + +LAYER_BUILDER_DICT['BN'] = build_bn + +LAYER_BUILDER_DICT['InnerProduct'] = build_linear + diff --git a/tsn/bninception/pytorch_load.py b/tsn/bninception/pytorch_load.py new file mode 100644 index 0000000..a741178 --- /dev/null +++ b/tsn/bninception/pytorch_load.py @@ -0,0 +1,70 @@ +import torch +from torch import nn +from .layer_factory import get_basic_layer, parse_expr +import torch.utils.model_zoo as model_zoo +import yaml + + +class BNInception(nn.Module): + def __init__(self, model_path='tsn/bninception/bn_inception.yaml', num_classes=101, + weight_url='https://yjxiong.blob.core.windows.net/models/bn_inception-9f5701afb96c8044.pth'): + super(BNInception, self).__init__() + + manifest = yaml.load(open(model_path)) + + layers = manifest['layers'] + + self._channel_dict = dict() + + self._op_list = list() + for l in layers: + out_var, op, in_var = parse_expr(l['expr']) + if op != 'Concat': + id, out_name, module, out_channel, in_name = get_basic_layer(l, + 3 if len(self._channel_dict) == 0 else self._channel_dict[in_var[0]], + conv_bias=True) + + self._channel_dict[out_name] = out_channel + setattr(self, id, module) + self._op_list.append((id, op, out_name, in_name)) + else: + self._op_list.append((id, op, out_var[0], in_var)) + channel = sum([self._channel_dict[x] for x in in_var]) + self._channel_dict[out_var[0]] = channel + + """compatible to modified model""" + state_dict = torch.utils.model_zoo.load_url(weight_url) + state_dict = {k: v for k, v in state_dict.items() if k in self.state_dict()} + + """compatible to pytorch 0.4.0""" + for name, weights in state_dict.items(): + if self.state_dict()[name].shape != weights.shape: + state_dict[name] = weights.squeeze(0) + + self.load_state_dict(state_dict) + + def forward(self, input): + data_dict = dict() + data_dict[self._op_list[0][-1]] = input + + def get_hook(name): + + def hook(m, grad_in, grad_out): + print(name, grad_out[0].data.abs().mean()) + + return hook + for op in self._op_list: + if op[1] != 'Concat' and op[1] != 'InnerProduct': + data_dict[op[2]] = getattr(self, op[0])(data_dict[op[-1]]) + # getattr(self, op[0]).register_backward_hook(get_hook(op[0])) + elif op[1] == 'InnerProduct': + x = data_dict[op[-1]] + data_dict[op[2]] = getattr(self, op[0])(x.view(x.size(0), -1)) + else: + try: + data_dict[op[2]] = torch.cat(tuple(data_dict[x] for x in op[-1]), 1) + except: + for x in op[-1]: + print(x,data_dict[x].size()) + raise + return data_dict[self._op_list[-1][2]] \ No newline at end of file diff --git a/tsn/models.py b/tsn/models.py new file mode 100644 index 0000000..d78c7af --- /dev/null +++ b/tsn/models.py @@ -0,0 +1,76 @@ +from torch import nn +from .ops.basic_ops import ConsensusModule, Identity +from torch.nn.init import normal, constant +from .bninception.pytorch_load import BNInception + +class TSN(nn.Module): + def __init__(self, modality, + consensus_type='avg', before_softmax=True, + dropout=0.8, partial_bn=True): + super(TSN, self).__init__() + self.modality = modality + self.reshape = True + self.before_softmax = before_softmax + self.dropout = dropout + self.consensus_type = consensus_type + if not before_softmax and consensus_type != 'avg': + raise ValueError("Only avg consensus can be used after Softmax") + + self._prepare_base_model() + if self.modality == 'Flow': + print("Converting the ImageNet model to a flow init model") + self.base_model = self._construct_flow_model(self.base_model) + print("Done. Flow model ready...") + + self.consensus = ConsensusModule(consensus_type) + + if not self.before_softmax: + self.softmax = nn.Softmax() + + self._enable_pbn = partial_bn + if partial_bn: + self.partialBN(True) + + def _prepare_base_model(self): + self.base_model = BNInception() + self.base_model.last_layer_name = 'fc' + self.input_size = 224 + self.input_mean = [104, 117, 128] + self.input_std = [1] + + if self.modality == 'Flow': + self.input_mean = [128] + + def partialBN(self, enable): + self._enable_pbn = enable + + def forward(self, input): + sample_len = 3 if self.modality == "RGB" else 2 + + input_reshape = input.view((-1, sample_len) + input.size()[-2:]) + base_out = self.base_model(input_reshape) + if base_out.data.shape[-1] == 1 and base_out.data.shape[-2] == 1: + base_out = base_out + return base_out + + def _construct_flow_model(self, base_model): + modules = list(self.base_model.modules()) + first_conv_idx = list(filter(lambda x: isinstance(modules[x], nn.Conv2d), list(range(len(modules)))))[0] + conv_layer = modules[first_conv_idx] + container = modules[first_conv_idx - 1] + + params = [x.clone() for x in conv_layer.parameters()] + kernel_size = params[0].size() + new_kernel_size = kernel_size[:1] + (2, ) + kernel_size[2:] + new_kernels = params[0].data.mean(dim=1, keepdim=True).expand(new_kernel_size).contiguous() + + new_conv = nn.Conv2d(2, conv_layer.out_channels, + conv_layer.kernel_size, conv_layer.stride, conv_layer.padding, + bias=True if len(params) == 2 else False) + new_conv.weight.data = new_kernels + if len(params) == 2: + new_conv.bias.data = params[1].data # add bias if neccessary + layer_name = list(container.state_dict().keys())[0][:-7] # remove .weight suffix to get the layer name + + setattr(container, layer_name, new_conv) + return base_model \ No newline at end of file diff --git a/tsn/ops/__init__.py b/tsn/ops/__init__.py new file mode 100644 index 0000000..9e2259a --- /dev/null +++ b/tsn/ops/__init__.py @@ -0,0 +1 @@ +from .basic_ops import * \ No newline at end of file diff --git a/tsn/ops/basic_ops.py b/tsn/ops/basic_ops.py new file mode 100644 index 0000000..6a316f9 --- /dev/null +++ b/tsn/ops/basic_ops.py @@ -0,0 +1,47 @@ +import torch +import math + + +class Identity(torch.nn.Module): + def forward(self, input): + return input + + +class SegmentConsensus(torch.autograd.Function): + + def __init__(self, consensus_type, dim=1): + self.consensus_type = consensus_type + self.dim = dim + self.shape = None + + def forward(self, input_tensor): + self.shape = input_tensor.size() + if self.consensus_type == 'avg': + output = input_tensor.mean(dim=self.dim, keepdim=True) + elif self.consensus_type == 'identity': + output = input_tensor + else: + output = None + + return output + + def backward(self, grad_output): + if self.consensus_type == 'avg': + grad_in = grad_output.expand(self.shape) / float(self.shape[self.dim]) + elif self.consensus_type == 'identity': + grad_in = grad_output + else: + grad_in = None + + return grad_in + + +class ConsensusModule(torch.nn.Module): + + def __init__(self, consensus_type, dim=1): + super(ConsensusModule, self).__init__() + self.consensus_type = consensus_type if consensus_type != 'rnn' else 'identity' + self.dim = dim + + def forward(self, input): + return SegmentConsensus(self.consensus_type, self.dim)(input) diff --git a/tsn/ops/utils.py b/tsn/ops/utils.py new file mode 100644 index 0000000..9f71e2b --- /dev/null +++ b/tsn/ops/utils.py @@ -0,0 +1,35 @@ +import torch +import numpy as np +from sklearn.metrics import confusion_matrix + +def get_grad_hook(name): + def hook(m, grad_in, grad_out): + print((name, grad_out[0].data.abs().mean(), grad_in[0].data.abs().mean())) + print((grad_out[0].size())) + print((grad_in[0].size())) + + print((grad_out[0])) + print((grad_in[0])) + + return hook + + +def softmax(scores): + es = np.exp(scores - scores.max(axis=-1)[..., None]) + return es / es.sum(axis=-1)[..., None] + + +def log_add(log_a, log_b): + return log_a + np.log(1 + np.exp(log_b - log_a)) + + +def class_accuracy(prediction, label): + cf = confusion_matrix(prediction, label) + cls_cnt = cf.sum(axis=1) + cls_hit = np.diag(cf) + + cls_acc = cls_hit / cls_cnt.astype(float) + + mean_cls_acc = cls_acc.mean() + + return cls_acc, mean_cls_acc \ No newline at end of file diff --git a/wavenet_vocoder/__init__.py b/wavenet_vocoder/__init__.py new file mode 100644 index 0000000..a6f9435 --- /dev/null +++ b/wavenet_vocoder/__init__.py @@ -0,0 +1,4 @@ +# coding: utf-8 +from __future__ import with_statement, print_function, absolute_import + +from .wavenet import receptive_field_size, WaveNet diff --git a/wavenet_vocoder/builder.py b/wavenet_vocoder/builder.py new file mode 100644 index 0000000..45c7012 --- /dev/null +++ b/wavenet_vocoder/builder.py @@ -0,0 +1,40 @@ +# coding: utf-8 +from __future__ import with_statement, print_function, absolute_import + + +def wavenet(out_channels=256, + layers=20, + stacks=2, + residual_channels=512, + gate_channels=512, + skip_out_channels=512, + cin_channels=-1, + gin_channels=-1, + weight_normalization=True, + dropout=1 - 0.95, + kernel_size=3, + n_speakers=None, + upsample_conditional_features=False, + upsample_scales=[16, 16], + freq_axis_kernel_size=3, + scalar_input=False, + use_speaker_embedding=True, + ): + from wavenet_vocoder import WaveNet + + model = WaveNet(out_channels=out_channels, layers=layers, stacks=stacks, + residual_channels=residual_channels, + gate_channels=gate_channels, + skip_out_channels=skip_out_channels, + kernel_size=kernel_size, dropout=dropout, + weight_normalization=weight_normalization, + cin_channels=cin_channels, gin_channels=gin_channels, + n_speakers=n_speakers, + upsample_conditional_features=upsample_conditional_features, + upsample_scales=upsample_scales, + freq_axis_kernel_size=freq_axis_kernel_size, + scalar_input=scalar_input, + use_speaker_embedding=use_speaker_embedding, + ) + + return model diff --git a/wavenet_vocoder/conv.py b/wavenet_vocoder/conv.py new file mode 100644 index 0000000..761899d --- /dev/null +++ b/wavenet_vocoder/conv.py @@ -0,0 +1,65 @@ +# coding: utf-8 +import torch +from torch import nn +from torch.nn import functional as F + + +class Conv1d(nn.Conv1d): + """Extended nn.Conv1d for incremental dilated convolutions + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.clear_buffer() + self._linearized_weight = None + self.register_backward_hook(self._clear_linearized_weight) + + def incremental_forward(self, input): + # input: (B, T, C) + if self.training: + raise RuntimeError('incremental_forward only supports eval mode') + + # run forward pre hooks (e.g., weight norm) + for hook in self._forward_pre_hooks.values(): + hook(self, input) + + # reshape weight + weight = self._get_linearized_weight() + kw = self.kernel_size[0] + dilation = self.dilation[0] + + bsz = input.size(0) # input: bsz x len x dim + if kw > 1: + input = input.data + if self.input_buffer is None: + self.input_buffer = input.new(bsz, kw + (kw - 1) * (dilation - 1), input.size(2)) + self.input_buffer.zero_() + else: + # shift buffer + self.input_buffer[:, :-1, :] = self.input_buffer[:, 1:, :].clone() + # append next input + self.input_buffer[:, -1, :] = input[:, -1, :] + input = self.input_buffer + if dilation > 1: + input = input[:, 0::dilation, :].contiguous() + output = F.linear(input.view(bsz, -1), weight, self.bias) + return output.view(bsz, 1, -1) + + def clear_buffer(self): + self.input_buffer = None + + def _get_linearized_weight(self): + if self._linearized_weight is None: + kw = self.kernel_size[0] + # nn.Conv1d + if self.weight.size() == (self.out_channels, self.in_channels, kw): + weight = self.weight.transpose(1, 2).contiguous() + else: + # fairseq.modules.conv_tbc.ConvTBC + weight = self.weight.transpose(2, 1).transpose(1, 0).contiguous() + assert weight.size() == (self.out_channels, kw, self.in_channels) + self._linearized_weight = weight.view(self.out_channels, -1) + return self._linearized_weight + + def _clear_linearized_weight(self, *args): + self._linearized_weight = None diff --git a/wavenet_vocoder/mixture.py b/wavenet_vocoder/mixture.py new file mode 100644 index 0000000..57dbb9d --- /dev/null +++ b/wavenet_vocoder/mixture.py @@ -0,0 +1,153 @@ +# coding: utf-8 +# Code is adapted from: +# https://github.com/pclucas14/pixel-cnn-pp +# https://github.com/openai/pixel-cnn + +from __future__ import with_statement, print_function, absolute_import + +import math +import numpy as np + +import torch +from torch import nn +from torch.nn import functional as F + + +def log_sum_exp(x): + """ numerically stable log_sum_exp implementation that prevents overflow """ + # TF ordering + axis = len(x.size()) - 1 + m, _ = torch.max(x, dim=axis) + m2, _ = torch.max(x, dim=axis, keepdim=True) + return m + torch.log(torch.sum(torch.exp(x - m2), dim=axis)) + + +def discretized_mix_logistic_loss(y_hat, y, num_classes=256, + log_scale_min=-7.0, reduce=True): + """Discretized mixture of logistic distributions loss + + Note that it is assumed that input is scaled to [-1, 1]. + + Args: + y_hat (Tensor): Predicted output (B x C x T) + y (Tensor): Target (B x T x 1). + num_classes (int): Number of classes + log_scale_min (float): Log scale minimum value + reduce (bool): If True, the losses are averaged or summed for each + minibatch. + + Returns + Tensor: loss + """ + assert y_hat.dim() == 3 + assert y_hat.size(1) % 3 == 0 + nr_mix = y_hat.size(1) // 3 + + # (B x T x C) + y_hat = y_hat.transpose(1, 2) + + # unpack parameters. (B, T, num_mixtures) x 3 + logit_probs = y_hat[:, :, :nr_mix] + means = y_hat[:, :, nr_mix:2 * nr_mix] + log_scales = torch.clamp(y_hat[:, :, 2 * nr_mix:3 * nr_mix], min=log_scale_min) + + # B x T x 1 -> B x T x num_mixtures + y = y.expand_as(means) + + centered_y = y - means + inv_stdv = torch.exp(-log_scales) + plus_in = inv_stdv * (centered_y + 1. / (num_classes - 1)) + cdf_plus = F.sigmoid(plus_in) + min_in = inv_stdv * (centered_y - 1. / (num_classes - 1)) + cdf_min = F.sigmoid(min_in) + + # log probability for edge case of 0 (before scaling) + # equivalent: torch.log(F.sigmoid(plus_in)) + log_cdf_plus = plus_in - F.softplus(plus_in) + + # log probability for edge case of 255 (before scaling) + # equivalent: (1 - F.sigmoid(min_in)).log() + log_one_minus_cdf_min = -F.softplus(min_in) + + # probability for all other cases + cdf_delta = cdf_plus - cdf_min + + mid_in = inv_stdv * centered_y + # log probability in the center of the bin, to be used in extreme cases + # (not actually used in our code) + log_pdf_mid = mid_in - log_scales - 2. * F.softplus(mid_in) + + # tf equivalent + """ + log_probs = tf.where(x < -0.999, log_cdf_plus, + tf.where(x > 0.999, log_one_minus_cdf_min, + tf.where(cdf_delta > 1e-5, + tf.log(tf.maximum(cdf_delta, 1e-12)), + log_pdf_mid - np.log(127.5)))) + """ + # TODO: cdf_delta <= 1e-5 actually can happen. How can we choose the value + # for num_classes=65536 case? 1e-7? not sure.. + inner_inner_cond = (cdf_delta > 1e-5).float() + + inner_inner_out = inner_inner_cond * \ + torch.log(torch.clamp(cdf_delta, min=1e-12)) + \ + (1. - inner_inner_cond) * (log_pdf_mid - np.log((num_classes - 1) / 2)) + inner_cond = (y > 0.999).float() + inner_out = inner_cond * log_one_minus_cdf_min + (1. - inner_cond) * inner_inner_out + cond = (y < -0.999).float() + log_probs = cond * log_cdf_plus + (1. - cond) * inner_out + + log_probs = log_probs + F.log_softmax(logit_probs, -1) + + if reduce: + return -torch.sum(log_sum_exp(log_probs)) + else: + return -log_sum_exp(log_probs).unsqueeze(-1) + + +def to_one_hot(tensor, n, fill_with=1.): + # we perform one hot encore with respect to the last axis + one_hot = torch.FloatTensor(tensor.size() + (n,)).zero_() + if tensor.is_cuda: + one_hot = one_hot.cuda() + one_hot.scatter_(len(tensor.size()), tensor.unsqueeze(-1), fill_with) + return one_hot + + +def sample_from_discretized_mix_logistic(y, log_scale_min=-7.0): + """ + Sample from discretized mixture of logistic distributions + + Args: + y (Tensor): B x C x T + log_scale_min (float): Log scale minimum value + + Returns: + Tensor: sample in range of [-1, 1]. + """ + assert y.size(1) % 3 == 0 + nr_mix = y.size(1) // 3 + + # B x T x C + y = y.transpose(1, 2) + logit_probs = y[:, :, :nr_mix] + + # sample mixture indicator from softmax + temp = logit_probs.data.new(logit_probs.size()).uniform_(1e-5, 1.0 - 1e-5) + temp = logit_probs.data - torch.log(- torch.log(temp)) + _, argmax = temp.max(dim=-1) + + # (B, T) -> (B, T, nr_mix) + one_hot = to_one_hot(argmax, nr_mix) + # select logistic parameters + means = torch.sum(y[:, :, nr_mix:2 * nr_mix] * one_hot, dim=-1) + log_scales = torch.clamp(torch.sum( + y[:, :, 2 * nr_mix:3 * nr_mix] * one_hot, dim=-1), min=log_scale_min) + # sample from logistic & clip to interval + # we don't actually round to the nearest 8bit value when sampling + u = means.data.new(means.size()).uniform_(1e-5, 1.0 - 1e-5) + x = means + torch.exp(log_scales) * (torch.log(u) - torch.log(1. - u)) + + x = torch.clamp(torch.clamp(x, min=-1.), max=1.) + + return x diff --git a/wavenet_vocoder/modules.py b/wavenet_vocoder/modules.py new file mode 100644 index 0000000..e9ba25b --- /dev/null +++ b/wavenet_vocoder/modules.py @@ -0,0 +1,191 @@ +# coding: utf-8 +from __future__ import with_statement, print_function, absolute_import + +import math +import numpy as np + +import torch +from wavenet_vocoder import conv +from torch import nn +from torch.nn import functional as F + + +def Conv1d(in_channels, out_channels, kernel_size, dropout=0, std_mul=4.0, **kwargs): + m = conv.Conv1d(in_channels, out_channels, kernel_size, **kwargs) + std = math.sqrt((std_mul * (1.0 - dropout)) / (m.kernel_size[0] * in_channels)) + m.weight.data.normal_(mean=0, std=std) + m.bias.data.zero_() + return nn.utils.weight_norm(m) + + +def Embedding(num_embeddings, embedding_dim, padding_idx, std=0.01): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + m.weight.data.normal_(0, std) + return m + + +def ConvTranspose2d(in_channels, out_channels, kernel_size, + weight_normalization=True, **kwargs): + freq_axis_kernel_size = kernel_size[0] + m = nn.ConvTranspose2d(in_channels, out_channels, kernel_size, **kwargs) + m.weight.data.fill_(1.0 / freq_axis_kernel_size) + m.bias.data.zero_() + if weight_normalization: + return nn.utils.weight_norm(m) + else: + return m + + +def Conv1d1x1(in_channels, out_channels, bias=True, weight_normalization=True): + """1-by-1 convolution layer + """ + if weight_normalization: + assert bias + return Conv1d(in_channels, out_channels, kernel_size=1, padding=0, + dilation=1, bias=bias, std_mul=1.0) + else: + return conv.Conv1d(in_channels, out_channels, kernel_size=1, padding=0, + dilation=1, bias=bias) + + +def _conv1x1_forward(conv, x, is_incremental): + """Conv1x1 forward + """ + if is_incremental: + x = conv.incremental_forward(x) + else: + x = conv(x) + return x + + +class ResidualConv1dGLU(nn.Module): + """Residual dilated conv1d + Gated linear unit + + Args: + residual_channels (int): Residual input / output channels + gate_channels (int): Gated activation channels. + kernel_size (int): Kernel size of convolution layers. + skip_out_channels (int): Skip connection channels. If None, set to same + as ``residual_channels``. + cin_channels (int): Local conditioning channels. If negative value is + set, local conditioning is disabled. + gin_channels (int): Global conditioning channels. If negative value is + set, global conditioning is disabled. + dropout (float): Dropout probability. + padding (int): Padding for convolution layers. If None, proper padding + is computed depends on dilation and kernel_size. + dilation (int): Dilation factor. + weight_normalization (bool): If True, DeepVoice3-style weight + normalization is applied. + """ + + def __init__(self, residual_channels, gate_channels, kernel_size, + skip_out_channels=None, + cin_channels=-1, gin_channels=-1, + dropout=1 - 0.95, padding=None, dilation=1, causal=True, + bias=True, weight_normalization=True, *args, **kwargs): + super(ResidualConv1dGLU, self).__init__() + self.dropout = dropout + if skip_out_channels is None: + skip_out_channels = residual_channels + if padding is None: + # no future time stamps available + if causal: + padding = (kernel_size - 1) * dilation + else: + padding = (kernel_size - 1) // 2 * dilation + self.causal = causal + + if weight_normalization: + assert bias + self.conv = Conv1d(residual_channels, gate_channels, kernel_size, + padding=padding, dilation=dilation, + bias=bias, std_mul=1.0, *args, **kwargs) + else: + self.conv = conv.Conv1d(residual_channels, gate_channels, kernel_size, + padding=padding, dilation=dilation, + bias=bias, *args, **kwargs) + + # local conditioning + if cin_channels > 0: + self.conv1x1c = Conv1d1x1(cin_channels, gate_channels, + bias=bias, + weight_normalization=weight_normalization) + else: + self.conv1x1c = None + + # global conditioning + if gin_channels > 0: + self.conv1x1g = Conv1d1x1(gin_channels, gate_channels, bias=bias, + weight_normalization=weight_normalization) + else: + self.conv1x1g = None + + # conv output is split into two groups + gate_out_channels = gate_channels // 2 + self.conv1x1_out = Conv1d1x1(gate_out_channels, residual_channels, bias=bias, + weight_normalization=weight_normalization) + self.conv1x1_skip = Conv1d1x1(gate_out_channels, skip_out_channels, bias=bias, + weight_normalization=weight_normalization) + + def forward(self, x, c=None, g=None): + return self._forward(x, c, g, False) + + def incremental_forward(self, x, c=None, g=None): + return self._forward(x, c, g, True) + + def _forward(self, x, c, g, is_incremental): + """Forward + + Args: + x (Tensor): B x C x T + c (Tensor): B x C x T, Local conditioning features + g (Tensor): B x C x T, Expanded global conditioning features + is_incremental (Bool) : Whether incremental mode or not + + Returns: + Tensor: output + """ + residual = x + x = F.dropout(x, p=self.dropout, training=self.training) + if is_incremental: + splitdim = -1 + x = self.conv.incremental_forward(x) + else: + splitdim = 1 + x = self.conv(x) + # remove future time steps + x = x[:, :, :residual.size(-1)] if self.causal else x + + a, b = x.split(x.size(splitdim) // 2, dim=splitdim) + + # local conditioning + if c is not None: + assert self.conv1x1c is not None + c = _conv1x1_forward(self.conv1x1c, c, is_incremental) + ca, cb = c.split(c.size(splitdim) // 2, dim=splitdim) + a, b = a + ca, b + cb + + # global conditioning + if g is not None: + assert self.conv1x1g is not None + g = _conv1x1_forward(self.conv1x1g, g, is_incremental) + ga, gb = g.split(g.size(splitdim) // 2, dim=splitdim) + a, b = a + ga, b + gb + + x = F.tanh(a) * F.sigmoid(b) + + # For skip connection + s = _conv1x1_forward(self.conv1x1_skip, x, is_incremental) + + # For residual connection + x = _conv1x1_forward(self.conv1x1_out, x, is_incremental) + + x = (x + residual) * math.sqrt(0.5) + return x, s + + def clear_buffer(self): + for conv in [self.conv, self.conv1x1_out, self.conv1x1_skip, + self.conv1x1c, self.conv1x1g]: + if conv is not None: + self.conv.clear_buffer() diff --git a/wavenet_vocoder/util.py b/wavenet_vocoder/util.py new file mode 100644 index 0000000..4fea1d9 --- /dev/null +++ b/wavenet_vocoder/util.py @@ -0,0 +1,25 @@ +# coding: utf-8 +from __future__ import with_statement, print_function, absolute_import + + +def _assert_valid_input_type(s): + assert s == "mulaw-quantize" or s == "mulaw" or s == "raw" + + +def is_mulaw_quantize(s): + _assert_valid_input_type(s) + return s == "mulaw-quantize" + + +def is_mulaw(s): + _assert_valid_input_type(s) + return s == "mulaw" + + +def is_raw(s): + _assert_valid_input_type(s) + return s == "raw" + + +def is_scalar_input(s): + return is_raw(s) or is_mulaw(s) diff --git a/wavenet_vocoder/wavenet.py b/wavenet_vocoder/wavenet.py new file mode 100644 index 0000000..bab1095 --- /dev/null +++ b/wavenet_vocoder/wavenet.py @@ -0,0 +1,380 @@ +# coding: utf-8 +from __future__ import with_statement, print_function, absolute_import + +import math +import numpy as np + +import torch +from torch import nn +from torch.nn import functional as F + +from .modules import Embedding + +from .modules import Conv1d1x1, ResidualConv1dGLU, ConvTranspose2d +from .mixture import sample_from_discretized_mix_logistic + + +def _expand_global_features(B, T, g, bct=True): + """Expand global conditioning features to all time steps + + Args: + B (int): Batch size. + T (int): Time length. + g (Tensor): Global features, (B x C) or (B x C x 1). + bct (bool) : returns (B x C x T) if True, otherwise (B x T x C) + + Returns: + Tensor: B x C x T or B x T x C or None + """ + if g is None: + return None + g = g.unsqueeze(-1) if g.dim() == 2 else g + if bct: + g_bct = g.expand(B, -1, T) + return g_bct.contiguous() + else: + g_btc = g.expand(B, -1, T).transpose(1, 2) + return g_btc.contiguous() + + +def receptive_field_size(total_layers, num_cycles, kernel_size, + dilation=lambda x: 2**x): + """Compute receptive field size + + Args: + total_layers (int): total layers + num_cycles (int): cycles + kernel_size (int): kernel size + dilation (lambda): lambda to compute dilation factor. ``lambda x : 1`` + to disable dilated convolution. + + Returns: + int: receptive field size in sample + + """ + assert total_layers % num_cycles == 0 + layers_per_cycle = total_layers // num_cycles + dilations = [dilation(i % layers_per_cycle) for i in range(total_layers)] + return (kernel_size - 1) * sum(dilations) + 1 + + +class WaveNet(nn.Module): + """The WaveNet model that supports local and global conditioning. + + Args: + out_channels (int): Output channels. If input_type is mu-law quantized + one-hot vecror. this must equal to the quantize channels. Other wise + num_mixtures x 3 (pi, mu, log_scale). + layers (int): Number of total layers + stacks (int): Number of dilation cycles + residual_channels (int): Residual input / output channels + gate_channels (int): Gated activation channels. + skip_out_channels (int): Skip connection channels. + kernel_size (int): Kernel size of convolution layers. + dropout (float): Dropout probability. + cin_channels (int): Local conditioning channels. If negative value is + set, local conditioning is disabled. + gin_channels (int): Global conditioning channels. If negative value is + set, global conditioning is disabled. + n_speakers (int): Number of speakers. Used only if global conditioning + is enabled. + weight_normalization (bool): If True, DeepVoice3-style weight + normalization is applied. + upsample_conditional_features (bool): Whether upsampling local + conditioning features by transposed convolution layers or not. + upsample_scales (list): List of upsample scale. + ``np.prod(upsample_scales)`` must equal to hop size. Used only if + upsample_conditional_features is enabled. + freq_axis_kernel_size (int): Freq-axis kernel_size for transposed + convolution layers for upsampling. If you only care about time-axis + upsampling, set this to 1. + scalar_input (Bool): If True, scalar input ([-1, 1]) is expected, otherwise + quantized one-hot vector is expected. + use_speaker_embedding (Bool): Use speaker embedding or Not. Set to False + if you want to disable embedding layer and use external features + directly. + """ + + def __init__(self, out_channels=256, layers=20, stacks=2, + residual_channels=512, + gate_channels=512, + skip_out_channels=512, + kernel_size=3, dropout=1 - 0.95, + cin_channels=-1, gin_channels=-1, n_speakers=None, + weight_normalization=True, + upsample_conditional_features=False, + upsample_scales=None, + freq_axis_kernel_size=3, + scalar_input=False, + use_speaker_embedding=True, + ): + super(WaveNet, self).__init__() + self.scalar_input = scalar_input + self.out_channels = out_channels + self.cin_channels = cin_channels + assert layers % stacks == 0 + layers_per_stack = layers // stacks + if scalar_input: + self.first_conv = Conv1d1x1(1, residual_channels) + else: + self.first_conv = Conv1d1x1(out_channels, residual_channels) + + self.conv_layers = nn.ModuleList() + for layer in range(layers): + dilation = 2**(layer % layers_per_stack) + conv = ResidualConv1dGLU( + residual_channels, gate_channels, + kernel_size=kernel_size, + skip_out_channels=skip_out_channels, + bias=True, # magenda uses bias, but musyoku doesn't + dilation=dilation, dropout=dropout, + cin_channels=cin_channels, + gin_channels=gin_channels, + weight_normalization=weight_normalization) + self.conv_layers.append(conv) + self.last_conv_layers = nn.ModuleList([ + nn.ReLU(inplace=True), + Conv1d1x1(skip_out_channels, skip_out_channels, + weight_normalization=weight_normalization), + nn.ReLU(inplace=True), + Conv1d1x1(skip_out_channels, out_channels, + weight_normalization=weight_normalization), + ]) + + if gin_channels > 0 and use_speaker_embedding: + assert n_speakers is not None + self.embed_speakers = Embedding( + n_speakers, gin_channels, padding_idx=None, std=0.1) + else: + self.embed_speakers = None + + # Upsample conv net + if upsample_conditional_features: + self.upsample_conv = nn.ModuleList() + for s in upsample_scales: + freq_axis_padding = (freq_axis_kernel_size - 1) // 2 + convt = ConvTranspose2d(1, 1, (freq_axis_kernel_size, s), + padding=(freq_axis_padding, 0), + dilation=1, stride=(1, s), + weight_normalization=weight_normalization) + self.upsample_conv.append(convt) + # assuming we use [0, 1] scaled features + # this should avoid non-negative upsampling output + self.upsample_conv.append(nn.ReLU(inplace=True)) + else: + self.upsample_conv = None + + self.receptive_field = receptive_field_size(layers, stacks, kernel_size) + + def has_speaker_embedding(self): + return self.embed_speakers is not None + + def local_conditioning_enabled(self): + return self.cin_channels > 0 + + def forward(self, x, c=None, g=None, softmax=False): + """Forward step + + Args: + x (Tensor): One-hot encoded audio signal, shape (B x C x T) + c (Tensor): Local conditioning features, + shape (B x cin_channels x T) + g (Tensor): Global conditioning features, + shape (B x gin_channels x 1) or speaker Ids of shape (B x 1). + Note that ``self.use_speaker_embedding`` must be False when you + want to disable embedding layer and use external features + directly (e.g., one-hot vector). + Also type of input tensor must be FloatTensor, not LongTensor + in case of ``self.use_speaker_embedding`` equals False. + softmax (bool): Whether applies softmax or not. + + Returns: + Tensor: output, shape B x out_channels x T + """ + B, _, T = x.size() + + if g is not None: + if self.embed_speakers is not None: + # (B x 1) -> (B x 1 x gin_channels) + g = self.embed_speakers(g.view(B, -1)) + # (B x gin_channels x 1) + g = g.transpose(1, 2) + assert g.dim() == 3 + # Expand global conditioning features to all time steps + g_bct = _expand_global_features(B, T, g, bct=True) + + if c is not None and self.upsample_conv is not None: + # B x 1 x C x T + c = c.unsqueeze(1) + for f in self.upsample_conv: + c = f(c) + # B x C x T + c = c.squeeze(1) + assert c.size(-1) == x.size(-1) + + # Feed data to network + x = self.first_conv(x) + skips = None + for f in self.conv_layers: + x, h = f(x, c, g_bct) + if skips is None: + skips = h + else: + skips += h + skips *= math.sqrt(0.5) + # skips = h if skips is None else (skips + h) * math.sqrt(0.5) + + x = skips + for f in self.last_conv_layers: + x = f(x) + + x = F.softmax(x, dim=1) if softmax else x + + return x + + def incremental_forward(self, initial_input=None, c=None, g=None, + T=100, test_inputs=None, + tqdm=lambda x: x, softmax=True, quantize=True, + log_scale_min=-7.0): + """Incremental forward step + + Due to linearized convolutions, inputs of shape (B x C x T) are reshaped + to (B x T x C) internally and fed to the network for each time step. + Input of each time step will be of shape (B x 1 x C). + + Args: + initial_input (Tensor): Initial decoder input, (B x C x 1) + c (Tensor): Local conditioning features, shape (B x C' x T) + g (Tensor): Global conditioning features, shape (B x C'' or B x C''x 1) + T (int): Number of time steps to generate. + test_inputs (Tensor): Teacher forcing inputs (for debugging) + tqdm (lamda) : tqdm + softmax (bool) : Whether applies softmax or not + quantize (bool): Whether quantize softmax output before feeding the + network output to input for the next time step. TODO: rename + log_scale_min (float): Log scale minimum value. + + Returns: + Tensor: Generated one-hot encoded samples. B x C x T  + or scaler vector B x 1 x T + """ + self.clear_buffer() + B = 1 + + # Note: shape should be **(B x T x C)**, not (B x C x T) opposed to + # batch forward due to linealized convolution + if test_inputs is not None: + if self.scalar_input: + if test_inputs.size(1) == 1: + test_inputs = test_inputs.transpose(1, 2).contiguous() + else: + if test_inputs.size(1) == self.out_channels: + test_inputs = test_inputs.transpose(1, 2).contiguous() + + B = test_inputs.size(0) + if T is None: + T = test_inputs.size(1) + else: + T = max(T, test_inputs.size(1)) + # cast to int in case of numpy.int64... + T = int(T) + + # Global conditioning + if g is not None: + if self.embed_speakers is not None: + g = self.embed_speakers(g.view(B, -1)) + # (B x gin_channels, 1) + g = g.transpose(1, 2) + assert g.dim() == 3 + g_btc = _expand_global_features(B, T, g, bct=False) + + # Local conditioning + if c is not None and self.upsample_conv is not None: + assert c is not None + # B x 1 x C x T + c = c.unsqueeze(1) + for f in self.upsample_conv: + c = f(c) + # B x C x T + c = c.squeeze(1) + assert c.size(-1) == T + if c is not None and c.size(-1) == T: + c = c.transpose(1, 2).contiguous() + + outputs = [] + if initial_input is None: + if self.scalar_input: + initial_input = torch.zeros(B, 1, 1) + else: + initial_input = torch.zeros(B, 1, self.out_channels) + initial_input[:, :, 127] = 1 # TODO: is this ok? + # https://github.com/pytorch/pytorch/issues/584#issuecomment-275169567 + if next(self.parameters()).is_cuda: + initial_input = initial_input.cuda() + else: + if initial_input.size(1) == self.out_channels: + initial_input = initial_input.transpose(1, 2).contiguous() + + current_input = initial_input + + for t in tqdm(range(T)): + if test_inputs is not None and t < test_inputs.size(1): + current_input = test_inputs[:, t, :].unsqueeze(1) + else: + if t > 0: + current_input = outputs[-1] + + # Conditioning features for single time step + ct = None if c is None else c[:, t, :].unsqueeze(1) + gt = None if g is None else g_btc[:, t, :].unsqueeze(1) + + x = current_input + x = self.first_conv.incremental_forward(x) + skips = None + for f in self.conv_layers: + x, h = f.incremental_forward(x, ct, gt) + skips = h if skips is None else (skips + h) * math.sqrt(0.5) + x = skips + for f in self.last_conv_layers: + try: + x = f.incremental_forward(x) + except AttributeError: + x = f(x) + + # Generate next input by sampling + if self.scalar_input: + x = sample_from_discretized_mix_logistic( + x.view(B, -1, 1), log_scale_min=log_scale_min) + else: + x = F.softmax(x.view(B, -1), dim=1) if softmax else x.view(B, -1) + if quantize: + sample = np.random.choice( + np.arange(self.out_channels), p=x.view(-1).data.cpu().numpy()) + x.zero_() + x[:, sample] = 1.0 + outputs += [x.data] + # T x B x C + outputs = torch.stack(outputs) + # B x C x T + outputs = outputs.transpose(0, 1).transpose(1, 2).contiguous() + + self.clear_buffer() + return outputs + + def clear_buffer(self): + self.first_conv.clear_buffer() + for f in self.conv_layers: + f.clear_buffer() + for f in self.last_conv_layers: + try: + f.clear_buffer() + except AttributeError: + pass + + def make_generation_fast_(self): + def remove_weight_norm(m): + try: + nn.utils.remove_weight_norm(m) + except ValueError: # this module didn't have weight norm + return + self.apply(remove_weight_norm)