{"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":"markdown","source":"# 基于生成对抗网络的黑白图片上色\n## 目标\n输入灰度图片，输出彩色图片\n\n为了减少运算量，转换为输入灰度通道，输出彩色通道\n### 彩色图片与色彩空间\n#### RGB\nRGB色彩空间3条都是彩色通道，如果使用RGB，则输入的灰度图片是3通道，输出的彩色图片也是3通道\n#### LAB\nLAB色彩空间的L通道是灰度通道，AB是颜色通道，则输入可以为1条携带灰度信息的L通道，输出为2条携带色彩信息的AB通道\n### 输入与输出\n为了减少运算量，显然使用LAB色彩空间会比RGB更好\n\n* 输入：L通道\n\n* 输出：AB通道","metadata":{}},{"cell_type":"markdown","source":"# 使用的Package","metadata":{}},{"cell_type":"code","source":"import time\nimport cv2\nimport os\nimport torch \nimport torchvision.datasets\nimport torch.optim as optim\n\nfrom torch import nn\nfrom torch.utils.data import Dataset\nfrom torch.utils.tensorboard import SummaryWriter\nfrom torchvision import transforms\nfrom torchvision.datasets.vision import VisionDataset\nfrom torch.utils.data import DataLoader\nfrom torch.utils.data import Subset\nimport numpy as np\n\ntorch.backends.cudnn.benchmark = True\n","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.174829Z","iopub.execute_input":"2022-05-23T14:04:20.175094Z","iopub.status.idle":"2022-05-23T14:04:20.181879Z","shell.execute_reply.started":"2022-05-23T14:04:20.175065Z","shell.execute_reply":"2022-05-23T14:04:20.180802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# GAN 生成对抗神经网络\n## 由生成器 Generator 和 鉴别器 Discriminator 构成\n\n* Generator负责生成以假乱真的伪造结果\n\n* Discriminator则负责鉴别出真实结果与伪造结果\n\nGenerator和Discriminator作为对立的存在，训练的目标是使对方“失灵”\n\n借此不断增强后，Generator即可给我们带来最终所需的输出","metadata":{}},{"cell_type":"markdown","source":"## Generator\n### 使用Unet\n\nUnet是一个U形的网络，先把特征采样缩小，再放大\n\n![image.png](attachment:14f71885-aca6-44e9-b782-9645ce236f7c.png)\n\n为了保证图片大小输出一致，卷积时加入了padding","metadata":{},"attachments":{"14f71885-aca6-44e9-b782-9645ce236f7c.png":{"image/png":"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gmW1mGnftjmd0pKJiVbIFBERkfOjoKSKmwemsuylm1j20k3EOoIICrDRu1d7evdqT3JiNAUlVX5vd85XWZS5rZR7bOzPLWf5psN+b+Ok3YcK2bjnOOUeG+UeG5+v3U9llcuvbby7aBt3//Vzqqr9W6/IudCIpmA2m4h0hGK323C69AElIiIiFzeL2UR0VBgWi5nqKme9txcVEUxMVO2P+SenB/uT01U7Wur2eH6hpMj5o6DZxB05UUaN001ZeRVRdhv5BaWUFBjeM6ZERERERETOlqbONnH7jxZT7XRTXFIOQEVFNTkF5Rj6RUxEREREROpIQVNERERERET8SlNnmzi7zYLJhHfns8BAOyEBFkxo2qyIiIiIiNSNgmYT16dDPKFBduKb1Z5NFRsTTrLDhtmsoCkiIiIiInWjqbMiIiIiIiLiVxrRFB9Op4uySm0EJCIiIiIidacRzSZuy/d5lFc5ycsvASAnt4hvth/DbRgN3DMREREREblQKWg2cSXlNRiGh5qa+j+sWEREREREmgYFTREREREREfErrdFs4prHhGKzmgkJDgQgvpmDZqEW73EnIiIiIiIiZ0tBs4lr3TyCQLsVR0QIADabldAgWwP3SkRERERELmQathIRERERERG/0ohmE1fjdGN4PLjdtbvMFpdUsK/Cg8fjwWQyNXDvRERERETkQqQRzSZu3c4cyiud5BwvBKCkpIJ9R4sxPDpLU0RERERE6kZBU0RERERERPxKQVN8WK0WggOsmNC0WRERERERqRut0Wzi+nZOIDTIRkKzKAAS4iNJdtgwmxU0RURERESkbjSi2cRZzGZMJpOCpYiIiIiI+I2CpoiIiIiIiPiVps42cXuyC6msdlFYVEazuEhycgs5esSFYXg0yikiIiIiInWioNnE5RZU4HIbVFRWA+B0uqmscuLBA9oQSERERERE6kBTZ0VERERERMSvNKLZxEWGBWIxmwgIsAMQHR1GZKAJi1m/QYiIiIiISN0oaDZxnVpFExxoIyYqDIDgoACaOWwN3CsREREREbmQadhKRERERERE/Eojmk1cVXXtDrMulxu73UZFRTU5Rg0ejweTSZsBiYiIiIjI2dOIZhO3fncu5VVOcvOKAMgvKGXbvhMYHk8D90xERERERC5UCpoiIiIiIiLiVwqaclomnaEpIiIiIiJ1pDWaTVz3dnEE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yl3NZDLo200RERERkTuM9hPKXe3VxZP48lTnNe/FOe0E+gKYjEpERURERERuJSWacs8aNyaNQJIDp91yu6ciIiIiInJf0dZZERERERERiSklmnJXW/XlNxw4XHXNe4FAkL5AkEgkcotnJSIiIiJyf9PWWbmrdfsC+APX7pV5quocbe1ddPUGiHfGsMS7iIiIiIjckFY0RUREREREJKa0oil3tZkT0rHUXbrd0xARERERke9Qoil3tcJxyZz3X/uvcc6YdDI8l3Da9ddcRERERORW0hO43LOcThuWkA2TUTvERURERERuJT2By13tQkcP3q7e2z0NERERERH5DiWacldbv6eaiq9rr3nvYtslmlq9BIKhWzwrEREREZH7m7bOyj2rqaWdtvYufP4QFrPpdk9HRERERP5/9u48Oqoq3Rv/99RcqQyVCplDJjIQA0kIU4KIShgVFJzFqRvFth1awLfv7/b8vva1r3ddbbW7vdq2t220ux0AFQFlkkGmhCEQEkiAJGQmIZWxKjXXqd8faQpiEkJCJZXh+1lLV3LOqbOfUytUnefsvZ9NYwZ7NImIiIiIiMij2KNJI9p9tyXhwPm2HvfJZFLIZRIIgjDEURERERERjW1MNGlE81XLoVTKe9w3MTEKdkM7fNU97yciIiIiosHBobNERERERETkUUw0aUTbfqQCp4urvB0GERERERFdhUNnaUS72NSBNoOpx31nSqrQ3GKE0WSDr49iiCMjIiIiIhq72KNJo5bockF0ueDydiBERERERGMMezRpREuODoRDwj9jIiIiIqLhhHfoNKJlp0bAIut5eZPI8CAE+sihUkiHOCoiIiIiorGNiSaNWoFaX/hKRchlTDSJiIiIiIYS52jSiGa1O+FwOL0dBhERERERXYWJJo1oH+8qwZH88z3uMxjNaDGY4XCKQxwVEREREdHYxqGzNGpVVl9Cc4sRZqsDflzehIiIiIhoyLBHk4iIiIiIiDyKPZo0oj08byK+O9dz1VkiIiIiIvIOJpo0oinlUsh6qSqbkjQedkM7h80SEREREQ0xJpo0akmlEohSjg4nIiIiIhpqvAun6yKKLhgM1kFvx2Sy9+v4w6frUFZRP0jREBHRaON0OuFyubwdhte5XC40NZkGvZ22Nsugt0FEwxMTTbouP/3pDsTFvYVf/OJb1NcbB62dzMw/Y86c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"}}},{"cell_type":"markdown","source":"### Unet utility","metadata":{"_kg_hide-input":false}},{"cell_type":"code","source":"# class UnetConv3x3ReLu(nn.Module):\n#     \"\"\"Unet连续卷积层\"\"\"\n#     def __init__(self, in_channels, out_channels):\n#         super().__init__()\n\n#         self.conv = nn.Sequential(\n#             # 第一次\n#             nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, bias=False),\n#             nn.BatchNorm2d(out_channels),\n#             nn.ReLU(True),\n#             # 第二次\n#             nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, bias=False),\n#             nn.BatchNorm2d(out_channels),\n#             nn.ReLU(True),\n#         )\n\n#     def forward(self, x):\n#         # print(f'before UnetConv3x3ReLu{x.size()}')\n#         return self.conv(x)\n\n\n# class UnetMaxPool2x2(nn.Module):\n#     \"\"\"Unet下降层\"\"\"\n#     def __init__(self, in_channels, out_channels):\n#         super().__init__()\n#         self.pool = nn.Sequential(\n#             # 下降\n#             nn.MaxPool2d(2),\n#             # 卷\n#             UnetConv3x3ReLu(in_channels, out_channels)\n#         )\n\n#     def forward(self, x):\n#         # print(f'before UnetMaxPool2x2{x.size()}')\n#         return self.pool(x)\n\n\n# class UnetUpConv2x2(nn.Module):\n#     \"\"\"Unet上升层，该层会连带合并下降层的信息\"\"\"\n#     def __init__(self, in_channels, out_channels):\n#         super().__init__()\n#         # 上升\n#         self.upConv = nn.ConvTranspose2d(in_channels, in_channels // 2, 2, stride=2)\n#         # 卷\n#         self.Conv3x3Relu = UnetConv3x3ReLu(in_channels, out_channels)\n\n#     def forward(self, unet_up, unet_down):\n#         unet_up = self.upConv(unet_up)\n\n#         # 由于卷积时的取整问题，可能会存在大小差值\n#         d2 = unet_down.size()[2] - unet_up.size()[2]  # top <--> bottom\n#         d3 = unet_down.size()[3] - unet_up.size()[3]  # left <--> right\n\n#         # 补齐up层 (left, right, top, bottom)\n#         unet_up = nn.functional.pad(unet_up, [d3 // 2, d3 - d3 // 2, d2 // 2, d2 - d2 // 2])\n\n#         # print(f'before UnetUpConv2x2 unet_out{unet_up.size()}')\n#         # print(f'before UnetUpConv2x2 unet_in{unet_down.size()}')\n\n#         # 拼接\n#         concat = torch.cat([unet_down, unet_up], dim=1)\n\n#         # 一起卷\n#         return self.Conv3x3Relu(concat)\n\n\n\n# import torch.nn.functional as F\n\n# class DoubleConv(nn.Module):\n#     \"\"\"(convolution => [BN] => ReLU) * 2\"\"\"\n\n#     def __init__(self, in_channels, out_channels, mid_channels=None):\n#         super().__init__()\n#         if not mid_channels:\n#             mid_channels = out_channels\n#         self.double_conv = nn.Sequential(\n#             nn.Conv2d(in_channels, mid_channels, kernel_size=3, padding=1),\n#             nn.BatchNorm2d(mid_channels),\n#             nn.ReLU(inplace=True),\n#             nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1),\n#             nn.BatchNorm2d(out_channels),\n#             nn.ReLU(inplace=True)\n#         )\n\n#     def forward(self, x):\n#         return self.double_conv(x)\n\n\n# class Down(nn.Module):\n#     \"\"\"Downscaling with maxpool then double conv\"\"\"\n\n#     def __init__(self, in_channels, out_channels):\n#         super().__init__()\n#         self.maxpool_conv = nn.Sequential(\n#             nn.MaxPool2d(2),\n#             DoubleConv(in_channels, out_channels)\n#         )\n\n#     def forward(self, x):\n#         return self.maxpool_conv(x)\n\n\n# class Up(nn.Module):\n#     \"\"\"Upscaling then double conv\"\"\"\n\n#     def __init__(self, in_channels, out_channels, bilinear=True):\n#         super().__init__()\n\n#         # if bilinear, use the normal convolutions to reduce the number of channels\n#         if bilinear:\n#             self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)\n#             self.conv = DoubleConv(in_channels, out_channels, in_channels // 2)\n#         else:\n#             self.up = nn.ConvTranspose2d(in_channels , in_channels // 2, kernel_size=2, stride=2)\n#             self.conv = DoubleConv(in_channels, out_channels)\n\n\n#     def forward(self, x1, x2):\n#         x1 = self.up(x1)\n#         # input is CHW\n#         diffY = x2.size()[2] - x1.size()[2]\n#         diffX = x2.size()[3] - x1.size()[3]\n\n#         x1 = F.pad(x1, [diffX // 2, diffX - diffX // 2,\n#                         diffY // 2, diffY - diffY // 2])\n#         # if you have padding issues, see\n#         # https://github.com/HaiyongJiang/U-Net-Pytorch-Unstructured-Buggy/commit/0e854509c2cea854e247a9c615f175f76fbb2e3a\n#         # https://github.com/xiaopeng-liao/Pytorch-UNet/commit/8ebac70e633bac59fc22bb5195e513d5832fb3bd\n#         x = torch.cat([x2, x1], dim=1)\n#         return self.conv(x)\n\n\n# class OutConv(nn.Module):\n#     def __init__(self, in_channels, out_channels):\n#         super(OutConv, self).__init__()\n#         self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)\n\n#     def forward(self, x):\n#         return self.conv(x)","metadata":{"_uuid":"d476ec58-1204-4231-a337-c91b60069fb5","_cell_guid":"7b26be67-f3e2-4f50-80f4-5e7b69042cfe","jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2022-05-23T14:04:20.239575Z","iopub.execute_input":"2022-05-23T14:04:20.24017Z","iopub.status.idle":"2022-05-23T14:04:20.249388Z","shell.execute_reply.started":"2022-05-23T14:04:20.24012Z","shell.execute_reply":"2022-05-23T14:04:20.24877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Unet","metadata":{}},{"cell_type":"code","source":"# class SimpleUnet(nn.Module):\n#     def __init__(self, in_channels, out_channels):\n#         super().__init__()\n#         self.unetIn = UnetConv3x3ReLu(in_channels, 64)\n#         self.down1 = UnetMaxPool2x2(64, 128)\n#         self.down2 = UnetMaxPool2x2(128, 256)\n#         self.down3 = UnetMaxPool2x2(256, 512)\n#         self.down4 = UnetMaxPool2x2(512, 1024)\n#         self.up1 = UnetUpConv2x2(1024, 512)\n#         self.up2 = UnetUpConv2x2(512, 256)\n#         self.up3 = UnetUpConv2x2(256, 128)\n#         self.up4 = UnetUpConv2x2(128, 64)\n#         self.unetOut = nn.Conv2d(64, out_channels, kernel_size=1)\n\n#     def forward(self, x):\n#         i = self.unetIn(x)\n#         d1 = self.down1(i)\n#         d2 = self.down2(d1)\n#         d3 = self.down3(d2)\n#         d4 = self.down4(d3)\n#         up = self.up1(d4, d3)\n#         up = self.up2(up, d2)\n#         up = self.up3(up, d1)\n#         up = self.up4(up, i)\n#         return self.unetOut(up)\n\n\n\n\n\n# class SimpleUnet(nn.Module):\n#     def __init__(self, n_channels, n_classes, bilinear=True):\n#         super(SimpleUnet, self).__init__()\n#         self.n_channels = n_channels\n#         self.n_classes = n_classes\n#         self.bilinear = bilinear\n\n#         self.inc = DoubleConv(n_channels, 64)\n#         self.down1 = Down(64, 128)\n#         self.down2 = Down(128, 256)\n#         self.down3 = Down(256, 512)\n#         factor = 2 if bilinear else 1\n#         self.down4 = Down(512, 1024 // factor)\n#         self.up1 = Up(1024, 512 // factor, bilinear)\n#         self.up2 = Up(512, 256 // factor, bilinear)\n#         self.up3 = Up(256, 128 // factor, bilinear)\n#         self.up4 = Up(128, 64, bilinear)\n#         self.outc = OutConv(64, n_classes)\n\n#     def forward(self, x):\n#         x1 = self.inc(x)\n#         x2 = self.down1(x1)\n#         x3 = self.down2(x2)\n#         x4 = self.down3(x3)\n#         x5 = self.down4(x4)\n#         x = self.up1(x5, x4)\n#         x = self.up2(x, x3)\n#         x = self.up3(x, x2)\n#         x = self.up4(x, x1)\n#         logits = self.outc(x)\n#         return logits","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2022-05-23T14:04:20.30038Z","iopub.execute_input":"2022-05-23T14:04:20.300689Z","iopub.status.idle":"2022-05-23T14:04:20.306816Z","shell.execute_reply.started":"2022-05-23T14:04:20.300656Z","shell.execute_reply":"2022-05-23T14:04:20.305888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### ResUnet\n最后使用的模型","metadata":{}},{"cell_type":"code","source":"class BatchNormRelu(nn.Module):\n    def __init__(self, in_channels):\n        super().__init__()\n        \n        self.batch_norm = nn.BatchNorm2d(in_channels)\n        self.relu = nn.ReLU(True)\n    \n    def forward(self, input):\n        x = self.batch_norm(input)\n        x = self.relu(x)\n        return x\n    \nclass residual_block(nn.Module):\n    def __init__(self, in_channels, out_channels, stride=1):\n        super().__init__()\n        \n        self.batnorm_relu1 = BatchNormRelu(in_channels)\n        self.conv_in1 = nn.Conv2d(in_channels,\n                                  out_channels,\n                                  kernel_size=3,\n                                  padding=1,\n                                  stride=stride,\n                                  bias=False)\n        self.batnorm_relu2 = BatchNormRelu(out_channels)\n        self.conv_in2 = nn.Conv2d(out_channels,\n                                  out_channels,\n                                  kernel_size=3,\n                                  padding=1,\n                                  stride=1)\n        \n        self.identity_map = nn.Conv2d(in_channels,\n                                     out_channels,\n                                     kernel_size=1,\n                                     stride=stride)\n    \n    def forward(self, inputs):\n        x = self.batnorm_relu1(inputs)\n        x = self.conv_in1(x)\n        x = self.batnorm_relu2(x)\n        x = self.conv_in2(x)\n        s = self.identity_map(inputs)\n        \n        skip = x + s\n        \n        return skip\n    \nclass decoder_block(nn.Module):\n    def __init__(self, in_channels, out_channels):\n        super().__init__()\n        \n        self.upsample = nn.Upsample(scale_factor=2, mode=\"bilinear\", align_corners=True)\n        self.res_block = residual_block(in_channels + out_channels, out_channels)\n        \n    def forward(self, inputs, skip):\n        x = self.upsample(inputs)\n        x = torch.cat([x, skip], dim=1)\n        x = self.res_block(x)\n        return x\n\n#Res Unet\nclass ResUnet(nn.Module):\n    def __init__(self, in_channels, out_channels):\n        super().__init__()\n        # encoder 1\n        self.conv_in1 = nn.Conv2d(in_channels, 64, kernel_size=3, padding=1, bias=False)\n        self.batnorm_relu = BatchNormRelu(64)\n        self.conv_in2 = nn.Conv2d(64, 64, kernel_size=3, padding = 1)\n        self.identity_map = nn.Conv2d(in_channels, 64, kernel_size=1)\n        \n        # encoder 2\n        self.res_block2 = residual_block(64, 128, stride=2)\n        # encoder 3\n        self.res_block3 = residual_block(128, 256, stride=2)\n        \n        # bridge\n        self.res_blockb = residual_block(256, 512, stride=2)\n        \n        # decoder 3\n        self.dec_block3 = decoder_block(512, 256)\n        # decoder 2\n        self.dec_block2 = decoder_block(256, 128)\n        # decoder 1\n        self.dec_block1 = decoder_block(128, 64)\n        \n        # output\n        self.output = nn.Conv2d(64, out_channels, kernel_size=1)\n        \n    def forward(self, inputs):\n        # encoder 1\n        x = self.conv_in1(inputs)\n        x = self.batnorm_relu(x)\n        x = self.conv_in2(x)\n        s = self.identity_map(inputs)\n        \n        e1 = x + s\n        # encoder 2\n        e2 = self.res_block2(e1)\n        # encoder 3\n        e3 = self.res_block3(e2)\n        \n        # bridge\n        bridge = self.res_blockb(e3)\n        \n        # decoder 3\n        d3 = self.dec_block3(bridge, e3)\n        # decoder 2\n        d2 = self.dec_block2(d3, e2)\n        # decoder 1\n        d1 = self.dec_block1(d2, e1)\n        \n        # output\n        output = self.output(d1)\n        return output","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.312318Z","iopub.execute_input":"2022-05-23T14:04:20.312581Z","iopub.status.idle":"2022-05-23T14:04:20.338524Z","shell.execute_reply.started":"2022-05-23T14:04:20.312549Z","shell.execute_reply":"2022-05-23T14:04:20.337544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Discriminator\n### Patch Gan（局部生成对抗网络）\n* 传统生成对抗网络：输出结果是一个指示图片真假性的一个数值（一般在[0,1]之间）\n\n* 局部生成对抗网络：输出的是一个大小为N\\*N，值域在[0,1]之间的矩阵，每个元素表示原图中某个局部区域的真假性\n\n### 如何建立局部生成对抗网络\n参考：https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/issues/39\n\n**任意的卷积神经网络都可以作为PathGAN**（主要是因为卷积网络更适合用于图片）\n\n因此使用常规的conv-batch-reLU组合","metadata":{}},{"cell_type":"code","source":"class PatchDiscriminator(nn.Module):\n    \"\"\"不包含输出层激活函数\n    激活函数内嵌在损失函数中\"\"\"\n    def __init__(self, in_channels=3):\n        super().__init__()\n        self.conv1 = nn.Conv2d(in_channels, 64, kernel_size=4, stride=2, padding=1)\n        self.conv2 = nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1, bias=False)\n        self.batchNorm2 = nn.BatchNorm2d(128)\n        self.conv3 = nn.Conv2d(128, 256, kernel_size=4, stride=2, padding=1, bias=False)\n        self.batchNorm3 = nn.BatchNorm2d(256)\n        self.conv4 = nn.Conv2d(256, 512, kernel_size=4, stride=1, padding=1, bias=False)\n        self.batchNorm4 = nn.BatchNorm2d(512)\n        # 最后一层的Channel降为1，以输出一张N*N的单层真假性集合\n        self.conv5 = nn.Conv2d(512, 1, kernel_size=4, stride=1, padding=1)\n\n        self.leakyRelu = nn.LeakyReLU(0.2, True)\n\n    def forward(self, x, label):\n        x = torch.cat([x, label], 1)\n        x = self.leakyRelu(self.conv1(x))\n        x = self.leakyRelu(self.batchNorm2(self.conv2(x)))\n        x = self.leakyRelu(self.batchNorm3(self.conv3(x)))\n        x = self.leakyRelu(self.batchNorm4(self.conv4(x)))\n        # sigmoid内嵌在损失函数中\n        return self.conv5(x)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.354164Z","iopub.execute_input":"2022-05-23T14:04:20.354816Z","iopub.status.idle":"2022-05-23T14:04:20.366754Z","shell.execute_reply.started":"2022-05-23T14:04:20.354774Z","shell.execute_reply":"2022-05-23T14:04:20.365786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 模型训练","metadata":{}},{"cell_type":"markdown","source":"## 效用函数 Utility","metadata":{}},{"cell_type":"markdown","source":"### Dataset转换\n旧图上色需要输入灰度数据，输出彩色数据\n\n可以把Pytorch固有的VisionDataset转换成输入为L通道，输出为ab","metadata":{}},{"cell_type":"code","source":"class LabImageDataset(Dataset):\n    \"\"\"\n    将一个 :class:`VisionDataset` 类型的数据集转换至Lab空间\\n\n    数据集的输入必须是以 :class:`PIL.Image.Image` 或者 :class:`numpy.ndarray` 作为input的另一数据集\\n\n    数据集输出的input为L通道的tensor对象\\n\n    output为ab通道的tensor对象（不再是3通道图片）\n    \"\"\"\n    def __init__(self, image_dataset: VisionDataset, image_transform=None):\n        \"\"\"\n        Args:\n            image_dataset (Dataset): 一个pytorch的图片Dataset.\n            image_transform (callable, optional): 可选的Transform\n        \"\"\"\n        self.image_dataset = image_dataset\n        if image_transform is None:\n            self.image_transform = transforms.ToTensor()\n        else:\n            self.image_transform = transforms.Compose([transforms.ToTensor(), image_transform])\n\n    def __len__(self):\n        return self.image_dataset.__len__()\n\n    def __getitem__(self, idx):\n        img, _ = self.image_dataset.__getitem__(idx)\n        # PIL图片转换成numpy数组\n        if isinstance(img, Image.Image):\n            img = np.array(img)\n        # 转换为lab色彩空间\n        img = cv2.cvtColor(img, cv2.COLOR_RGB2LAB)\n\n        # 转换为tensor，并进行处理\n        img = self.image_transform(img)\n        # 分离出l与ab通道\n        channel_l = img[0:1, ...]\n        channel_ab = img[1:3, ...]\n\n        return channel_l, channel_ab","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.401543Z","iopub.execute_input":"2022-05-23T14:04:20.402323Z","iopub.status.idle":"2022-05-23T14:04:20.411655Z","shell.execute_reply.started":"2022-05-23T14:04:20.402284Z","shell.execute_reply":"2022-05-23T14:04:20.410732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 数据加载","metadata":{}},{"cell_type":"code","source":"def img_set_from_folder(root, transform=None):\n    \"\"\"将目录里的所有图片转换成torch.utils.data.dataset\"\"\"\n    return torchvision.datasets.ImageFolder(root, transform)\n\n\ndef load_data(dataset, batch_size=1, shuffle=True, subset_indices=None, num_workers=0, pin_memory=False):\n    \"\"\"载入指定的 :class:`torch.utils.data.dataset` ，允许设定子集编号，载入部分\"\"\"\n    if subset_indices is not None:\n        subset = Subset(dataset, subset_indices)\n    else:\n        subset = dataset\n    return DataLoader(subset, batch_size, shuffle, num_workers=num_workers, pin_memory=pin_memory)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.439614Z","iopub.execute_input":"2022-05-23T14:04:20.43988Z","iopub.status.idle":"2022-05-23T14:04:20.446204Z","shell.execute_reply.started":"2022-05-23T14:04:20.439852Z","shell.execute_reply":"2022-05-23T14:04:20.445354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 数据集\n使用COCO ImageNet等的子集\n\n使用LabImageDataset载入Pytorch数据集，或者在必要时编写自己的Dataset","metadata":{}},{"cell_type":"markdown","source":"### ColorizationDataset","metadata":{}},{"cell_type":"code","source":"# From image\nclass ColorizationDataset(Dataset):\n    \"\"\"\n    将文件夹内的图片加载为数据集\n    \"\"\"\n    def __init__(self, image_root, image_transform=None, limit=None, seed=123):\n        \"\"\"\n        Args:\n            image_root (str): 只包含图片的文件夹路径.\n            image_transform (callable, optional): 可选的Transform\n            limit (int): 加载的最大数量限制\n            seed (int): 抽取的随机种子\n        \"\"\"\n        self.limit = limit\n        self.image_paths = []\n\n        import glob\n        self.paths = glob.glob(image_root + \"/*.jpg\") # Grabbing all the image file names\n\n        if limit is not None:\n            np.random.seed(seed)\n            self.paths = np.random.choice(self.paths, limit, replace=False)\n\n        if image_transform is None:\n            self.image_transform = transforms.ToTensor()\n        else:\n            self.image_transform = transforms.Compose([transforms.ToTensor(), image_transform])\n\n    def __getitem__(self, index):\n        image_path = self.paths[index]\n        img = cv2.imread(image_path)\n\n        # 转换为lab色彩空间\n        img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)\n\n        # 转换为tensor，并进行处理\n        img = self.image_transform(img)\n\n        # 分离出l与ab通道\n        channel_l = img[0:1, ...]\n        channel_ab = img[1:3, ...]\n\n        return channel_l, channel_ab\n\n    def __len__(self):\n        return len(self.paths)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.477748Z","iopub.execute_input":"2022-05-23T14:04:20.478141Z","iopub.status.idle":"2022-05-23T14:04:20.487619Z","shell.execute_reply.started":"2022-05-23T14:04:20.47811Z","shell.execute_reply":"2022-05-23T14:04:20.486932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 训练参数","metadata":{}},{"cell_type":"code","source":"# 参数\nepochs = 0\nbatch_size = 16\nG_in_channels = 1   # 输入L通道\nG_out_channels = 2  # 输入AB通道\nD_in_channels = 3   # 输入L+AB通道的拼接\n\n# 优化器参数\n# https://arxiv.org/pdf/1611.07004.pdf\n# 3.3节，第一段\nlr_G = 2e-4\nlr_D = 2e-4\nbeta1 = 0.5\nbeta2 = 0.999\nL1_Lambda = 100","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.514226Z","iopub.execute_input":"2022-05-23T14:04:20.51463Z","iopub.status.idle":"2022-05-23T14:04:20.51882Z","shell.execute_reply.started":"2022-05-23T14:04:20.5146Z","shell.execute_reply":"2022-05-23T14:04:20.518249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 数据载入与处理\n载入数据集，并进行归一化\n\n归一化有利于控制训练数值的范围\n\n注意：读取通道时需要将归一化的数据还原","metadata":{}},{"cell_type":"code","source":"# 单通道归一化参数\nnormalize_mean = (0.5,)\nnormalize_std = (0.5,)\nimage_size = 256","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.561137Z","iopub.execute_input":"2022-05-23T14:04:20.561564Z","iopub.status.idle":"2022-05-23T14:04:20.565124Z","shell.execute_reply.started":"2022-05-23T14:04:20.561533Z","shell.execute_reply":"2022-05-23T14:04:20.564518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 载入数据集\n# source_set = torchvision.datasets.CIFAR100(root=r\".\\dataset\", train=True, download=False)\n# train_set = LabImageDataset(source_set, transforms.Normalize(mean=normalize_mean * 3, std=normalize_std * 3))\n\n# 载入图片(路径, transform, 最大数量)\ntrain_set = ColorizationDataset('../input/coco-2017-dataset/coco2017/train2017', \n                                transforms.Compose([transforms.Normalize(mean=normalize_mean * 3, std=normalize_std * 3), \n                                                    transforms.Resize((image_size, image_size))]),\n                                100000)  # 载入前8000张图片\n\ntrain_data = load_data(train_set, batch_size=batch_size, num_workers=2, pin_memory=True)\n\n# val_set = ColorizationDataset('../input/coco-2017-dataset/coco2017/val2017', \n#                                 transforms.Compose([transforms.Normalize(mean=normalize_mean * 3, std=normalize_std * 3), \n#                                                     transforms.Resize((image_size, image_size))]),\n#                                 2000)  # 载入前2000张图片\n\n# val_data = load_data(val_set, batch_size=batch_size, num_workers=2, pin_memory=True)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:20.615088Z","iopub.execute_input":"2022-05-23T14:04:20.615529Z","iopub.status.idle":"2022-05-23T14:04:21.135844Z","shell.execute_reply.started":"2022-05-23T14:04:20.615497Z","shell.execute_reply":"2022-05-23T14:04:21.134717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 训练模型","metadata":{}},{"cell_type":"code","source":"def init_weights(mean, std):\n    def init(m):\n        if isinstance(m, nn.ConvTranspose2d) or isinstance(m, nn.Conv2d):\n            m.weight.data.normal_(mean, std)\n            if m.bias is not None:\n                m.bias.data.zero_()\n\n    return init\n\n# 训练设备\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# ====================模型====================\n\n# 这是DynamicUnet + Resnet18的实现\n# from fastai.vision.learner import create_body\n# from torchvision.models.resnet import resnet18\n# from fastai.vision.models.unet import DynamicUnet\n# def build_res_unet(n_input=1, n_output=2, size=256):\n#     device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n#     body = create_body(resnet18, pretrained=True, n_in=n_input, cut=-2)\n#     net_G = DynamicUnet(body, n_output, (size, size)).to(device)\n#     return net_G\n# G = build_res_unet(n_input=1, n_output=2, size=256)\n\n# 这是ResUnet的实现\n# Generator 1输入(L通道)，2输出（AB通道）64层开卷\nG = ResUnet(G_in_channels, G_out_channels)\n# Discriminator 3通道，64层开卷\nD = PatchDiscriminator(D_in_channels)\n\n# ====================初始化====================\nstart_epoch = 0\nG.apply(init_weights(mean=0.0, std=0.02))\nD.apply(init_weights(mean=0.0, std=0.02))\n#====================or继续====================\n# start_epoch = 40\n# G.load_state_dict(torch.load(r'../input/image-colorization-using-gan/netG_epoch_40.pth'))\n# D.load_state_dict(torch.load(r'../input/image-colorization-using-gan/netD_epoch_40.pth'))\n\n\nG: nn.Module = G.to(device)\nD: nn.Module = D.to(device)\nG.train()\nD.train()\n\n# 损失函数\nBCELossWithSigmoid = nn.BCEWithLogitsLoss().to(device)\nL1Loss = nn.L1Loss().to(device)\n\n# 优化器\noptG = optim.Adam(G.parameters(), lr=lr_G, betas=(beta1, beta2))\noptD = optim.Adam(D.parameters(), lr=lr_D, betas=(beta1, beta2))\n# 继续训练记得一并载入优化器\n# optG.load_state_dict(torch.load(r'../input/image-colorization-using-gan/optG_epoch_40.pth'))\n# optD.load_state_dict(torch.load(r'../input/image-colorization-using-gan/optD_epoch_40.pth'))\n\n# ====================训练====================\n# 记录\nwriter = SummaryWriter(\"logs_train\")\nfrom tqdm.notebook import tqdm\nfor epoch in range(start_epoch, epochs):\n    D_losses = []\n    G_losses = []\n\n    print(f'epoch {epoch} training')\n    \n    # 训练\n    G.train()\n    D.train()\n    for sample, truth in tqdm(train_data):\n        # 启用GPU\n        sample: torch.Tensor = sample.to(device)\n        truth: torch.Tensor = truth.to(device)\n            \n        # ====================鉴别器D的优化====================\n        # 论文中有说明，把输入x(sample)纳入鉴别器的计算，实际效果会更好\n        # 最大化 log(D(x, y)) + log(1 - D(x, G(x, z)))\n        # 值域为(-∞,0)，即还是使式子趋于0\n        # ===================================================\n        D.zero_grad()\n\n        # 对于正确的输出，鉴别器D应该接近1（真）时误差最小\n        D_pred = D(sample, truth).squeeze()\n        D_real_loss = BCELossWithSigmoid(D_pred, torch.ones(D_pred.size()).to(device))\n\n        # 对于伪造的输出，鉴别器D应该接近0（假）时误差最小\n        G_result = G(sample)\n        D_pred = D(sample, G_result.detach()).squeeze()  # G作为常量输入\n        D_fake_loss = BCELossWithSigmoid(D_pred, torch.zeros(D_pred.size()).to(device))\n\n        D_loss = (D_real_loss + D_fake_loss) * 0.5\n        D_loss.backward()\n        optD.step()\n\n        # print(D_loss.item())\n        D_losses.append(D_loss.item())\n        # ====================生成器G的优化====================\n        # 最小化 log(1 - D(x, G(x, z)))\n        # 即使上式趋于-∞，以扰乱判别器D\n        # 该项是D_loss的第二项，相当于增加D的误差\n        #\n        # 但是优化器只能往损失函数趋于0的方向优化，因此使用基本等价的下式：\n        # 最大化 log(D(x, G(x, z)))\n        # 值域为(-∞,0)，即还是使式子趋于0\n        # 对比D_loss的第一项log(D(x, y)\n        # 这相当于D把G生成的图片G(x, z)误判成真实图片y\n        # 借助G我们即可获得以假乱真的图片\n        # ===================================================\n        G.zero_grad()\n\n        D_pred = D(sample, G_result).squeeze()  # G作为变量输入\n\n        G_loss = BCELossWithSigmoid(D_pred, torch.ones(D_pred.size()).to(device)) + L1_Lambda * L1Loss(G_result, truth)\n        G_loss.backward()\n        optG.step()\n\n        # print(f'G loss: {G_loss.item()}')\n        G_losses.append(G_loss.item())\n    G_avg_loss = sum(G_losses) / len(G_losses)\n    D_avg_loss = sum(D_losses) / len(D_losses)\n\n    print(f'G loss(train) {G_avg_loss}')\n    print(f'D loss(train) {D_avg_loss}')\n    writer.add_scalar(\"train_G(train)\", G_avg_loss, epoch)\n    writer.add_scalar(\"train_D(train)\", D_avg_loss, epoch)\n    \n    # 校验\n#     print(f'epoch {epoch} validation')\n    \n#     D_losses = []\n#     G_losses = []\n#     G.eval()\n#     D.eval()\n#     with torch.no_grad():\n#         for sample, truth in tqdm(val_data):\n#             sample: torch.Tensor = sample.to(device)\n#             truth: torch.Tensor = truth.to(device)\n\n#             # D\n#             # 对于正确的输出，鉴别器D应该接近1（真）时误差最小\n#             D_pred = D(sample, truth).squeeze()\n#             D_real_loss = BCELossWithSigmoid(D_pred, torch.ones(D_pred.size()).to(device))\n\n#             # 对于伪造的输出，鉴别器D应该接近0（假）时误差最小\n#             G_result = G(sample)\n#             D_pred = D(sample, G_result.detach()).squeeze()  # G作为常量输入\n#             D_fake_loss = BCELossWithSigmoid(D_pred, torch.zeros(D_pred.size()).to(device))\n\n#             D_loss = (D_real_loss + D_fake_loss) * 0.5\n#             D_losses.append(D_loss.item())\n\n#             # G\n#             D_pred = D(sample, G_result).squeeze()  # G作为变量输入\n\n#             G_loss = BCELossWithSigmoid(D_pred, torch.ones(D_pred.size()).to(device)) + L1_Lambda * L1Loss(G_result, truth)\n#             G_losses.append(G_loss.item())\n        \n#     G_avg_loss = sum(G_losses) / len(G_losses)\n#     D_avg_loss = sum(D_losses) / len(D_losses)\n\n#     print(f'G loss(val) {G_avg_loss}')\n#     print(f'D loss(val) {D_avg_loss}')\n#     writer.add_scalar(\"train_G(val)\", G_avg_loss, epoch)\n#     writer.add_scalar(\"train_D(val)\", D_avg_loss, epoch)\n\n    # 保存模型\n    epoch_h = epoch + 1\n    if epoch_h > 0:\n        torch.save(G.state_dict(), 'netG_epoch_%d.pth' % epoch_h)\n        torch.save(D.state_dict(), 'netD_epoch_%d.pth' % epoch_h)\n\n        \n    # 最优保存\n#     if G_avg_loss < G_min_loss:\n#         print(f'loss in G:{G_avg_loss} is better than min loss {G_min_loss}')\n#         G_min_loss = G_avg_loss\n#         print(f'saving model as best...')\n#         torch.save(G.state_dict(), 'bestG_netG.pth')\n#         torch.save(D.state_dict(), 'bestG_netD.pth')\n\n\ntry:\n    # 保存优化器\n    torch.save(optG.state_dict(), 'optG_epoch_%d.pth' % epoch_h)\n    torch.save(optD.state_dict(), 'optD_epoch_%d.pth' % epoch_h)\n    time.sleep(5)\nexcept:\n    print(\"did not even train, nothing will be saved\")\n    pass","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:21.138067Z","iopub.execute_input":"2022-05-23T14:04:21.138608Z","iopub.status.idle":"2022-05-23T14:04:21.340498Z","shell.execute_reply.started":"2022-05-23T14:04:21.138559Z","shell.execute_reply":"2022-05-23T14:04:21.339667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def test(img_count, i, seed=123):\n    import numpy as np\n    import torch\n    from torchvision import transforms\n#     from scipy.misc import *\n    import cv2\n    import matplotlib.pyplot as plt\n\n    model_in_channels = 1  # 输入L通道\n    model_out_channels = 2  # 输入AB通道\n    image_size = 256 # 模型输出的图片大小\n    \n    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    \n    # 这里换成你的模型\n    model = ResUnet(G_in_channels, G_out_channels).to(device)\n    model.eval()\n    model.load_state_dict(torch.load(r'../input/image-colorization-using-gan/netG_epoch_'+str(i)+'.pth', map_location=device))\n    \n    # 选择测试的图片集合\n    # (路径， 变换， 数量， 随机种子=123)\n    test_set = ColorizationDataset('../input/coco-2017-dataset/coco2017/test2017', \n                                    transforms.Compose([transforms.Normalize(mean=normalize_mean * 3, std=normalize_std * 3), \n                                                        transforms.Resize((image_size, image_size))]),\n                                    img_count,\n                                    seed)\n    test_data = load_data(test_set, batch_size=1, num_workers=2, pin_memory=True, shuffle=False)\n\n    # 针对 mean=0.5, std=0.5 的反归一化\n    l_un_normalize_transform = transforms.Normalize(mean=-1.0, std=2.0)\n    ab_un_normalize_transform = transforms.Normalize(mean=(-1.0, -1.0), std=(2.0, 2.0))\n\n    \n    def concat_l_ab(l, ab):\n        img_lab = torch.cat([l, ab], dim=0)\n        img_lab = img_lab.cpu().permute(1, 2, 0).numpy() * 255\n        img_lab = np.rint(img_lab).astype(np.uint8)\n        return cv2.cvtColor(img_lab, cv2.COLOR_LAB2RGB)\n\n\n    with torch.no_grad():\n        for l, ab in test_data:\n            l = l.to(device)\n            ab = ab.to(device)\n            model_ab = model(l).squeeze()\n\n            l = l.squeeze(0)\n            ab = ab.squeeze(0)\n\n\n            l = l_un_normalize_transform(l)\n            model_ab = ab_un_normalize_transform(model_ab)\n            ab = ab_un_normalize_transform(ab)\n\n            # img_2 = torch.cat([l, G_ab], dim=0)\n            # img_2 = img_2.permute(1, 2, 0).numpy() * 255\n            # img_2 = np.rint(img_2).astype(np.uint8)\n            # img_2[:, :, [1, 2]] = 128\n            # img_2 = cv2.cvtColor(img_2, cv2.COLOR_LAB2BGR)\n            # cv2.imshow(\"img_gray\", img_2)\n\n    #         print(l.size())\n    #         print(ab.size())\n    #         print(G_ab.size())\n\n            imgs = []\n            # 预测图片\n            img = concat_l_ab(l, model_ab)\n            imgs.append(img)\n            # 标准图片\n            img = concat_l_ab(l, ab)\n            imgs.append(img)\n\n            # 输出图片，figsize为最终输出的大小\n            _, axes = plt.subplots(1, 2, figsize=(32, 32))\n            for ax, img in zip(axes.flatten(), imgs):\n                ax.imshow(img)\n                ax.axis(\"off\")\n\n# 调用函数输出，训练时注释掉这一句\n# (测试图数目，模型路径)\n# test(50, 44, 1)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T14:04:21.342129Z","iopub.execute_input":"2022-05-23T14:04:21.342631Z","iopub.status.idle":"2022-05-23T14:04:21.360121Z","shell.execute_reply.started":"2022-05-23T14:04:21.342586Z","shell.execute_reply":"2022-05-23T14:04:21.359488Z"},"trusted":true},"execution_count":null,"outputs":[]}]}