GAN-Driven Cloud Removal and Image Enhancement in Satellite Imagery: A Framework for High-Fidelity Remote Sensing
My approach involves a GAN(Generative Adversarial Network) architecture consisting of two main components: a U-Net based Generator and a PatchGAN Discriminator. The Generator is tasked with creating clear images from cloudy ones, utilising additional inputs from automatically generated cloud masks that pinpoint the location and type of clouds in the images. This method ensures that the cloud removal process is informed and precise, addressing only the parts of the image that are cloud covered without degrading the rest of the image. The Discriminator then evaluates these generated images against real, cloud-free images to ensure the outputs are indistinguishable from actual satellite imagery in terms of quality and realism.
This project harnesses the power of GANs to develop a robust system that not only removes clouds from satellite imagery but also enhances the quality of the images post- processing. This dual capability is particularly crucial for maintaining the integrity of the imagery’s use in precise applications such as land cover classification, agricultural monitoring, military surveillance, and disaster response planning.
The system follows a modular architecture designed around a cloud-enabled microservices structure. It separates data ingestion, preprocessing, model inference, evaluation, and output management into distinct, independently scalable services. This division ensures flexibility, ease of deployment, and maintainability. The core application is built using Python, TensorFlow (or PyTorch), and integrates Google Earth Engine (GEE) APIs for data fetching and cloud mask generation. I have shared the Architecture Diagram Below:
Now, moving on to the Outputs and Graphs of this project, it is all there in the .ipynb file, and I have added as much comments I could in the original file itself so one can get the flow of my work. Secondly lets talk about the graph and the key features you should look out :

- The generator loss decreases over time → that means it’s learning to fool the discriminator better.
- The discriminator loss is low and steady → it’s not collapsing, it’s still able to distinguish real vs fake to some degree.
- After ~50 epochs, both losses stabilize → a good sign of equilibrium.
- Oscillations in generator loss (big spikes in the early epochs) are normal for GANs, but if they continued until the end, it would mean unstable training.
- Discriminator loss being too low (<0.5) could mean it’s overpowering the generator (mode collapse risk). But in our case, it’s hovering around 1.2 → balanced.
- Ideally, one wants both losses to converge slowly without either hitting 0. Here, that’s roughly what’s happening.
Thank you for your time, this project was done after a lot of research work and practices