{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nfrom torch import nn\nfrom tqdm.auto import tqdm\nfrom torchvision import transforms\nfrom torch.utils.data import DataLoader\nfrom torch.utils.data import Dataset\nfrom PIL import Image\nfrom torchvision.utils import make_grid\nimport PIL\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport random\nimport os\nimport glob\nimport random\n\nfrom kaggle_datasets import KaggleDatasets\n\nimport tensorflow as tf","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:15:44.045407Z","iopub.execute_input":"2021-08-12T08:15:44.045777Z","iopub.status.idle":"2021-08-12T08:15:44.052529Z","shell.execute_reply.started":"2021-08-12T08:15:44.04574Z","shell.execute_reply":"2021-08-12T08:15:44.051402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"GCS_PATH = '/kaggle/input/gan-getting-started/' #KaggleDatasets().get_gcs_path()","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:15:44.054494Z","iopub.execute_input":"2021-08-12T08:15:44.055017Z","iopub.status.idle":"2021-08-12T08:15:44.06206Z","shell.execute_reply.started":"2021-08-12T08:15:44.054978Z","shell.execute_reply":"2021-08-12T08:15:44.061146Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Downsample(nn.Module):\n    def __init__(self, in_channels, out_channels, kernel_size=4, stride=2, padding=1, apply_instancenorm=True):\n        super(Downsample, self).__init__()\n        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, bias=nn.InstanceNorm2d)\n        self.norm = nn.InstanceNorm2d(out_channels)\n        self.relu = nn.LeakyReLU(0.2, inplace=True)\n        self.apply_norm = apply_instancenorm\n\n    def forward(self, x):\n        x = self.conv(x)\n        if self.apply_norm:\n            x = self.norm(x)\n        x = self.relu(x)\n\n        return x","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:15:44.064309Z","iopub.execute_input":"2021-08-12T08:15:44.064726Z","iopub.status.idle":"2021-08-12T08:15:44.073274Z","shell.execute_reply.started":"2021-08-12T08:15:44.064689Z","shell.execute_reply":"2021-08-12T08:15:44.072212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Upsample(nn.Module):\n    def __init__(self, in_channels, out_channels, kernel_size=4, stride=2, padding=1, dropout=True):\n        super(Upsample, self).__init__()\n        self.dropout = dropout\n        self.block = nn.Sequential(\n            nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, padding, bias=nn.InstanceNorm2d),\n            nn.InstanceNorm2d(out_channels),\n            nn.ReLU(inplace=True)\n        )\n        self.dropout_layer = nn.Dropout2d(0.5)\n\n    def forward(self, x, shortcut=None):\n        x = self.block(x)\n        if self.dropout:\n            x = self.dropout_layer(x)\n\n        if shortcut is not None:\n            x = torch.cat([x, shortcut], dim=1)\n\n        return x","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:15:44.074924Z","iopub.execute_input":"2021-08-12T08:15:44.075391Z","iopub.status.idle":"2021-08-12T08:15:44.083413Z","shell.execute_reply.started":"2021-08-12T08:15:44.075309Z","shell.execute_reply":"2021-08-12T08:15:44.082471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CycleGAN_Unet_Generator(nn.Module):\n    def __init__(self, filter=64):\n        super(CycleGAN_Unet_Generator, self).__init__()\n        self.downsamples = nn.ModuleList([\n            Downsample(3, filter, kernel_size=4, apply_instancenorm=False),  # (b, filter, 128, 128)\n            Downsample(filter, filter * 2),  # (b, filter * 2, 64, 64)\n            Downsample(filter * 2, filter * 4),  # (b, filter * 4, 32, 32)\n            Downsample(filter * 4, filter * 8),  # (b, filter * 8, 16, 16)\n            Downsample(filter * 8, filter * 8), # (b, filter * 8, 8, 8)\n        ])\n\n        self.upsamples = nn.ModuleList([\n            Upsample(filter * 8, filter * 8),\n            Upsample(filter * 16, filter * 4, dropout=False),\n            Upsample(filter * 8, filter * 2, dropout=False),\n            Upsample(filter * 4, filter, dropout=False)\n        ])\n\n        self.last = nn.Sequential(\n            nn.ConvTranspose2d(filter * 2, 3, kernel_size=4, stride=2, padding=1),\n            nn.Tanh()\n        )\n\n    def forward(self, x):\n        skips = []\n        for l in self.downsamples:\n            x = l(x)\n            skips.append(x)\n\n        skips = reversed(skips[:-1])\n        for l, s in zip(self.upsamples, skips):\n            x = l(x, s)\n\n        out = self.last(x)\n\n        return out","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:15:44.084993Z","iopub.execute_input":"2021-08-12T08:15:44.085397Z","iopub.status.idle":"2021-08-12T08:15:44.097054Z","shell.execute_reply.started":"2021-08-12T08:15:44.08536Z","shell.execute_reply":"2021-08-12T08:15:44.096093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train(False)\n!conda install -y gdown\n","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:15:44.182192Z","iopub.execute_input":"2021-08-12T08:15:44.18249Z","iopub.status.idle":"2021-08-12T08:16:46.746665Z","shell.execute_reply.started":"2021-08-12T08:15:44.18246Z","shell.execute_reply":"2021-08-12T08:16:46.745629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# download the saved model\n!gdown https://drive.google.com/uc?id=1gXK17UPrG7gVnjfTJKbBNwLlZAh0vc9p","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:16:46.748605Z","iopub.execute_input":"2021-08-12T08:16:46.748995Z","iopub.status.idle":"2021-08-12T08:16:49.17871Z","shell.execute_reply.started":"2021-08-12T08:16:46.748951Z","shell.execute_reply":"2021-08-12T08:16:49.177726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#MODEL_PATH = \"/kaggle/working/cycleGAN_5700.pth\"\nimport torchvision.models as models\n\ngen_PM = CycleGAN_Unet_Generator()\ngen_PM.load_state_dict(torch.load('cycleGAN_pytorchN.pth'))\n","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:16:49.18245Z","iopub.execute_input":"2021-08-12T08:16:49.182726Z","iopub.status.idle":"2021-08-12T08:16:55.341667Z","shell.execute_reply.started":"2021-08-12T08:16:49.182694Z","shell.execute_reply":"2021-08-12T08:16:55.340803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#to delete\nprint(os.getcwd())\nif os.path.isdir('../images') == False:\n  os.makedirs('../images')\n","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:16:55.39262Z","iopub.status.idle":"2021-08-12T08:16:55.393296Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageTransform:\n    def __init__(self, img_size=256):\n        self.transform = {\n            'train': transforms.Compose([\n                transforms.Resize((img_size, img_size)),\n                transforms.ToTensor(),\n                transforms.Normalize(mean=[0.5], std=[0.5])\n            ]),\n            'test': transforms.Compose([\n                transforms.Resize((img_size, img_size)),\n                transforms.ToTensor(),\n                transforms.Normalize(mean=[0.5], std=[0.5])\n            ])}\n\n    def __call__(self, img, phase='train'):\n        img = self.transform[phase](img)\n\n        return img\n\n\n# Monet Dataset ---------------------------------------------------------------------------\nclass MonetDataset(Dataset):\n    def __init__(self, base_img_paths, style_img_paths,  transform, phase='train'):\n        self.base_img_paths = base_img_paths\n        self.style_img_paths = style_img_paths\n        self.transform = transform\n        self.phase = phase\n\n    def __len__(self):\n        return min([len(self.base_img_paths), len(self.style_img_paths)])\n\n    def __getitem__(self, idx):        \n        base_img_path = self.base_img_paths[idx]\n        style_img_path = self.style_img_paths[idx]\n        base_img = Image.open(base_img_path)\n        style_img = Image.open(style_img_path)\n\n        base_img = self.transform(base_img, self.phase)\n        style_img = self.transform(style_img, self.phase)\n\n        return base_img, style_img","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:17:01.843055Z","iopub.execute_input":"2021-08-12T08:17:01.843403Z","iopub.status.idle":"2021-08-12T08:17:01.853427Z","shell.execute_reply.started":"2021-08-12T08:17:01.843369Z","shell.execute_reply":"2021-08-12T08:17:01.852067Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = ImageTransform(img_size=256)","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:17:04.657212Z","iopub.execute_input":"2021-08-12T08:17:04.657545Z","iopub.status.idle":"2021-08-12T08:17:04.661534Z","shell.execute_reply.started":"2021-08-12T08:17:04.657516Z","shell.execute_reply":"2021-08-12T08:17:04.660534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"import shutil\ndef submit(net, transform):\n    os.makedirs('../images', exist_ok=True)\n    \n    net.eval()\n    photo_img_paths = tf.io.gfile.glob(str(GCS_PATH + '/photo_jpg/*.*'))\n    \n    for path in photo_img_paths:\n        photo_id = path.split('/')[-1]\n        img = transform(Image.open(path), phase='test')\n        \n        gen_img = net(img.unsqueeze(0))[0]\n        \n        # Reverse Normalization\n        gen_img = gen_img * 0.5 + 0.5\n        gen_img = gen_img * 255\n        gen_img = gen_img.detach().cpu().numpy().astype(np.uint8)\n        \n        gen_img = np.transpose(gen_img, [1,2,0])\n        \n        gen_img = Image.fromarray(gen_img)\n        gen_img.save(os.path.join('../images', photo_id))\n        \n    # Make Zipfile\n    shutil.make_archive(\"/kaggle/working/images\", 'zip', \"/kaggle/images\")\n    \n    # Delete Origin file\n    shutil.rmtree('../images')","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:17:51.792802Z","iopub.execute_input":"2021-08-12T08:17:51.79317Z","iopub.status.idle":"2021-08-12T08:17:51.801327Z","shell.execute_reply.started":"2021-08-12T08:17:51.793137Z","shell.execute_reply":"2021-08-12T08:17:51.80025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submit(gen_PM, transform)","metadata":{"execution":{"iopub.status.busy":"2021-08-12T08:17:42.945588Z","iopub.execute_input":"2021-08-12T08:17:42.945959Z","iopub.status.idle":"2021-08-12T08:17:46.790776Z","shell.execute_reply.started":"2021-08-12T08:17:42.945924Z","shell.execute_reply":"2021-08-12T08:17:46.788491Z"},"trusted":true},"execution_count":null,"outputs":[]}]}