|
|
| --- |
| license: mit |
| language: en |
| library_name: pytorch |
| tags: |
| - image-inpainting |
| - computer-vision |
| - pytorch |
| - unet |
| - cifar-10 |
| datasets: |
| - cifar10 |
| --- |
| |
| # U-Net for Image Inpainting on CIFAR-10 |
|
|
| This repository contains a PyTorch implementation of a deep U-Net with Residual Blocks, trained to perform image inpainting on the CIFAR-10 dataset. The model takes an image with a masked (blacked-out) region and reconstructs the missing part. |
|
|
| ## Model Description |
|
|
| The model is a `ComplexUNet` architecture, a variant of the standard U-Net. It features: |
| - **Deeper Architecture**: 4 downsampling and 4 upsampling stages. |
| - **Residual Blocks**: Each stage uses residual blocks instead of simple convolutional layers. |
| - **Increased Width**: The model was trained with `base_channels=96`. |
| - **Total Parameters**: 73,148,259 |
|
|
| ## How to Use |
|
|
| First, install the required libraries: |
| ```bash |
| pip install torch torchvision numpy Pillow |
| ``` |
|
|
| Then, you can load the model and perform inpainting on an image tensor. |
|
|
| ```python |
| import torch |
| from torchvision import transforms as T |
| from PIL import Image |
| from model import ComplexUNet # Import the class from model.py |
| |
| # --- Setup --- |
| DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| # Download the .pth file from the 'Files and versions' tab of this repo |
| MODEL_PATH = "inpainting_model_larger.pth" |
| |
| # --- Load Model --- |
| model = ComplexUNet(base_channels=96) |
| model.load_state_dict(torch.load(MODEL_PATH, map_location=DEVICE)) |
| model.to(DEVICE) |
| model.eval() |
| |
| # --- Load and Preprocess Image --- |
| # image = Image.open("your_image.png").convert("RGB") |
| # For demonstration, let's create a dummy tensor |
| transform = T.Compose([T.Resize((32, 32)), T.ToTensor()]) |
| # image_tensor = transform(image) |
| image_tensor = torch.rand(3, 32, 32) |
| |
| # --- Create a Mask --- |
| masked_tensor = image_tensor.clone() |
| masked_tensor[:, 8:24, 8:24] = 0 # Example mask in the center |
| |
| # --- Perform Inpainting --- |
| with torch.no_grad(): |
| input_tensor = masked_tensor.unsqueeze(0).to(DEVICE) |
| reconstructed_tensor = model(input_tensor).squeeze(0).cpu() |
| |
| # 'reconstructed_tensor' now holds the inpainted image. |
| from torchvision.transforms.functional import to_pil_image |
| reconstructed_image = to_pil_image(reconstructed_tensor) |
| reconstructed_image.save("reconstructed_image.png") |
| print("Saved reconstructed_image.png") |
| ``` |
|
|
| ## Training Data |
|
|
| The model was trained on the **CIFAR-10** dataset. |
| - **Preprocessing**: Images were used at their original **32x32 pixels** resolution. |
| - **Augmentation**: For each training image, a random rectangular mask was applied. |
|
|
| ## Training Procedure |
|
|
| - **Framework**: PyTorch |
| - **Optimizer**: Adam |
| - **Learning Rate**: 0.001 |
| - **Epochs**: 50 |
| - **Batch Size**: 128 |
| - **Loss Function**: Mean Squared Error (MSE) |
|
|
| ## Evaluation |
|
|
| Evaluation metrics were not saved by the training script. To get PSNR and SSIM, please run the `evaluate_model` function from the training script. |
|
|