{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":21755,"databundleVersionId":1475600,"sourceType":"competition"},{"sourceId":10890076,"sourceType":"datasetVersion","datasetId":6767313},{"sourceId":10890083,"sourceType":"datasetVersion","datasetId":6767319},{"sourceId":272936,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":233655,"modelId":255374}],"dockerImageVersionId":30529,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# All CycleGANs Model and Compare","metadata":{"id":"j1zJlB1KMRgP"}},{"cell_type":"code","source":"import os\nimport random\nimport tensorflow as tf\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.keras.models import load_model\n\n# 1️⃣ Định nghĩa lớp InstanceNormalization\nclass InstanceNormalization(tf.keras.layers.Layer):\n    def __init__(self, epsilon=1e-5):\n        super(InstanceNormalization, self).__init__()\n        self.epsilon = epsilon\n\n    def build(self, input_shape):\n        self.scale = self.add_weight(\n            name='scale',\n            shape=input_shape[-1:],\n            initializer=tf.random_normal_initializer(1., 0.02),\n            trainable=True)\n        self.offset = self.add_weight(\n            name='offset',\n            shape=input_shape[-1:],\n            initializer='zeros',\n            trainable=True)\n\n    def call(self, x):\n        mean, variance = tf.nn.moments(x, axes=[1, 2], keepdims=True)\n        inv = tf.math.rsqrt(variance + self.epsilon)\n        normalized = (x - mean) * inv\n        return self.scale * normalized + self.offset\n\n# Định nghĩa custom_objects để load mô hình\ncustom_objects = {'InstanceNormalization': InstanceNormalization}\n\n# 2️⃣ Đường dẫn tới các model\nmodel_dir = '/kaggle/input/cycle-gans/keras/default/2' # change version model \nmodels_256 = [\n    '256-something-painter-43epoch-jpg.h5',\n    '256-ukiyoe2photo-v2-43epoch.h5',\n    '256-something-painter-43epoch-tfrec.h5'\n]\nmodels_512 = ['512-wikiart-monet-v1-20epoch-3000step.h5']\nmodels_1024 = ['1024-wikiart-monet-1024-v1-20epoch-1000step-1batchsize.h5']\n\n# Load các model\ngenerators_256 = [load_model(os.path.join(model_dir, model), custom_objects=custom_objects) for model in models_256]\ngenerator_512 = load_model(os.path.join(model_dir, models_512[0]), custom_objects=custom_objects)\ngenerator_1024 = load_model(os.path.join(model_dir, models_1024[0]), custom_objects=custom_objects)\n\n# 3️⃣ Đường dẫn tới các tập dữ liệu\ndataset_256 = '/kaggle/input/gan-getting-started/photo_jpg'\ndataset_512 = '/kaggle/input/landscape-pictures-512-v1/landscape_pictures_512_v1'\ndataset_1024 = '/kaggle/input/landscape-pictures-1024-v1/landscape_pictures_1024_v1'\n\n# 4️⃣ Hàm tiền xử lý ảnh đầu vào\ndef preprocess_image(image_path, target_size):\n    img = load_img(image_path, target_size=target_size)\n    img = img_to_array(img) / 127.5 - 1  # Chuẩn hóa về [-1, 1]\n    img = np.expand_dims(img, axis=0)  # Thêm batch dimension\n    return img\n\n# 5️⃣ Hàm tạo ảnh đã chuyển đổi phong cách\ndef generate_stylized_image(model, image_path, target_size):\n    input_img = preprocess_image(image_path, target_size)\n    generated_img = model.predict(input_img, verbose=0)[0]  # Dự đoán ảnh mới\n    generated_img = (generated_img + 1) / 2.0  # Chuyển về [0, 1] để hiển thị\n    return generated_img\n\n# 6️⃣ Hàm hiển thị ảnh gốc và các ảnh đã chuyển đổi\ndef display_images(original_path, transformed_images, model_names, target_size):\n    original_img = load_img(original_path, target_size=target_size)\n    num_images = len(transformed_images) + 1  # Số ảnh = ảnh gốc + các ảnh chuyển đổi\n    plt.figure(figsize=(5 * num_images, 5))\n    \n    # Hiển thị ảnh gốc\n    plt.subplot(1, num_images, 1)\n    plt.imshow(original_img)\n    plt.title(\"Ảnh gốc\")\n    plt.axis(\"off\")\n    \n    # Hiển thị các ảnh đã chuyển đổi\n    for i, (trans_img, model_name) in enumerate(zip(transformed_images, model_names)):\n        plt.subplot(1, num_images, i + 2)\n        plt.imshow(trans_img)\n        plt.title(model_name.replace('.h5', ''))  # Loại bỏ đuôi .h5 trong tiêu đề\n        plt.axis(\"off\")\n    plt.show()\n\n# 7️⃣ Hàm xử lý tập dữ liệu\ndef process_dataset(dataset_path, models, target_size):\n    image_files = os.listdir(dataset_path)\n    random.shuffle(image_files)  # Xáo trộn danh sách ảnh\n    selected_images = image_files[:10]  # Lấy 10 ảnh đầu tiên\n    for img_file in selected_images:\n        img_path = os.path.join(dataset_path, img_file)\n        transformed_images = []\n        model_names = []\n        # Áp dụng từng model tương ứng\n        for model, model_name in models:\n            trans_img = generate_stylized_image(model, img_path, (target_size, target_size))\n            transformed_images.append(trans_img)\n            model_names.append(model_name)\n        # Hiển thị kết quả\n        display_images(img_path, transformed_images, model_names, (target_size, target_size))\n\n# 8️⃣ Chuẩn bị danh sách model kèm tên cho từng tập dữ liệu\nmodels_256_with_names = [(model, name) for model, name in zip(generators_256, models_256)]\nmodels_512_with_names = [(generator_512, models_512[0])]\nmodels_1024_with_names = [(generator_1024, models_1024[0])]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:54:07.090044Z","iopub.execute_input":"2025-03-02T15:54:07.090474Z","iopub.status.idle":"2025-03-02T15:54:28.743218Z","shell.execute_reply.started":"2025-03-02T15:54:07.090441Z","shell.execute_reply":"2025-03-02T15:54:28.742020Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 9️⃣ Xử lý tập dữ liệu 256x256\nprint(\"Đang xử lý tập dữ liệu 256x256:\")\nprocess_dataset(dataset_256, models_256_with_names, 256)\n\n# 🔟 Xử lý tập dữ liệu 512x512\nprint(\"Đang xử lý tập dữ liệu 512x512:\")\nprocess_dataset(dataset_512, models_512_with_names, 512)\n\n# 🔟 Xử lý tập dữ liệu 1024x1024\nprint(\"Đang xử lý tập dữ liệu 1024x1024:\")\nprocess_dataset(dataset_1024, models_1024_with_names, 1024)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:55:07.106519Z","iopub.execute_input":"2025-03-02T15:55:07.107023Z","iopub.status.idle":"2025-03-02T15:56:20.046090Z","shell.execute_reply.started":"2025-03-02T15:55:07.106992Z","shell.execute_reply":"2025-03-02T15:56:20.044865Z"}},"outputs":[],"execution_count":null}]}