diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..9038d3495e1ebb40dc2f31bddc30937f522ccff6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 ivanovot + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/QuckDrawGAN/__init__.py b/QuckDrawGAN/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b687a42752e6c7bf1800c1397305eac28684901c --- /dev/null +++ b/QuckDrawGAN/__init__.py @@ -0,0 +1,2 @@ +from .train import train, discriminator_fine_tune +from .model import Model diff --git a/QuckDrawGAN/__pycache__/__init__.cpython-312.pyc b/QuckDrawGAN/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..372c56707e16f707b959ea96a711554eaf621cb8 Binary files /dev/null and b/QuckDrawGAN/__pycache__/__init__.cpython-312.pyc differ diff --git a/QuckDrawGAN/__pycache__/model.cpython-312.pyc b/QuckDrawGAN/__pycache__/model.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..068e7b3bf0e8d36cc45f1ac443ea8b7948f6080a Binary files /dev/null and b/QuckDrawGAN/__pycache__/model.cpython-312.pyc differ diff --git a/QuckDrawGAN/__pycache__/train.cpython-312.pyc b/QuckDrawGAN/__pycache__/train.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34901e0dab0d0ec951bd6d1ca68b85ff3eda125c Binary files /dev/null and b/QuckDrawGAN/__pycache__/train.cpython-312.pyc differ diff --git a/QuckDrawGAN/model.py b/QuckDrawGAN/model.py new file mode 100644 index 0000000000000000000000000000000000000000..75acd72b33da03f49142c7c19a2695723242ea47 --- /dev/null +++ b/QuckDrawGAN/model.py @@ -0,0 +1,89 @@ +import argparse +import torch +import numpy as np +import torchvision.utils as vutils +from .utils.models import Generator, Discriminator, latent_dim +import hashlib +from PIL import Image +import warnings +warnings.filterwarnings("ignore", category=RuntimeWarning) + + +class Model: + def __init__(self, generator_path, discriminator_path=None): + # Определяем устройство для выполнения (GPU или CPU) + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + # Инициализация и загрузка генератора + self.generator = Generator(latent_dim).to(self.device) + self.generator.load_state_dict(torch.load(generator_path, map_location=self.device, weights_only=True)) # Загружаем веса генератора + self.generator.eval() # Переводим генератор в режим оценки + + # Инициализация дискриминатора, если задан путь к его весам + if discriminator_path: + self.discriminator = Discriminator().to(self.device) + self.discriminator.load_state_dict(torch.load(discriminator_path, map_location=self.device, weights_only=True)) # Загружаем веса дискриминатора + self.discriminator.eval() # Переводим дискриминатор в режим оценки + else: + self.discriminator = None # Если дискриминатор не используется + + def generate(self, n=1, seed=None): + """Генерирует n изображений. Если дискриминатор загружен, возвращает изображение с наибольшей оценкой дискриминатора.""" + with torch.no_grad(): # Отключаем градиенты для режима оценки + # Установка сида для воспроизводимости, если задан + if seed is not None: + seed_number = int(hashlib.md5(seed.encode()).hexdigest(), 16) % (2**32) # Преобразуем текстовый сид в число + torch.manual_seed(seed_number) # Устанавливаем сид для генерации + + # Генерация случайного латентного вектора + z = torch.randn(n, latent_dim).to(self.device) + + # Генерация изображений + gen_imgs = self.generator(z) + + # Если дискриминатор загружен, выбираем изображение с наилучшей оценкой + if self.discriminator: + predictions = self.discriminator(gen_imgs).cpu().numpy().flatten() # Получаем оценки дискриминатора + max_pred_idx = predictions.argmax() # Находим индекс изображения с максимальной оценкой + best_img = gen_imgs[max_pred_idx].cpu().squeeze().numpy() # Преобразуем изображение в формат (H, W) + return best_img # Возвращаем лучшее изображение + else: + # Если дискриминатор не загружен, возвращаем первое сгенерированное изображение + return gen_imgs[0].cpu().squeeze().numpy() # Преобразуем изображение в формат (H, W) + +if __name__ == "__main__": + # Определение аргументов командной строки + parser = argparse.ArgumentParser(description="Generate image using pretrained GAN model") + parser.add_argument('--generator_path', type=str, required=True, help='Path to generator model weights') + parser.add_argument('--discriminator_path', type=str, help='Path to discriminator model weights (optional)') + parser.add_argument('--output_path', type=str, default='result.png', help='Path to save the generated image') + parser.add_argument('--n', type=int, default=1, help='Number of images to generate') + parser.add_argument('--seed', type=str, help='Seed for random generation (optional)') + + args = parser.parse_args() + + # Инициализация модели и генерация изображения + model = Model(args.generator_path, args.discriminator_path) + generated_image = model.generate(n=args.n, seed=args.seed) + + # Нормализация изображения + min_val = np.min(generated_image) + max_val = np.max(generated_image) + + # Применяем нормализацию + normalized_image = (generated_image - min_val) / (max_val - min_val) * 255 + + # Приводим к 8-битному формату + normalized_image = normalized_image.astype(np.uint8) + + # Проверяем размерность и преобразуем в RGB, если это необходимо + if normalized_image.ndim == 2: # Если изображение в градациях серого + # Преобразуем в RGB (64, 64) -> (64, 64, 3) + normalized_image = np.stack([normalized_image] * 3, axis=-1) + elif normalized_image.shape[2] == 1: # Если изображение с одним каналом + # Удаляем канал и преобразуем в RGB + normalized_image = np.squeeze(normalized_image, axis=2) + + # Создаем изображение в формате RGB + img = Image.fromarray(normalized_image, mode='RGB') + img.save(args.output_path) diff --git a/QuckDrawGAN/train.py b/QuckDrawGAN/train.py new file mode 100644 index 0000000000000000000000000000000000000000..21ffc6da5ffe174224645bfd0713d9b24ad2ba37 --- /dev/null +++ b/QuckDrawGAN/train.py @@ -0,0 +1,198 @@ +import argparse +import os +import logging +import random +import torch +import torch.optim as optim +import torch.nn as nn +import torchvision.utils as vutils +from torch.utils.data import DataLoader +from tqdm import tqdm +from .utils.models import Generator, Discriminator, latent_dim +from .utils.data import DrawDataset + + +def train(epochs, batch_size, data_path, output_path='output', lr_g=0.001, lr_d=0.002, data_max_size=None): + # Создание директорий для сохранения изображений и моделей + os.makedirs(os.path.join(output_path, 'images'), exist_ok=True) + os.makedirs(os.path.join(output_path, 'models'), exist_ok=True) + + # Инициализация логирования + log_file = os.path.join(output_path, 'training_logs.log') + with open(log_file, 'w'): + pass # Очищаем файл логов + logging.basicConfig(filename=log_file, level=logging.INFO, format='%(asctime)s - %(message)s') + + # Определение устройства для обучения + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + logging.info(f"Using device: {device}") + + logging.info("Loading dataset") + dataset = DrawDataset(data_path, data_max_size) + + # Инициализация генератора и дискриминатора + generator = Generator(latent_dim).to(device) + discriminator = Discriminator().to(device) + + # Оптимизаторы для генератора и дискриминатора + optimizer_G = optim.Adam(generator.parameters(), lr=lr_g, betas=(0.9, 0.999)) + optimizer_D = optim.Adam(discriminator.parameters(), lr=lr_d, betas=(0.9, 0.999)) + + # Функция потерь + adversarial_loss = nn.L1Loss() + + # Фиксированные векторы шума для генерации изображений в каждом эпохе + fix_z = torch.randn(64, latent_dim).to(device) + + # Загрузка данных + dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True, pin_memory=True) + + logging.info("Training started") + + # Основной цикл обучения + for epoch in range(epochs): + progress_bar = tqdm(dataloader, desc=f"Epoch [{epoch+1}/{epochs}]", bar_format='{l_bar}{bar:12}{r_bar}') + generator.train() + + for i, real_imgs in enumerate(progress_bar): + real_imgs = real_imgs.to(device) + batch_size = real_imgs.size(0) + + # Создание меток для реальных и поддельных изображений + valid_labels = torch.full((batch_size, 1), random.uniform(0.7, 1)).to(device) + fake_labels = torch.full((batch_size, 1), random.uniform(0, 0.3)).to(device) + + # Обновление дискриминатора + optimizer_D.zero_grad() + + # Генерация поддельных изображений + z = torch.randn(batch_size, latent_dim).to(device) + gen_imgs = generator(z) + + # Вычисление потерь для реальных и поддельных изображений + real_preds = discriminator(real_imgs) + fake_preds = discriminator(gen_imgs.detach()) + + loss_real = adversarial_loss(real_preds, valid_labels) + loss_fake = adversarial_loss(fake_preds, fake_labels) + + loss_D = loss_real + loss_fake + loss_D.backward() + optimizer_D.step() + + # Обновление генератора + optimizer_G.zero_grad() + + # Генерация новых поддельных изображений + gen_imgs = generator(z) + + # Потери генератора на основе предсказаний дискриминатора + fake_preds_for_gen = discriminator(gen_imgs) + loss_G = adversarial_loss(fake_preds_for_gen, valid_labels) + + loss_G.backward() + optimizer_G.step() + + # Обновление информации в прогресс-баре + progress_bar.set_postfix(Loss_D=loss_D.item(), Loss_G=loss_G.item()) + + # Логирование итогов эпохи + logging.info(f"Epoch [{epoch+1}/{epochs}], Loss_D: {loss_D.item():.4f}, Loss_G: {loss_G.item():.4f}") + + # Сохранение изображений и модели + with torch.no_grad(): + generator.eval() + gen_imgs = generator(fix_z) + vutils.save_image(gen_imgs.data, os.path.join(output_path, 'images', f'{epoch+1}.png'), nrow=8, normalize=True) + torch.save(generator.state_dict(), os.path.join(output_path, 'models', 'generator.pt')) + torch.save(discriminator.state_dict(), os.path.join(output_path, 'models', 'discriminator.pt')) + + +def discriminator_fine_tune(generator_file, discriminator_file, data_path, batch_size=64, fine_tune_epochs=10, lr_d=0.002, data_max_size=None): + # Определение устройства + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + logging.info(f"Using device: {device}") + + # Загрузка сохранённых моделей + generator = Generator(latent_dim).to(device) + discriminator = Discriminator().to(device) + generator.load_state_dict(torch.load(generator_file, map_location=device, weights_only=True)) + discriminator.load_state_dict(torch.load(discriminator_file, map_location=device, weights_only=True)) + + # Оптимизатор для дискриминатора + optimizer_D = optim.Adam(discriminator.parameters(), lr=lr_d, betas=(0.9, 0.999)) + adversarial_loss = nn.L1Loss() + + # Загрузка данных + dataset = DrawDataset(data_path, data_max_size) + fine_tune_dataloader = DataLoader(dataset, batch_size=batch_size//2, shuffle=True, pin_memory=True) + + logging.info(f"Fine-tuning discriminator for {fine_tune_epochs} epochs") + + for epoch in range(fine_tune_epochs): + progress_bar = tqdm(fine_tune_dataloader, desc=f"Fine-tuning Discriminator [{epoch+1}/{fine_tune_epochs}]", bar_format='{l_bar}{bar:12}{r_bar}') + discriminator.train() + + for i, real_imgs in enumerate(progress_bar): + real_imgs = real_imgs.to(device) + batch_size = real_imgs.size(0) + + # Создание меток для реальных и поддельных изображений + valid_labels = torch.full((batch_size, 1), random.uniform(0.7, 1)).to(device) + fake_labels = torch.full((batch_size // 2, 1), random.uniform(0, 0.3)).to(device) + + # Обновление дискриминатора + optimizer_D.zero_grad() + + # Генерация поддельных изображений + z = torch.randn(batch_size // 2, latent_dim).to(device) + gen_imgs = generator(z) + + # Потери для реальных и поддельных изображений + real_preds = discriminator(real_imgs) + fake_preds = discriminator(gen_imgs.detach()) + + loss_real = adversarial_loss(real_preds, valid_labels) + loss_fake = adversarial_loss(fake_preds, fake_labels) + + loss_D = loss_real + loss_fake + loss_D.backward() + optimizer_D.step() + + # Обновление информации в прогресс-баре + progress_bar.set_postfix(Loss_D=loss_D.item()) + + # Логирование результатов дообучения + logging.info(f"Fine-tune Epoch [{epoch+1}/{fine_tune_epochs}], Loss_D: {loss_D.item():.4f}") + + # Сохранение обновлённого дискриминатора + torch.save(discriminator.state_dict(), os.path.join(os.path.dirname(discriminator_file), 'discriminator_fine_tuned.pt')) + + +# Определение аргументов командной строки +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Train GAN model with specified parameters.") + + # Основные аргументы для функции train + parser.add_argument('--epochs', type=int, default=10, help='Number of epochs for training') + parser.add_argument('--batch_size', type=int, default=64, help='Batch size for training') + parser.add_argument('--data_path', type=str, required=True, help='Path to training data') + parser.add_argument('--output_path', type=str, default='output', help='Directory to save outputs') + parser.add_argument('--lr_g', type=float, default=0.001, help='Learning rate for generator') + parser.add_argument('--lr_d', type=float, default=0.002, help='Learning rate for discriminator') + parser.add_argument('--data_max_size', type=int, default=None, help='Maximum size of data to use') + + # Аргументы для дообучения дискриминатора + parser.add_argument('--fine_tune', action='store_true', help='Fine-tune discriminator') + parser.add_argument('--generator_file', type=str, help='Path to generator weights for fine-tuning') + parser.add_argument('--discriminator_file', type=str, help='Path to discriminator weights for fine-tuning') + parser.add_argument('--fine_tune_epochs', type=int, default=10, help='Number of epochs for fine-tuning discriminator') + + args = parser.parse_args() + + if args.fine_tune: + # Запуск функции дообучения дискриминатора + discriminator_fine_tune(args.generator_file, args.discriminator_file, args.data_path, args.batch_size, args.fine_tune_epochs, args.lr_d, args.data_max_size) + else: + # Запуск основной функции тренировки + train(args.epochs, args.batch_size, args.data_path, args.output_path, args.lr_g, args.lr_d, args.data_max_size) \ No newline at end of file diff --git a/QuckDrawGAN/utils/__pycache__/data.cpython-312.pyc b/QuckDrawGAN/utils/__pycache__/data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ada353e977eb52c935c8887fbf054629d2d7afdb Binary files /dev/null and b/QuckDrawGAN/utils/__pycache__/data.cpython-312.pyc differ diff --git a/QuckDrawGAN/utils/__pycache__/models.cpython-312.pyc b/QuckDrawGAN/utils/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d966cbbbc505dcc85904c78bfd80bcc467ccb468 Binary files /dev/null and b/QuckDrawGAN/utils/__pycache__/models.cpython-312.pyc differ diff --git a/QuckDrawGAN/utils/data.py b/QuckDrawGAN/utils/data.py new file mode 100644 index 0000000000000000000000000000000000000000..b4198bdf145c846b23231fccc02561bb7a5eebe6 --- /dev/null +++ b/QuckDrawGAN/utils/data.py @@ -0,0 +1,63 @@ +import torch +from torch.utils.data import Dataset +import pandas as pd +from PIL import Image, ImageDraw +import numpy as np + +class DrawDataset(Dataset): + def __init__(self, file_path, data_max_size=None): + # Загрузка данных из файла формата JSON + self.data = pd.read_json(file_path, lines=True) + # Отбор только распознанных рисунков + self.data = self.data[self.data['recognized'] == True] + # Ограничение размера набора данных, если указано + if data_max_size and len(self.data) > data_max_size: + self.data = self.data[:data_max_size] + + self.images = self.data['drawing'].values + self.processed_images = [] + + # Преобразование набора в изображения и нормализация + for raw_drawing in self.images: + img = self.stroke_to_image(raw_drawing) + img = np.array(img).astype(np.float32) / 255.0 # Нормализация изображения в диапазон [0, 1] + img = torch.from_numpy(img) # Преобразование в тензор PyTorch + self.processed_images.append(img.unsqueeze(0)) # Добавление оси канала (1, 64, 64) + + def stroke_to_image(self, raw_drawing): + # Коэффициенты для изменения размера изображения и его улучшения + scale_factor = 0.22 # Масштаб для уменьшения координат рисунков + upscale_factor = 8 # Коэффициент увеличения для получения плавных линий + original_size = 64 # Окончательный размер изображения + large_size = original_size * upscale_factor # Увеличенный размер для рисования линий + + # Преобразование координат линий с масштабированием и смещением + polylines = ( + zip([(x + 25) * scale_factor * upscale_factor for x in polyline[0]], + [(y + 25) * scale_factor * upscale_factor for y in polyline[1]]) + for polyline in raw_drawing if len(polyline) == 2 + ) + + # Преобразуем набор линий в список для последующего рисования + polylines_list = [list(polyline) for polyline in polylines] + + # Создание пустого увеличенного изображения + pil_img = Image.new("L", (large_size, large_size), 255) # Черно-белое изображение, белый фон + d = ImageDraw.Draw(pil_img) + + # Рисование линий с учетом масштабирования и увеличенной толщины + for polyline in polylines_list: + d.line(polyline, fill=0, width=int(1.5 * upscale_factor)) # Линии черного цвета + + # Масштабирование изображения обратно до 64x64 с использованием LANCZOS для сглаживания + pil_img = pil_img.resize((original_size, original_size), Image.Resampling.LANCZOS) + + return pil_img + + def __len__(self): + # Возвращает количество изображений в наборе данных + return len(self.images) + + def __getitem__(self, idx): + # Возвращает обработанное изображение по индексу + return self.processed_images[idx] diff --git a/QuckDrawGAN/utils/models.py b/QuckDrawGAN/utils/models.py new file mode 100644 index 0000000000000000000000000000000000000000..9054a961771d1220c10659cf66ec182aa354a087 --- /dev/null +++ b/QuckDrawGAN/utils/models.py @@ -0,0 +1,107 @@ +import torch.nn as nn + +latent_dim = 100 # Размерность латентного пространства (входного шума для генератора) + +# Класс генератора для генерации изображений из латентного пространства +class Generator(nn.Module): + def __init__(self, latent_dim): + super(Generator, self).__init__() + + # Размеры начального изображения и количество каналов для начала транспонированных операций + self.init_size = 4 # Размер изображения после первой линейной трансформации + self.start_channels = 512 # Количество каналов на первом этапе + + # Последовательная модель генератора + self.model = nn.Sequential( + # Линейное преобразование латентного вектора в развернутую форму для дальнейшего увеличения + nn.Linear(latent_dim, self.start_channels * self.init_size ** 2), + nn.BatchNorm1d(self.start_channels * self.init_size ** 2, 0.8), + nn.LeakyReLU(0.2, inplace=True), + + # Преобразование в 4D тензор для начала операций с изображениями + nn.Unflatten(1, (self.start_channels, self.init_size, self.init_size)), + + # Начало операций с изображением (увеличение размера) + nn.Upsample(scale_factor=2), # Увеличение размера изображения в 2 раза + + # Сверточные слои с уменьшением количества каналов и последующими нелинейностями + nn.Conv2d(self.start_channels, self.start_channels // 3, 3, stride=1, padding=1), + nn.BatchNorm2d(self.start_channels // 3, 0.8), + nn.LeakyReLU(0.2, inplace=True), + + nn.Upsample(scale_factor=2), # Еще одно увеличение + + nn.Conv2d(self.start_channels // 3, self.start_channels // 4, 3, stride=1, padding=1), + nn.BatchNorm2d(self.start_channels // 4, 0.8), + nn.LeakyReLU(0.2, inplace=True), + + nn.Upsample(scale_factor=2), # Третье увеличение + + nn.Conv2d(self.start_channels // 4, self.start_channels // 6, 3, stride=1, padding=1), + nn.BatchNorm2d(self.start_channels // 6, 0.8), + nn.LeakyReLU(0.2, inplace=True), + + nn.Upsample(scale_factor=2), # Четвертое увеличение + + nn.Conv2d(self.start_channels // 6, self.start_channels // 8, 3, stride=1, padding=1), + nn.BatchNorm2d(self.start_channels // 8, 0.8), + nn.LeakyReLU(0.2, inplace=True), + + # Последний сверточный слой для вывода изображения размером 1xWxH с функцией активации Тангенс + nn.Conv2d(self.start_channels // 8, 1, 3, stride=1, padding=1), + nn.Tanh() # Приведение значений пикселей в диапазон [-1, 1] + ) + + def forward(self, z): + # Прямое распространение через сеть генератора + out = self.model(z) + return out # Возвращаем сгенерированное изображение + + +# Класс дискриминатора для различения реальных и сгенерированных изображений +class Discriminator(nn.Module): + def __init__(self): + super(Discriminator, self).__init__() + + # Последовательная модель дискриминатора + self.model = nn.Sequential( + # Первый сверточный блок + nn.Conv2d(1, 64, 3, stride=2, padding=1), # Уменьшает размер изображения до (64, 32, 32) + nn.BatchNorm2d(64, 0.8), + nn.LeakyReLU(0.2, inplace=True), + nn.Dropout(0.3), # Вероятность выключения нейронов для регуляризации + + # Второй сверточный блок + nn.Conv2d(64, 128, 3, stride=2, padding=1), # Уменьшает размер до (128, 16, 16) + nn.BatchNorm2d(128, 0.8), + nn.LeakyReLU(0.2, inplace=True), + nn.Dropout(0.3), + + # Третий сверточный блок + nn.Conv2d(128, 256, 3, stride=2, padding=1), # Уменьшает размер до (256, 8, 8) + nn.BatchNorm2d(256, 0.8), + nn.LeakyReLU(0.2, inplace=True), + nn.Dropout(0.3), + + # Четвертый сверточный блок + nn.Conv2d(256, 256, 3, stride=1, padding=1), # Поддерживает размер (256, 8, 8) + nn.BatchNorm2d(256, 0.8), + nn.LeakyReLU(0.2, inplace=True), + nn.MaxPool2d(2), # Уменьшает размер до (256, 4, 4) + nn.Dropout(0.3), + + # Пятый сверточный блок + nn.Conv2d(256, 512, 3, stride=1, padding=1), # Уменьшает размер до (512, 2, 2) + nn.BatchNorm2d(512, 0.8), + nn.LeakyReLU(0.2, inplace=True), + nn.MaxPool2d(2), # Размер до (512, 1, 1) + + # Преобразование в плоский вектор для классификации + nn.Flatten(), # Преобразует изображение в вектор (512 * 2 * 2 = 2048) + nn.Linear(512 * 2 * 2, 1) # Полносвязный слой для получения одного скалярного выхода + ) + + def forward(self, img): + # Прямое распространение через сеть дискриминатора + out = self.model(img) + return out # Возвращаем вероятность принадлежности к классу "реальное" или "сгенерированное" diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..7f59e37bd2c34cb003daea03bdf8b32613e67bb6 --- /dev/null +++ b/app.py @@ -0,0 +1,71 @@ +import gradio as gr +import QuckDrawGAN as qd +import numpy as np +from PIL import Image + +# Загрузим модель +generator_file = r'pretrained_output/models/generator.pt' +discriminator_file = r'pretrained_output/models/discriminator_fine_tuned.pt' + +# Создаем объект модели +model = qd.Model(generator_file, discriminator_file) + +# Функция для генерации изображения с учетом сида, нормализацией и изменением размера +def generate_image(n_images=16, seed=""): + # Если сид не задан, не передаем его в модель + if seed == "": + seed = None + best_image = model.generate(n_images, seed) # Генерация с учетом сида + + # Нормализация: находим минимум и максимум в изображении + best_image_min = np.min(best_image) + best_image_max = np.max(best_image) + + # Нормализуем изображение, чтобы значения были в диапазоне от 0 до 255 + normalized_image = 255 * (best_image - best_image_min) / (best_image_max - best_image_min) + + # Преобразуем изображение в формат, подходящий для отображения + pil_image = Image.fromarray(normalized_image.astype(np.uint8)) # Преобразуем в uint8 для отображения + pil_image = pil_image.resize((256, 256), Image.Resampling.LANCZOS) # Ресайз изображения до 256x256 + + return pil_image + +# Создаем интерфейс Gradio с помощью Blocks (для большей гибкости) +with gr.Blocks() as interface: + gr.Markdown("# Генератор изображений с использованием QuckDrawGAN") + gr.Markdown("Этот интерфейс позволяет генерировать изображения с помощью модели QuckDrawGAN. Настройте количество генерируемых изображений и задайте сид для повторяемости.") + + with gr.Row(): + # Блок для изображения сверху + generated_image = gr.Image(type="pil", label="Сгенерированное изображение", elem_id="generated_image", scale=2) # Увеличиваем масштаб изображения + + with gr.Row(): + # Блок параметров и кнопки + with gr.Column(): + seed_input = gr.Textbox(value="", label="Сид (опционально)", interactive=True) + num_images = gr.Slider(minimum=1, maximum=1024, value=16, label="Количество изображений для генерации", interactive=True, step=1) + + # Кнопка генерации изображения справа + generate_button = gr.Button("Сгенерировать") + + # Логика для автогенерации при изменении параметров + seed_input.change(generate_image, inputs=[num_images, seed_input], outputs=generated_image) + num_images.change(generate_image, inputs=[num_images, seed_input], outputs=generated_image) + + # Логика для кнопки генерации + generate_button.click(generate_image, inputs=[num_images, seed_input], outputs=generated_image) + + # Автогенерация при старте + interface.load(generate_image, inputs=[num_images, seed_input], outputs=generated_image) + + # Стилизация блока изображения (увеличение размера блока) + interface.css = """ + #generated_image { + width: 400px; + height: 400px; + margin-top: 20px; + } + """ + +# Запуск интерфейса +interface.launch() diff --git a/pretrained_output/images/1.png b/pretrained_output/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a05059e697293f315bc978052e46d35855e6fbeb Binary files /dev/null and b/pretrained_output/images/1.png differ diff --git a/pretrained_output/images/10.png b/pretrained_output/images/10.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ab7a5fc1108e51b160fca4854ceb111c149caa Binary files /dev/null and b/pretrained_output/images/10.png differ diff --git a/pretrained_output/images/100.png b/pretrained_output/images/100.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1a54522a092701a93ae9c584dfa7b65c5afd6a Binary files /dev/null and b/pretrained_output/images/100.png differ diff --git a/pretrained_output/images/11.png b/pretrained_output/images/11.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1bc1036371d07842239f6134ae84ea00364d39 Binary files /dev/null and b/pretrained_output/images/11.png differ diff --git a/pretrained_output/images/12.png b/pretrained_output/images/12.png new file mode 100644 index 0000000000000000000000000000000000000000..a37a992f5eaf4ae7da474afd3f3f25d11fbef58a Binary files /dev/null and b/pretrained_output/images/12.png differ diff --git a/pretrained_output/images/13.png b/pretrained_output/images/13.png new file mode 100644 index 0000000000000000000000000000000000000000..5288f3b123b175baf6a3ba4b0a9d28c9d49baca0 Binary files /dev/null and b/pretrained_output/images/13.png differ diff --git a/pretrained_output/images/14.png b/pretrained_output/images/14.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc84687c7ea758bd384ff823c47e6e2ef3c7c41 Binary files /dev/null and b/pretrained_output/images/14.png differ diff --git a/pretrained_output/images/15.png b/pretrained_output/images/15.png new file mode 100644 index 0000000000000000000000000000000000000000..2cff2d1b8ccfba5f9af614592f6f9ae1a812791b Binary files /dev/null and b/pretrained_output/images/15.png differ diff --git a/pretrained_output/images/16.png b/pretrained_output/images/16.png new file mode 100644 index 0000000000000000000000000000000000000000..a5142cac322698e6558c972a82433ccfa18d73ee Binary files /dev/null and b/pretrained_output/images/16.png differ diff --git a/pretrained_output/images/17.png b/pretrained_output/images/17.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f795d9e02db03292978384b57b3b4f61f33614 Binary files /dev/null and b/pretrained_output/images/17.png differ diff --git a/pretrained_output/images/18.png b/pretrained_output/images/18.png new file mode 100644 index 0000000000000000000000000000000000000000..96cb691f4f8030a9a989cccadaef072d63f2cd22 Binary files /dev/null and b/pretrained_output/images/18.png differ diff --git a/pretrained_output/images/19.png b/pretrained_output/images/19.png new file mode 100644 index 0000000000000000000000000000000000000000..8e25b2c80916292af6489ad27c87b24f3b6b7754 Binary files /dev/null and b/pretrained_output/images/19.png differ diff --git a/pretrained_output/images/2.png b/pretrained_output/images/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b15a6a211eee20cb33e0f03126b81ac9d031388a Binary files /dev/null and b/pretrained_output/images/2.png differ diff --git a/pretrained_output/images/20.png b/pretrained_output/images/20.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e98ce3b011957d54782fd0482ada725d3c5e0d Binary files /dev/null and b/pretrained_output/images/20.png differ diff --git a/pretrained_output/images/21.png b/pretrained_output/images/21.png new file mode 100644 index 0000000000000000000000000000000000000000..d4592f77581352f4be9a31d071fc1ec4fdcdba3a Binary files /dev/null and b/pretrained_output/images/21.png differ diff --git a/pretrained_output/images/22.png b/pretrained_output/images/22.png new file mode 100644 index 0000000000000000000000000000000000000000..9d972850970ed14cadc2066d6ef93ff71837fb8a Binary files /dev/null and b/pretrained_output/images/22.png differ diff --git a/pretrained_output/images/23.png b/pretrained_output/images/23.png new file mode 100644 index 0000000000000000000000000000000000000000..f770cc663a6606be3e657aadff271125ddf0eb24 Binary files /dev/null and b/pretrained_output/images/23.png differ diff --git a/pretrained_output/images/24.png b/pretrained_output/images/24.png new file mode 100644 index 0000000000000000000000000000000000000000..21325e555e6d804aa4b9940fb3e85c139f32ca2f Binary files /dev/null and b/pretrained_output/images/24.png differ diff --git a/pretrained_output/images/25.png b/pretrained_output/images/25.png new file mode 100644 index 0000000000000000000000000000000000000000..356504b7953d1de0295af525f53ec968b889716b Binary files /dev/null and b/pretrained_output/images/25.png differ diff --git a/pretrained_output/images/26.png b/pretrained_output/images/26.png new file mode 100644 index 0000000000000000000000000000000000000000..517c3ab6b4bce60b317f9c5363a4b01f5e6b9a83 Binary files /dev/null and b/pretrained_output/images/26.png differ diff --git a/pretrained_output/images/27.png b/pretrained_output/images/27.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba3a03a412e52042d6794656f2522a9a4b5c434 Binary files /dev/null and b/pretrained_output/images/27.png differ diff --git a/pretrained_output/images/28.png b/pretrained_output/images/28.png new file mode 100644 index 0000000000000000000000000000000000000000..b3910b0c068b5175bb6e62eb182e3d2c18a29c78 Binary files /dev/null and b/pretrained_output/images/28.png differ diff --git a/pretrained_output/images/29.png b/pretrained_output/images/29.png new file mode 100644 index 0000000000000000000000000000000000000000..6905ea277579b09ab350dacc477037d65503e6aa Binary files /dev/null and b/pretrained_output/images/29.png differ diff --git a/pretrained_output/images/3.png b/pretrained_output/images/3.png new file mode 100644 index 0000000000000000000000000000000000000000..08d408b16108a1ec9fdc90a1cf7aa3030ecbe96a Binary files /dev/null and b/pretrained_output/images/3.png differ diff --git a/pretrained_output/images/30.png b/pretrained_output/images/30.png new file mode 100644 index 0000000000000000000000000000000000000000..4efa7f4b19a8d4c505baf9cf25d845399c3f7439 Binary files /dev/null and b/pretrained_output/images/30.png differ diff --git a/pretrained_output/images/31.png b/pretrained_output/images/31.png new file mode 100644 index 0000000000000000000000000000000000000000..51851668d66a792bed88214abd74fcc887f7d22f Binary files /dev/null and b/pretrained_output/images/31.png differ diff --git a/pretrained_output/images/32.png b/pretrained_output/images/32.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff837f1001b44b3c58416be9a882f38985d5662 Binary files /dev/null and b/pretrained_output/images/32.png differ diff --git a/pretrained_output/images/33.png b/pretrained_output/images/33.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9a831dacd00aa500db4097597dcc9f16095743 Binary files /dev/null and b/pretrained_output/images/33.png differ diff --git a/pretrained_output/images/34.png b/pretrained_output/images/34.png new file mode 100644 index 0000000000000000000000000000000000000000..54de11df72698f80b51c07706119d1b9ef65baca Binary files /dev/null and b/pretrained_output/images/34.png differ diff --git a/pretrained_output/images/35.png b/pretrained_output/images/35.png new file mode 100644 index 0000000000000000000000000000000000000000..7b90a999d7506bda262c166fe2d07c69c62c08c1 Binary files /dev/null and b/pretrained_output/images/35.png differ diff --git a/pretrained_output/images/36.png b/pretrained_output/images/36.png new file mode 100644 index 0000000000000000000000000000000000000000..26c8f58764f8bd136f3275497ce0025f671e0271 Binary files /dev/null and b/pretrained_output/images/36.png differ diff --git a/pretrained_output/images/37.png b/pretrained_output/images/37.png new file mode 100644 index 0000000000000000000000000000000000000000..b82a349cd34af5a82bc64c85dd608d4d305d7ddf Binary files /dev/null and b/pretrained_output/images/37.png differ diff --git a/pretrained_output/images/38.png b/pretrained_output/images/38.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3c0a1b6f1696262e29d2098a4fc09da7ace07c Binary files /dev/null and b/pretrained_output/images/38.png differ diff --git a/pretrained_output/images/39.png b/pretrained_output/images/39.png new file mode 100644 index 0000000000000000000000000000000000000000..f443b9efe83ae36400c4ce1b5d4a1fef8658b94f Binary files /dev/null and b/pretrained_output/images/39.png differ diff --git a/pretrained_output/images/4.png b/pretrained_output/images/4.png new file mode 100644 index 0000000000000000000000000000000000000000..1937a7ba0c6258602b0d10a83a63579f39307f7a Binary files /dev/null and b/pretrained_output/images/4.png differ diff --git a/pretrained_output/images/40.png b/pretrained_output/images/40.png new file mode 100644 index 0000000000000000000000000000000000000000..99eba61970fbc988b7d54ff6ca8608e1fae97c2d Binary files /dev/null and b/pretrained_output/images/40.png differ diff --git a/pretrained_output/images/41.png b/pretrained_output/images/41.png new file mode 100644 index 0000000000000000000000000000000000000000..0efbc4e6faa0fd1306d06e8b1b4fecd6621cc71c Binary files /dev/null and b/pretrained_output/images/41.png differ diff --git a/pretrained_output/images/42.png b/pretrained_output/images/42.png new file mode 100644 index 0000000000000000000000000000000000000000..2c909d8f6ca44f04fe26266ba12e37d77a4cd7f4 Binary files /dev/null and b/pretrained_output/images/42.png differ diff --git a/pretrained_output/images/43.png b/pretrained_output/images/43.png new file mode 100644 index 0000000000000000000000000000000000000000..99adf84700de1dba8ac98de3cf1281f98f585920 Binary files /dev/null and b/pretrained_output/images/43.png differ diff --git a/pretrained_output/images/44.png b/pretrained_output/images/44.png new file mode 100644 index 0000000000000000000000000000000000000000..7df4d1c68439a27f8a14cfa417ba35e986bb204e Binary files /dev/null and b/pretrained_output/images/44.png differ diff --git a/pretrained_output/images/45.png b/pretrained_output/images/45.png new file mode 100644 index 0000000000000000000000000000000000000000..106e1ada26dcbcc92e1bacf8175eda02944268d5 Binary files /dev/null and b/pretrained_output/images/45.png differ diff --git a/pretrained_output/images/46.png b/pretrained_output/images/46.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab6dbeee2b0b239dba8c0f21c9c9708890235a0 Binary files /dev/null and b/pretrained_output/images/46.png differ diff --git a/pretrained_output/images/47.png b/pretrained_output/images/47.png new file mode 100644 index 0000000000000000000000000000000000000000..2d381a171c319e6110671baf01b3a39620df8246 Binary files /dev/null and b/pretrained_output/images/47.png differ diff --git a/pretrained_output/images/48.png b/pretrained_output/images/48.png new file mode 100644 index 0000000000000000000000000000000000000000..237640d828cf6ef690802667133874668f7e4c40 Binary files /dev/null and b/pretrained_output/images/48.png differ diff --git a/pretrained_output/images/49.png b/pretrained_output/images/49.png new file mode 100644 index 0000000000000000000000000000000000000000..e87d3848c3041178b9463c85308cac89c7df25fc Binary files /dev/null and b/pretrained_output/images/49.png differ diff --git a/pretrained_output/images/5.png b/pretrained_output/images/5.png new file mode 100644 index 0000000000000000000000000000000000000000..a68ff2cc8b40e090b658cb9857144dbcc6cb8c31 Binary files /dev/null and b/pretrained_output/images/5.png differ diff --git a/pretrained_output/images/50.png b/pretrained_output/images/50.png new file mode 100644 index 0000000000000000000000000000000000000000..e22295b2b424a69594fec017e5ea47ba05a4f97c Binary files /dev/null and b/pretrained_output/images/50.png differ diff --git a/pretrained_output/images/51.png b/pretrained_output/images/51.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8e40143db197067905fd7277fb89cd3ce26a68 Binary files /dev/null and b/pretrained_output/images/51.png differ diff --git a/pretrained_output/images/52.png b/pretrained_output/images/52.png new file mode 100644 index 0000000000000000000000000000000000000000..64f3bcd5f83f3038cb87cf9f00393ca2cd31f4af Binary files /dev/null and b/pretrained_output/images/52.png differ diff --git a/pretrained_output/images/53.png b/pretrained_output/images/53.png new file mode 100644 index 0000000000000000000000000000000000000000..34947302fc845b26b12c50261b4fee048910073a Binary files /dev/null and b/pretrained_output/images/53.png differ diff --git a/pretrained_output/images/54.png b/pretrained_output/images/54.png new file mode 100644 index 0000000000000000000000000000000000000000..d83c47370bf58df224c883cb3fdac6a0a904fa8d Binary files /dev/null and b/pretrained_output/images/54.png differ diff --git a/pretrained_output/images/55.png b/pretrained_output/images/55.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1f1fc335bae66fe2644e407e664a4f01a39e3c Binary files /dev/null and b/pretrained_output/images/55.png differ diff --git a/pretrained_output/images/56.png b/pretrained_output/images/56.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7622bf7960edccd616dafe7e544f8f3456148f Binary files /dev/null and b/pretrained_output/images/56.png differ diff --git a/pretrained_output/images/57.png b/pretrained_output/images/57.png new file mode 100644 index 0000000000000000000000000000000000000000..577931a69a9c8643e81f38129cab966eda476a3e Binary files /dev/null and b/pretrained_output/images/57.png differ diff --git a/pretrained_output/images/58.png b/pretrained_output/images/58.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb31e0f7c4df74b30de958f1eba358695b97083 Binary files /dev/null and b/pretrained_output/images/58.png differ diff --git a/pretrained_output/images/59.png b/pretrained_output/images/59.png new file mode 100644 index 0000000000000000000000000000000000000000..efadfb70d9ea222c84e26847078ac28360c60ad8 Binary files /dev/null and b/pretrained_output/images/59.png differ diff --git a/pretrained_output/images/6.png b/pretrained_output/images/6.png new file mode 100644 index 0000000000000000000000000000000000000000..109b79982b47d52ecc2de926d6dfd4a290afea04 Binary files /dev/null and b/pretrained_output/images/6.png differ diff --git a/pretrained_output/images/60.png b/pretrained_output/images/60.png new file mode 100644 index 0000000000000000000000000000000000000000..cf894ce5afadc8429d4988462d45dce67f83af44 Binary files /dev/null and b/pretrained_output/images/60.png differ diff --git a/pretrained_output/images/61.png b/pretrained_output/images/61.png new file mode 100644 index 0000000000000000000000000000000000000000..953e2dd8950abf25f2d390778e978dccd39a7769 Binary files /dev/null and b/pretrained_output/images/61.png differ diff --git a/pretrained_output/images/62.png b/pretrained_output/images/62.png new file mode 100644 index 0000000000000000000000000000000000000000..53ff678f06263a4834be94ca11ca4571d104429f Binary files /dev/null and b/pretrained_output/images/62.png differ diff --git a/pretrained_output/images/63.png b/pretrained_output/images/63.png new file mode 100644 index 0000000000000000000000000000000000000000..818e6c9391652d68e3e734528374b5f0f3b5cea9 Binary files /dev/null and b/pretrained_output/images/63.png differ diff --git a/pretrained_output/images/64.png b/pretrained_output/images/64.png new file mode 100644 index 0000000000000000000000000000000000000000..05abef31330f52f63336446dabcebd293bd17f79 Binary files /dev/null and b/pretrained_output/images/64.png differ diff --git a/pretrained_output/images/65.png b/pretrained_output/images/65.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5c102add5ec90e4b0c2f42d0198d51996efd28 Binary files /dev/null and b/pretrained_output/images/65.png differ diff --git a/pretrained_output/images/66.png b/pretrained_output/images/66.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b22ccb52d1b6375322bbf3b54e92d64fc4214e Binary files /dev/null and b/pretrained_output/images/66.png differ diff --git a/pretrained_output/images/67.png b/pretrained_output/images/67.png new file mode 100644 index 0000000000000000000000000000000000000000..746a8749110bbae67414edd606b032b746b9458e Binary files /dev/null and b/pretrained_output/images/67.png differ diff --git a/pretrained_output/images/68.png b/pretrained_output/images/68.png new file mode 100644 index 0000000000000000000000000000000000000000..aaecfb458a5e804298a09d83a81ee5648cf7731d Binary files /dev/null and b/pretrained_output/images/68.png differ diff --git a/pretrained_output/images/69.png b/pretrained_output/images/69.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9a70f11a61c0ccd7fd5cc1cf6891494bf396a4 Binary files /dev/null and b/pretrained_output/images/69.png differ diff --git a/pretrained_output/images/7.png b/pretrained_output/images/7.png new file mode 100644 index 0000000000000000000000000000000000000000..3afc9f7ba968da8525c94a588bbfa13d34ddc8e3 Binary files /dev/null and b/pretrained_output/images/7.png differ diff --git a/pretrained_output/images/70.png b/pretrained_output/images/70.png new file mode 100644 index 0000000000000000000000000000000000000000..1e71d8af6f90e4cc06df8d284c60fa324bb8df61 Binary files /dev/null and b/pretrained_output/images/70.png differ diff --git a/pretrained_output/images/71.png b/pretrained_output/images/71.png new file mode 100644 index 0000000000000000000000000000000000000000..9897cb1e46ab0dd297f00438f2fd5ce4e657dbe2 Binary files /dev/null and b/pretrained_output/images/71.png differ diff --git a/pretrained_output/images/72.png b/pretrained_output/images/72.png new file mode 100644 index 0000000000000000000000000000000000000000..6179907b7f24754871a009cbd962b826520a30de Binary files /dev/null and b/pretrained_output/images/72.png differ diff --git a/pretrained_output/images/73.png b/pretrained_output/images/73.png new file mode 100644 index 0000000000000000000000000000000000000000..0babce739dca4c496b15cff30d3a42781d24c556 Binary files /dev/null and b/pretrained_output/images/73.png differ diff --git a/pretrained_output/images/74.png b/pretrained_output/images/74.png new file mode 100644 index 0000000000000000000000000000000000000000..a2973e3eb8d5444a8202f1a0fab8b7f77d3180bb Binary files /dev/null and b/pretrained_output/images/74.png differ diff --git a/pretrained_output/images/75.png b/pretrained_output/images/75.png new file mode 100644 index 0000000000000000000000000000000000000000..285c4d06c5c52a6fc4c6e99344c31056b1486568 Binary files /dev/null and b/pretrained_output/images/75.png differ diff --git a/pretrained_output/images/76.png b/pretrained_output/images/76.png new file mode 100644 index 0000000000000000000000000000000000000000..4f63a0647bce01c8b6939958c64cb9d44501ceb7 Binary files /dev/null and b/pretrained_output/images/76.png differ diff --git a/pretrained_output/images/77.png b/pretrained_output/images/77.png new file mode 100644 index 0000000000000000000000000000000000000000..a28df03a81c374420f24ad4c7d3d6a06a58de777 Binary files /dev/null and b/pretrained_output/images/77.png differ diff --git a/pretrained_output/images/78.png b/pretrained_output/images/78.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0736b2bece813796f3a8f7a7f97f4d4c75e718 Binary files /dev/null and b/pretrained_output/images/78.png differ diff --git a/pretrained_output/images/79.png b/pretrained_output/images/79.png new file mode 100644 index 0000000000000000000000000000000000000000..4af28f10d7d7e3202bda2b05df9fd7dc66a8726b Binary files /dev/null and b/pretrained_output/images/79.png differ diff --git a/pretrained_output/images/8.png b/pretrained_output/images/8.png new file mode 100644 index 0000000000000000000000000000000000000000..941ec264029a979e34f92250451239b39a5eca85 Binary files /dev/null and b/pretrained_output/images/8.png differ diff --git a/pretrained_output/images/80.png b/pretrained_output/images/80.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0c2cb396f3b96b7083c03ea497399e05aa10cc Binary files /dev/null and b/pretrained_output/images/80.png differ diff --git a/pretrained_output/images/81.png b/pretrained_output/images/81.png new file mode 100644 index 0000000000000000000000000000000000000000..f30742af742414391d16cd287494569d3aaf6819 Binary files /dev/null and b/pretrained_output/images/81.png differ diff --git a/pretrained_output/images/82.png b/pretrained_output/images/82.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d8a5d72a59594865c33c19b2216dbbeb2e4d2e Binary files /dev/null and b/pretrained_output/images/82.png differ diff --git a/pretrained_output/images/83.png b/pretrained_output/images/83.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4b3b6036bd2a418a145a0fe38a6e368994cfab Binary files /dev/null and b/pretrained_output/images/83.png differ diff --git a/pretrained_output/images/84.png b/pretrained_output/images/84.png new file mode 100644 index 0000000000000000000000000000000000000000..b7400115e7d317dc3f6a97d8147f18a7bd1a731e Binary files /dev/null and b/pretrained_output/images/84.png differ diff --git a/pretrained_output/images/85.png b/pretrained_output/images/85.png new file mode 100644 index 0000000000000000000000000000000000000000..5de38020a739fd9197b007bbaf3f379cb2ed49ab Binary files /dev/null and b/pretrained_output/images/85.png differ diff --git a/pretrained_output/images/86.png b/pretrained_output/images/86.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd6c5dd4c032c873a4b43c91f2f5a37c69d8604 Binary files /dev/null and b/pretrained_output/images/86.png differ diff --git a/pretrained_output/images/87.png b/pretrained_output/images/87.png new file mode 100644 index 0000000000000000000000000000000000000000..26c4834fa694e6b527f6fabe41fb1b5b6374ee87 Binary files /dev/null and b/pretrained_output/images/87.png differ diff --git a/pretrained_output/images/88.png b/pretrained_output/images/88.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe87bac6a65f066d77375199d6eba0d29f3de9f Binary files /dev/null and b/pretrained_output/images/88.png differ diff --git a/pretrained_output/images/89.png b/pretrained_output/images/89.png new file mode 100644 index 0000000000000000000000000000000000000000..c19b73bfb663eaa2374bc211aaac3b6a88a144a0 Binary files /dev/null and b/pretrained_output/images/89.png differ diff --git a/pretrained_output/images/9.png b/pretrained_output/images/9.png new file mode 100644 index 0000000000000000000000000000000000000000..b529ad916efa37e077a623eca694ee299644c3ef Binary files /dev/null and b/pretrained_output/images/9.png differ diff --git a/pretrained_output/images/90.png b/pretrained_output/images/90.png new file mode 100644 index 0000000000000000000000000000000000000000..edf908a1ff815ded3b9ea58b9a823da950aa20d9 Binary files /dev/null and b/pretrained_output/images/90.png differ diff --git a/pretrained_output/images/91.png b/pretrained_output/images/91.png new file mode 100644 index 0000000000000000000000000000000000000000..da03b2932c0e3dbe033f5e71555ee4005d5ede5a Binary files /dev/null and b/pretrained_output/images/91.png differ diff --git a/pretrained_output/images/92.png b/pretrained_output/images/92.png new file mode 100644 index 0000000000000000000000000000000000000000..89e86eef7d99adb43685bd4d6e3ee4d25c96bdb6 Binary files /dev/null and b/pretrained_output/images/92.png differ diff --git a/pretrained_output/images/93.png b/pretrained_output/images/93.png new file mode 100644 index 0000000000000000000000000000000000000000..c15509e033d75812de2f38be0adef9ca452d7d63 Binary files /dev/null and b/pretrained_output/images/93.png differ diff --git a/pretrained_output/images/94.png b/pretrained_output/images/94.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b5f3541d205bd17a28bfb1ffabbb9c063f4105 Binary files /dev/null and b/pretrained_output/images/94.png differ diff --git a/pretrained_output/images/95.png b/pretrained_output/images/95.png new file mode 100644 index 0000000000000000000000000000000000000000..02fa050944169454244d7329410ec3e384021422 Binary files /dev/null and b/pretrained_output/images/95.png differ diff --git a/pretrained_output/images/96.png b/pretrained_output/images/96.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ff37ee9648468da31e6f85d5fa472e1d262e16 Binary files /dev/null and b/pretrained_output/images/96.png differ diff --git a/pretrained_output/images/97.png b/pretrained_output/images/97.png new file mode 100644 index 0000000000000000000000000000000000000000..121c0099cf9619c78a9b868147b12ffcecab73a4 Binary files /dev/null and b/pretrained_output/images/97.png differ diff --git a/pretrained_output/images/98.png b/pretrained_output/images/98.png new file mode 100644 index 0000000000000000000000000000000000000000..ba4e69d75b563b92d1270ca628a93e557cefcde5 Binary files /dev/null and b/pretrained_output/images/98.png differ diff --git a/pretrained_output/images/99.png b/pretrained_output/images/99.png new file mode 100644 index 0000000000000000000000000000000000000000..a12ce5d34abc63e3df4e14717cc4a0cd1ccdd1b5 Binary files /dev/null and b/pretrained_output/images/99.png differ diff --git a/pretrained_output/models/discriminator.pt b/pretrained_output/models/discriminator.pt new file mode 100644 index 0000000000000000000000000000000000000000..6feabce3821391d50d5455bc588a136242cdb293 --- /dev/null +++ b/pretrained_output/models/discriminator.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d2a42be9a668e28e4fddcfecb477c586f79d5fc387e36336b8499ca70036efb +size 8599709 diff --git a/pretrained_output/models/discriminator_fine_tuned.pt b/pretrained_output/models/discriminator_fine_tuned.pt new file mode 100644 index 0000000000000000000000000000000000000000..58a5e72bd833290863a948845c62e2ffadd18b8d --- /dev/null +++ b/pretrained_output/models/discriminator_fine_tuned.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb8e9e350d621e3ea7b54421c65a37914fc62cb7436b45904f2edf3a7c3c9465 +size 8600370 diff --git a/pretrained_output/models/generator.pt b/pretrained_output/models/generator.pt new file mode 100644 index 0000000000000000000000000000000000000000..f6d8657a2cc11d5c7282bee7c5c2f8a5f8d0c813 --- /dev/null +++ b/pretrained_output/models/generator.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0651743016c3b0b906a187427da4df2c3728f0357f43923d24d5b620393f71d0 +size 7966467 diff --git a/pretrained_output/training_logs.log b/pretrained_output/training_logs.log new file mode 100644 index 0000000000000000000000000000000000000000..eaddf254de66d8fa6cac9defd344097ffb553ea5 --- /dev/null +++ b/pretrained_output/training_logs.log @@ -0,0 +1,103 @@ +2024-10-22 20:46:18,783 - Lodadind data +2024-10-22 20:46:41,624 - Using device: cuda +2024-10-22 20:46:41,710 - Start train +2024-10-22 20:47:12,939 - Epoch [1/100], Batch [469/469], Loss_D: 0.2357, Loss_G: 0.6456 +2024-10-22 20:47:44,361 - Epoch [2/100], Batch [469/469], Loss_D: 0.0845, Loss_G: 0.8505 +2024-10-22 20:48:15,698 - Epoch [3/100], Batch [469/469], Loss_D: 0.5342, Loss_G: 0.4654 +2024-10-22 20:48:47,414 - Epoch [4/100], Batch [469/469], Loss_D: 0.1407, Loss_G: 0.6517 +2024-10-22 20:49:19,053 - Epoch [5/100], Batch [469/469], Loss_D: 0.2737, Loss_G: 0.6624 +2024-10-22 20:49:50,159 - Epoch [6/100], Batch [469/469], Loss_D: 0.4493, Loss_G: 0.5388 +2024-10-22 20:50:20,524 - Epoch [7/100], Batch [469/469], Loss_D: 0.3012, Loss_G: 0.5224 +2024-10-22 20:50:50,792 - Epoch [8/100], Batch [469/469], Loss_D: 0.2237, Loss_G: 0.5728 +2024-10-22 20:51:21,609 - Epoch [9/100], Batch [469/469], Loss_D: 0.4069, Loss_G: 0.8186 +2024-10-22 20:51:51,940 - Epoch [10/100], Batch [469/469], Loss_D: 0.2774, Loss_G: 0.8371 +2024-10-22 20:52:22,319 - Epoch [11/100], Batch [469/469], Loss_D: 0.3095, Loss_G: 0.6746 +2024-10-22 20:52:53,089 - Epoch [12/100], Batch [469/469], Loss_D: 0.3624, Loss_G: 0.6893 +2024-10-22 20:53:23,667 - Epoch [13/100], Batch [469/469], Loss_D: 0.0555, Loss_G: 0.5063 +2024-10-22 20:53:53,992 - Epoch [14/100], Batch [469/469], Loss_D: 0.3214, Loss_G: 0.6874 +2024-10-22 20:54:24,337 - Epoch [15/100], Batch [469/469], Loss_D: 0.3996, Loss_G: 0.7867 +2024-10-22 20:54:54,678 - Epoch [16/100], Batch [469/469], Loss_D: 0.3704, Loss_G: 0.7810 +2024-10-22 20:55:25,018 - Epoch [17/100], Batch [469/469], Loss_D: 0.2363, Loss_G: 0.7805 +2024-10-22 20:55:55,853 - Epoch [18/100], Batch [469/469], Loss_D: 0.1914, Loss_G: 0.7242 +2024-10-22 20:56:26,163 - Epoch [19/100], Batch [469/469], Loss_D: 0.2174, Loss_G: 0.5945 +2024-10-22 20:56:56,776 - Epoch [20/100], Batch [469/469], Loss_D: 0.1038, Loss_G: 0.6807 +2024-10-22 20:57:27,420 - Epoch [21/100], Batch [469/469], Loss_D: 0.1360, Loss_G: 0.6402 +2024-10-22 20:57:58,045 - Epoch [22/100], Batch [469/469], Loss_D: 0.2149, Loss_G: 0.6247 +2024-10-22 20:58:28,345 - Epoch [23/100], Batch [469/469], Loss_D: 0.2966, Loss_G: 0.7582 +2024-10-22 20:58:59,570 - Epoch [24/100], Batch [469/469], Loss_D: 0.4792, Loss_G: 0.4935 +2024-10-22 20:59:30,106 - Epoch [25/100], Batch [469/469], Loss_D: 0.1862, Loss_G: 0.5280 +2024-10-22 21:00:01,345 - Epoch [26/100], Batch [469/469], Loss_D: 0.2429, Loss_G: 0.7221 +2024-10-22 21:00:32,596 - Epoch [27/100], Batch [469/469], Loss_D: 0.1608, Loss_G: 0.6689 +2024-10-22 21:01:02,907 - Epoch [28/100], Batch [469/469], Loss_D: 0.3707, Loss_G: 0.6196 +2024-10-22 21:01:33,277 - Epoch [29/100], Batch [469/469], Loss_D: 0.3974, Loss_G: 0.7429 +2024-10-22 21:02:03,728 - Epoch [30/100], Batch [469/469], Loss_D: 0.1752, Loss_G: 0.5156 +2024-10-22 21:02:34,281 - Epoch [31/100], Batch [469/469], Loss_D: 0.1800, Loss_G: 0.5937 +2024-10-22 21:03:04,891 - Epoch [32/100], Batch [469/469], Loss_D: 0.2021, Loss_G: 0.5945 +2024-10-22 21:03:36,546 - Epoch [33/100], Batch [469/469], Loss_D: 0.1095, Loss_G: 0.8008 +2024-10-22 21:04:06,482 - Epoch [34/100], Batch [469/469], Loss_D: 0.2057, Loss_G: 0.6817 +2024-10-22 21:04:37,275 - Epoch [35/100], Batch [469/469], Loss_D: 0.3957, Loss_G: 0.8120 +2024-10-22 21:05:09,022 - Epoch [36/100], Batch [469/469], Loss_D: 0.2212, Loss_G: 0.5342 +2024-10-22 21:05:41,793 - Epoch [37/100], Batch [469/469], Loss_D: 0.1708, Loss_G: 0.7387 +2024-10-22 21:06:13,644 - Epoch [38/100], Batch [469/469], Loss_D: 0.2813, Loss_G: 0.5862 +2024-10-22 21:06:44,255 - Epoch [39/100], Batch [469/469], Loss_D: 0.3603, Loss_G: 0.5560 +2024-10-22 21:07:14,763 - Epoch [40/100], Batch [469/469], Loss_D: 0.1354, Loss_G: 0.5184 +2024-10-22 21:07:45,404 - Epoch [41/100], Batch [469/469], Loss_D: 0.3317, Loss_G: 0.7580 +2024-10-22 21:08:16,153 - Epoch [42/100], Batch [469/469], Loss_D: 0.4953, Loss_G: 0.3403 +2024-10-22 21:08:46,499 - Epoch [43/100], Batch [469/469], Loss_D: 0.1746, Loss_G: 0.5162 +2024-10-22 21:09:16,777 - Epoch [44/100], Batch [469/469], Loss_D: 0.4298, Loss_G: 0.7153 +2024-10-22 21:09:47,954 - Epoch [45/100], Batch [469/469], Loss_D: 0.1553, Loss_G: 0.5628 +2024-10-22 21:10:18,361 - Epoch [46/100], Batch [469/469], Loss_D: 0.2322, Loss_G: 0.7577 +2024-10-22 21:10:48,607 - Epoch [47/100], Batch [469/469], Loss_D: 0.4900, Loss_G: 0.2370 +2024-10-22 21:11:19,368 - Epoch [48/100], Batch [469/469], Loss_D: 0.2106, Loss_G: 0.6747 +2024-10-22 21:11:50,326 - Epoch [49/100], Batch [469/469], Loss_D: 0.3368, Loss_G: 0.8195 +2024-10-22 21:12:21,397 - Epoch [50/100], Batch [469/469], Loss_D: 0.2430, Loss_G: 0.6201 +2024-10-22 21:12:53,127 - Epoch [51/100], Batch [469/469], Loss_D: 0.1312, Loss_G: 0.5016 +2024-10-22 21:13:24,509 - Epoch [52/100], Batch [469/469], Loss_D: 0.2923, Loss_G: 0.8598 +2024-10-22 21:13:54,773 - Epoch [53/100], Batch [469/469], Loss_D: 0.4443, Loss_G: 0.3379 +2024-10-22 21:14:24,376 - Epoch [54/100], Batch [469/469], Loss_D: 0.0724, Loss_G: 0.5998 +2024-10-22 21:14:53,755 - Epoch [55/100], Batch [469/469], Loss_D: 0.4116, Loss_G: 0.4523 +2024-10-22 21:15:23,129 - Epoch [56/100], Batch [469/469], Loss_D: 0.1418, Loss_G: 0.6783 +2024-10-22 21:15:52,513 - Epoch [57/100], Batch [469/469], Loss_D: 0.2035, Loss_G: 0.5773 +2024-10-22 21:16:21,877 - Epoch [58/100], Batch [469/469], Loss_D: 0.0987, Loss_G: 0.7975 +2024-10-22 21:16:51,250 - Epoch [59/100], Batch [469/469], Loss_D: 0.3031, Loss_G: 0.7860 +2024-10-22 21:17:20,629 - Epoch [60/100], Batch [469/469], Loss_D: 0.2889, Loss_G: 0.6679 +2024-10-22 21:17:50,003 - Epoch [61/100], Batch [469/469], Loss_D: 0.2187, Loss_G: 0.5018 +2024-10-22 21:18:19,373 - Epoch [62/100], Batch [469/469], Loss_D: 0.1392, Loss_G: 0.4457 +2024-10-22 21:18:48,746 - Epoch [63/100], Batch [469/469], Loss_D: 0.2681, Loss_G: 0.8638 +2024-10-22 21:19:19,150 - Epoch [64/100], Batch [469/469], Loss_D: 0.2004, Loss_G: 0.7712 +2024-10-22 21:19:49,767 - Epoch [65/100], Batch [469/469], Loss_D: 0.3238, Loss_G: 0.5592 +2024-10-22 21:20:19,145 - Epoch [66/100], Batch [469/469], Loss_D: 0.2861, Loss_G: 0.8833 +2024-10-22 21:20:48,512 - Epoch [67/100], Batch [469/469], Loss_D: 0.2191, Loss_G: 0.5182 +2024-10-22 21:21:17,874 - Epoch [68/100], Batch [469/469], Loss_D: 0.2530, Loss_G: 0.6281 +2024-10-22 21:21:47,236 - Epoch [69/100], Batch [469/469], Loss_D: 0.4905, Loss_G: 0.6754 +2024-10-22 21:22:16,593 - Epoch [70/100], Batch [469/469], Loss_D: 0.3803, Loss_G: 0.6533 +2024-10-22 21:22:45,953 - Epoch [71/100], Batch [469/469], Loss_D: 0.0733, Loss_G: 0.5627 +2024-10-22 21:23:15,355 - Epoch [72/100], Batch [469/469], Loss_D: 0.1307, Loss_G: 0.6862 +2024-10-22 21:23:44,717 - Epoch [73/100], Batch [469/469], Loss_D: 0.1982, Loss_G: 0.6108 +2024-10-22 21:24:14,095 - Epoch [74/100], Batch [469/469], Loss_D: 0.1413, Loss_G: 0.5810 +2024-10-22 21:24:43,463 - Epoch [75/100], Batch [469/469], Loss_D: 0.2061, Loss_G: 0.6669 +2024-10-22 21:25:14,445 - Epoch [76/100], Batch [469/469], Loss_D: 0.1874, Loss_G: 0.6704 +2024-10-22 21:25:44,807 - Epoch [77/100], Batch [469/469], Loss_D: 0.1832, Loss_G: 0.5598 +2024-10-22 21:26:14,187 - Epoch [78/100], Batch [469/469], Loss_D: 0.2969, Loss_G: 0.7973 +2024-10-22 21:26:43,547 - Epoch [79/100], Batch [469/469], Loss_D: 0.3312, Loss_G: 0.5341 +2024-10-22 21:27:12,955 - Epoch [80/100], Batch [469/469], Loss_D: 0.1982, Loss_G: 0.8777 +2024-10-22 21:27:42,320 - Epoch [81/100], Batch [469/469], Loss_D: 0.3367, Loss_G: 0.7962 +2024-10-22 21:28:11,679 - Epoch [82/100], Batch [469/469], Loss_D: 0.1327, Loss_G: 0.6267 +2024-10-22 21:28:41,056 - Epoch [83/100], Batch [469/469], Loss_D: 0.1279, Loss_G: 0.6073 +2024-10-22 21:29:10,443 - Epoch [84/100], Batch [469/469], Loss_D: 0.2912, Loss_G: 0.6855 +2024-10-22 21:29:39,812 - Epoch [85/100], Batch [469/469], Loss_D: 0.3438, Loss_G: 0.7762 +2024-10-22 21:30:09,185 - Epoch [86/100], Batch [469/469], Loss_D: 0.1983, Loss_G: 0.4470 +2024-10-22 21:30:38,956 - Epoch [87/100], Batch [469/469], Loss_D: 0.2298, Loss_G: 0.8061 +2024-10-22 21:31:09,175 - Epoch [88/100], Batch [469/469], Loss_D: 0.3434, Loss_G: 0.6383 +2024-10-22 21:31:39,594 - Epoch [89/100], Batch [469/469], Loss_D: 0.1607, Loss_G: 0.6672 +2024-10-22 21:32:08,987 - Epoch [90/100], Batch [469/469], Loss_D: 0.3369, Loss_G: 0.4305 +2024-10-22 21:32:38,374 - Epoch [91/100], Batch [469/469], Loss_D: 0.0762, Loss_G: 0.6941 +2024-10-22 21:33:07,753 - Epoch [92/100], Batch [469/469], Loss_D: 0.5284, Loss_G: 0.8560 +2024-10-22 21:33:37,135 - Epoch [93/100], Batch [469/469], Loss_D: 0.3745, Loss_G: 0.5909 +2024-10-22 21:34:06,513 - Epoch [94/100], Batch [469/469], Loss_D: 0.0671, Loss_G: 0.6384 +2024-10-22 21:34:35,913 - Epoch [95/100], Batch [469/469], Loss_D: 0.1428, Loss_G: 0.7203 +2024-10-22 21:35:05,290 - Epoch [96/100], Batch [469/469], Loss_D: 0.2742, Loss_G: 0.6134 +2024-10-22 21:35:34,693 - Epoch [97/100], Batch [469/469], Loss_D: 0.1224, Loss_G: 0.7076 +2024-10-22 21:36:04,086 - Epoch [98/100], Batch [469/469], Loss_D: 0.3681, Loss_G: 0.5916 +2024-10-22 21:36:34,006 - Epoch [99/100], Batch [469/469], Loss_D: 0.5593, Loss_G: 0.8537 +2024-10-22 21:37:04,420 - Epoch [100/100], Batch [469/469], Loss_D: 0.0893, Loss_G: 0.6289 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..210b23337b8b496e033f458010898ba6d4a00f25 Binary files /dev/null and b/requirements.txt differ