Labels are derived directly from the folder structure so the class index can never drift between training and inference — one source of truth shared by the notebook and the app. The data is split into train, validation, and test sets, with the validation transform reused exactly at prediction time so a tile is normalized the same way everywhere it appears.
The model is a custom CNN — four convolutional blocks of increasing width, each pairing convolution with batch normalization and pooling, feeding a small classifier head. It is trained from scratch with cross-entropy and tracked on the validation set every epoch to catch overfitting early. No transfer learning: the network learns EuroSAT's textures and spectral cues on its own.
On top of the trained model sits an interactive Shiny for Python app. Upload a satellite tile and it loads the saved weights, applies the identical validation transform, and returns the predicted class with its confidence — the same pipeline that produced the test metrics, now exposed as a tool.