{"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":"### Imports","metadata":{}},{"cell_type":"code","source":"## image_resizer.py\n# Importing required libraries\nimport os\nimport numpy as np\nfrom PIL import Image\nfrom keras.layers import Input, Reshape, Dropout, Dense, Flatten, BatchNormalization, Activation, ZeroPadding2D\nfrom keras.layers import LeakyReLU\nfrom keras.layers.convolutional import UpSampling2D, Conv2D\nfrom keras.models import Sequential, Model, load_model\nfrom keras.optimizers import adam_v2\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Pre-processing","metadata":{}},{"cell_type":"code","source":"# Defining an image size and image channel\n# We are going to resize all our images to 128X128 size and since our images are colored images\n# We are setting our image channels to 3 (RGB)\n\nIMAGE_SIZE = 128\nIMAGE_CHANNELS = 3\nIMAGE_DIR = '/kaggle/input/dataset/'\n\n# Defining image dir path. Change this if you have different directory\nimages_path = IMAGE_DIR \n\ntraining_data = []\n\n# Iterating over the images inside the directory and resizing them using\n# Pillow's resize method.\nprint('resizing...')\n\nfor filename in os.listdir(images_path):\n    path = os.path.join(images_path, filename)\n    image = Image.open(path).resize((IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)\n\n    training_data.append(np.asarray(image))\n\ntraining_data = np.reshape(\n    training_data, (-1, IMAGE_SIZE, IMAGE_SIZE, IMAGE_CHANNELS))\ntraining_data = training_data / 127.5 - 1\n\nprint('saving file...')\nnp.save('/kaggle/working/cubism_data.npy', training_data)","metadata":{"execution":{"iopub.status.busy":"2022-11-29T14:13:07.543064Z","iopub.execute_input":"2022-11-29T14:13:07.543504Z","iopub.status.idle":"2022-11-29T14:13:10.027247Z","shell.execute_reply.started":"2022-11-29T14:13:07.543467Z","shell.execute_reply":"2022-11-29T14:13:10.025969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Config","metadata":{}},{"cell_type":"code","source":"# Preview image Frame\nPREVIEW_ROWS = 4\nPREVIEW_COLS = 7\nPREVIEW_MARGIN = 4\nSAVE_FREQ = 100\n# Size vector to generate images from\nNOISE_SIZE = 100\n# Configuration\nEPOCHS = 10000 # number of iterations\nBATCH_SIZE = 32\nGENERATE_RES = 3\nIMAGE_SIZE = 128 # rows/cols\nIMAGE_CHANNELS = 3\n\ntraining_data = np.load('/kaggle/working/cubism_data.npy')","metadata":{"execution":{"iopub.status.busy":"2022-11-29T14:23:39.893714Z","iopub.execute_input":"2022-11-29T14:23:39.894143Z","iopub.status.idle":"2022-11-29T14:23:39.963706Z","shell.execute_reply.started":"2022-11-29T14:23:39.894095Z","shell.execute_reply":"2022-11-29T14:23:39.962337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Discriminator","metadata":{}},{"cell_type":"code","source":"def build_discriminator(image_shape):\n    model = Sequential()\n    model.add(Conv2D(32, kernel_size=3, strides=2,\n    input_shape=image_shape, padding='same'))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    model.add(Conv2D(64, kernel_size=3, strides=2, padding='same'))\n    model.add(ZeroPadding2D(padding=((0, 1), (0, 1))))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    model.add(Conv2D(128, kernel_size=3, strides=2, padding='same'))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    model.add(Conv2D(256, kernel_size=3, strides=1, padding='same'))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    model.add(Conv2D(512, kernel_size=3, strides=1, padding='same'))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    model.add(Flatten())\n    model.add(Dense(1, activation='sigmoid'))\n    input_image = Input(shape=image_shape)\n    validity = model(input_image)\n    return Model(input_image, validity)","metadata":{"execution":{"iopub.status.busy":"2022-11-29T14:23:44.664288Z","iopub.execute_input":"2022-11-29T14:23:44.664682Z","iopub.status.idle":"2022-11-29T14:23:44.677057Z","shell.execute_reply.started":"2022-11-29T14:23:44.664651Z","shell.execute_reply":"2022-11-29T14:23:44.675798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Generator","metadata":{}},{"cell_type":"code","source":"def build_generator(noise_size, channels):\n    model = Sequential()\n    model.add(Dense(4 * 4 * 256, activation='relu',       input_dim=noise_size))\n    model.add(Reshape((4, 4, 256)))\n    model.add(UpSampling2D())\n    model.add(Conv2D(256, kernel_size=3, padding='same'))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(Activation('relu'))\n    model.add(UpSampling2D())\n    model.add(Conv2D(256, kernel_size=3, padding='same'))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(Activation('relu'))\n    for i in range(GENERATE_RES):\n         model.add(UpSampling2D())\n         model.add(Conv2D(256, kernel_size=3, padding='same'))\n         model.add(BatchNormalization(momentum=0.8))\n         model.add(Activation('relu'))\n    model.summary()\n    model.add(Conv2D(channels, kernel_size=3, padding='same'))\n    model.add(Activation('tanh'))\n    input = Input(shape=(noise_size,))\n    generated_image = model(input)\n    \n    return Model(input, generated_image)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-29T14:23:48.719177Z","iopub.execute_input":"2022-11-29T14:23:48.719575Z","iopub.status.idle":"2022-11-29T14:23:48.730254Z","shell.execute_reply.started":"2022-11-29T14:23:48.719535Z","shell.execute_reply":"2022-11-29T14:23:48.729144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Output Saving","metadata":{}},{"cell_type":"code","source":"def save_images(cnt, noise):\n    image_array = np.full((\n        PREVIEW_MARGIN + (PREVIEW_ROWS * (IMAGE_SIZE + PREVIEW_MARGIN)),\n        PREVIEW_MARGIN + (PREVIEW_COLS * (IMAGE_SIZE + PREVIEW_MARGIN)), 3),\n        255, dtype=np.uint8)\n    generated_images = generator.predict(noise)\n    generated_images = 0.5 * generated_images + 0.5\n    image_count = 0\n    for row in range(PREVIEW_ROWS):\n        for col in range(PREVIEW_COLS):\n            r = row * (IMAGE_SIZE + PREVIEW_MARGIN) + PREVIEW_MARGIN\n            c = col * (IMAGE_SIZE + PREVIEW_MARGIN) + PREVIEW_MARGIN\n            image_array[r:r + IMAGE_SIZE, c:c +\n                        IMAGE_SIZE] = generated_images[image_count] * 255\n            image_count += 1\n\n    output_path = '/kaggle/working/output'\n\n    if not os.path.exists(output_path):\n        os.makedirs(output_path)\n    filename = os.path.join(output_path, f\"trained-{cnt}.png\")\n    im = Image.fromarray(image_array)\n    im.save(filename)","metadata":{"execution":{"iopub.status.busy":"2022-11-29T14:23:52.473937Z","iopub.execute_input":"2022-11-29T14:23:52.475539Z","iopub.status.idle":"2022-11-29T14:23:52.486503Z","shell.execute_reply.started":"2022-11-29T14:23:52.475479Z","shell.execute_reply":"2022-11-29T14:23:52.485229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Train & Infer","metadata":{}},{"cell_type":"code","source":"image_shape = (IMAGE_SIZE, IMAGE_SIZE, IMAGE_CHANNELS)\noptimizer = adam_v2.Adam(1.5e-4, 0.5)\ndiscriminator = build_discriminator(image_shape)\ndiscriminator.compile(loss='binary_crossentropy',\noptimizer=optimizer, metrics=['accuracy'])\ngenerator = build_generator(NOISE_SIZE, IMAGE_CHANNELS)\nrandom_input = Input(shape=(NOISE_SIZE,))\ngenerated_image = generator(random_input)\ndiscriminator.trainable = False\nvalidity = discriminator(generated_image)\ncombined = Model(random_input, validity)\ncombined.compile(loss='binary_crossentropy',\noptimizer=optimizer, metrics=['accuracy'])\ny_real = np.ones((BATCH_SIZE, 1))\ny_fake = np.zeros((BATCH_SIZE, 1))\nfixed_noise = np.random.normal(0, 1, (PREVIEW_ROWS * PREVIEW_COLS, NOISE_SIZE))\ncnt = 1\nfor epoch in range(EPOCHS):\n    idx = np.random.randint(0, training_data.shape[0], BATCH_SIZE)\n    x_real = training_data[idx]\n\n    noise= np.random.normal(0, 1, (BATCH_SIZE, NOISE_SIZE))\n    x_fake = generator.predict(noise)\n\n    discriminator_metric_real = discriminator.train_on_batch(x_real, y_real)\n    discriminator_metric_generated = discriminator.train_on_batch(\n    x_fake, y_fake)\n\n    discriminator_metric = 0.5 * np.add(discriminator_metric_real, discriminator_metric_generated)\n    generator_metric = combined.train_on_batch(noise, y_real)\n    print(f'finished epoch {epoch}')\n    if epoch % SAVE_FREQ == 0:\n        save_images(cnt, fixed_noise)\n        cnt += 1\n\n        print(f'{epoch} epoch, Discriminator accuracy: {100*  discriminator_metric[1]}, Generator accuracy: {100 * generator_metric[1]}')","metadata":{"execution":{"iopub.status.busy":"2022-11-29T14:35:23.036013Z","iopub.execute_input":"2022-11-29T14:35:23.037342Z"},"trusted":true},"execution_count":null,"outputs":[]}]}