This repository contains a complete offroad semantic segmentation pipeline:
- dataset preparation for RUGD-style image/mask folders
- training with a frozen DINOv2 backbone and segmentation head
- evaluation on test split
- Streamlit frontend for interactive inference
If your team already downloaded the Falcon desert dataset, keep using that same dataset and folder layout. You do not need a different dataset.
Expected split structure:
<dataset_root>/train/Color_Images<dataset_root>/train/Segmentation<dataset_root>/val/Color_Images<dataset_root>/val/Segmentation<dataset_root>/test/Color_Images<dataset_root>/test/Segmentation
Default Falcon class mapping used by upgraded scripts:
100 -> Trees200 -> Lush Bushes300 -> Dry Grass500 -> Dry Bushes550 -> Ground Clutter600 -> Flowers700 -> Logs800 -> Rocks7100 -> Landscape10000 -> Sky
The guide below is for a person cloning this repository on a fresh machine.
git clone https://github.com/Abhrxdip/duality_ai.git
cd duality_aiIf you cloned a different remote, the rest of the commands are the same.
python -m venv .venv
.venv\Scripts\Activate.ps1python3 -m venv .venv
source .venv/bin/activatepython -m pip install --upgrade pip
python -m pip install torch torchvision opencv-contrib-python numpy pillow tqdm matplotlib streamlitUse your own segmentation dataset (Falcon or custom).
If your dataset is already split, keep this structure and skip to training/evaluation:
<dataset_root>/train/Color_Images<dataset_root>/train/Segmentation<dataset_root>/val/Color_Images<dataset_root>/val/Segmentation<dataset_root>/test/Color_Images<dataset_root>/test/Segmentation
If you have raw image/mask folders, continue with Step 5 to generate train/val/test splits.
Run:
python prepare_rugd_dataset.py --images_dir "<images_dir>" --masks_dir "<masks_dir>" --output_root "<output_root>" --split_mode by-sequence --train_ratio 0.64 --val_ratio 0.10 --seed 42Example:
python prepare_rugd_dataset.py --images_dir "<falcon_images_dir>" --masks_dir "<falcon_masks_dir>" --output_root "<dataset_root>" --split_mode by-sequence --train_ratio 0.64 --val_ratio 0.10 --seed 42If your data is already split into train/val/test folders, you can skip this step.
This creates:
<output_root>/train/Color_Images<output_root>/train/Segmentation<output_root>/val/Color_Images<output_root>/val/Segmentation<output_root>/test/Color_Images<output_root>/test/Segmentation
RUGD masks can be RGB-coded. Generate class mapping JSON:
python generate_mask_mapping.py --mask_dir "<output_root>/train/Segmentation" --output_json "<output_root>/mask_mapping.json"Generic command:
python train_segmentation.py --train_dir "<output_root>/train" --val_dir "<output_root>/val" --mapping_json "<output_root>/mask_mapping.json" --output_dir "<output_root>/train_stats" --batch_size 2 --epochs 20 --lr 3e-4 --num_workers 0 --backbone_size small --optimizer adamw --scheduler cosine --class_weighting auto --amp 1 --early_stop_patience 8 --aug_hflip 0.5 --aug_color_jitter 0.2Training saves artifacts in <output_root>/train_stats:
checkpoints/best_segmentation_head.pthcheckpoints/last_segmentation_head.pthhistory.csv,history.json,training_curves.pngtraining_summary.jsonclass_names.json
And exports best checkpoint in repo root as:
segmentation_head.pth
For a quick smoke test, use --epochs 1 --batch_size 1.
Generic command:
python test_segmentation.py --model_path "segmentation_head.pth" --data_dir "<output_root>/test" --mapping_json "<output_root>/mask_mapping.json" --output_dir "<output_root>/predictions" --batch_size 2 --num_workers 0 --save_predictions 1 --failure_k 20You will get metrics and reporting artifacts:
- Mean IoU, Mean Dice, Pixel Accuracy
evaluation_summary.jsonper_class_metrics.csvfailure_cases.csvpred_masks/andoverlays/for visual report evidence
python -m streamlit run app.pyIn the app:
- checkpoint path should point to
segmentation_head.pth - upload RGB image files only (from
Color_Imagesor originalimagesfolder) - do not upload annotation masks
train_segmentation.py: training pipelinetest_segmentation.py: evaluation + prediction exportapp.py: Streamlit inference UIprepare_rugd_dataset.py: split and format datagenerate_mask_mapping.py: build class-id mapping JSONvisualize.py: mask colorization utilityRUGD_FROM_SCRATCH.md: additional beginner walkthrough
FileNotFoundError ... Color_Images- Check the
--train_dir,--val_dir, and--data_dirvalues.
- Check the
- Frontend says checkpoint missing
- Train first or set correct checkpoint path in sidebar.
- Poor performance on CPU
- Use fewer epochs, batch size 1, and smaller experiments for demo.