Are you sure you want to delete this access key?
SuperGradients allows users to train models for semantic segmentation tasks. The library includes pre-trained models, such as the Cityscapes PPLiteSeg model, and provides a simple interface for loading custom datasets.
SuperGradients includes a variety of pre-trained models for semantic segmentation tasks.
Model Name | Dataset | IoU | Training Recipe | Resolution |
---|---|---|---|---|
DDRNet 23 | Cityscapes | 80.26 | cityscapes_ddrnet.yaml | [1024, 2048] |
DDRNet 23 Slim | Cityscapes | 78.01 | cityscapes_ddrnet.yaml | [1024, 2048] |
DDRNet 39 | Cityscapes | 81.32 | cityscapes_ddrnet.yaml | [1024, 2048] |
STDC1 Seg 50 | Cityscapes | 75.11 | cityscapes_stdc_seg50.yaml | [512, 1024] |
STDC1 Seg 75 | Cityscapes | 76.87 | cityscapes_stdc_seg75.yaml | [768, 1536] |
STDC2 Seg 50 | Cityscapes | 76.44 | cityscapes_stdc_seg50.yaml | [512, 1024] |
STDC2 Seg 75 | Cityscapes | 78.93 | cityscapes_stdc_seg75.yaml | [768, 1536] |
RegSeg 48 | Cityscapes | 78.15 | cityscapes_regseg48.yaml | [1024, 2048] |
PP-Lite T 50 | Cityscapes | 74.92 | cityscapes_pplite_seg50.yaml | [512, 1024] |
PP-Lite T 75 | Cityscapes | 77.56 | cityscapes_pplite_seg75.yaml | [512, 1024] |
PP-Lite B 50 | Cityscapes | 76.48 | cityscapes_pplite_seg50.yaml | [512, 1024] |
PP-Lite B 75 | Cityscapes | 78.52 | cityscapes_pplite_seg75.yaml | [512, 1024] |
Latency and additional details of these models can be found in the SuperGradients Model Zoo.
SuperGradients provides a variety of loss functions for training semantic segmentation tasks.
All loss functions are implemented in PyTorch and can be found in the super_gradients.training.losses
module.
The following table summarizes the loss functions currently supported by SuperGradients.
Loss function class | Loss name in YAML | Description |
---|---|---|
BCEDiceLoss | bce_dice_loss | Weighted average of BCE and Dice loss |
CrossEntropyLoss | cross_entropy | Cross entropy loss with label smoothing support |
DiceLoss | N/A | Dice loss for multiclass segmentation |
BinaryDiceLoss | N/A | Dice loss for binary segmentation |
GeneralizedDiceLoss | N/A | Generalized dice loss |
DiceCEEdgeLoss | dice_ce_edge_loss | Dice loss + Cross entropy loss + Edge loss |
SegKDLoss | N/A | A loss function for knowledge distillation for semantic segmentation |
Metric Class | Metric name in YAML | Description |
---|---|---|
PixelAccuracy | PixelAccuracy | The ratio of correctly classified pixels to the total number of pixels |
IoU | IoU | Calculate the Jaccard index for multilabel tasks. |
Dice | Dice | Calculate the Dice index for multilabel tasks. |
Binary IoU | BinaryIOU | Calculate the Jaccard index for binary segmentation task. |
BinaryDice | BinaryDice | Calculate the Dice index for binary segmentation task. |
See Metrics page for additional details of using metrics in SuperGradients.
SuperGradients provides a number of ready to use datasets for semantic segmentation tasks and corresponding data loaders.
Dataset | Dataset Class | train dataloader | val dataloader |
---|---|---|---|
COCO | CoCoSegmentationDataSet | coco_segmentation_train | coco_segmentation_val |
Cityscapes | CityscapesDataset | cityscapes_train | cityscapes_val |
Pascal VOC | PascalVOC2012SegmentationDataSet | pascal_voc_segmentation_train | pascal_voc_segmentation_val |
Supervisely | SuperviselyPersonDataset | supervisely_persons_train | supervisely_persons_val |
Mapillary Vistas | MapillaryDataset | mapillary_train | mapillary_val |
In the next section we will demonstrate how to use these datasets and dataloaders to train a segmentation model using SuperGradients.
In the tutorial provided, we demonstrate how to fine-tune PPLiteSeg on a subset of the Supervisely dataset. You can run the following code in our google collab.
In this example we will work with supervisely-persons. If it's the first time you are using this dataset, or if you want to use another dataset please check out dataset setup instructions
from super_gradients.training import dataloaders
root_dir = '/path/to/supervisely_dataset_dir'
train_loader = dataloaders.supervisely_persons_train(dataset_params={"root_dir": root_dir}, dataloader_params={})
valid_loader = dataloaders.supervisely_persons_val(dataset_params={"root_dir": root_dir}, dataloader_params={})
Let's visualize what we've got there.
We have images and labels, with the default batch size of 256 for training.
from PIL import Image
from torchvision.utils import draw_segmentation_masks
from torchvision.transforms import ToTensor, ToPILImage, Resize
import numpy as np
import torch
def plot_seg_data(img_path: str, target_path: str):
image = (ToTensor()(Image.open(img_path).convert('RGB')) * 255).type(torch.uint8)
target = torch.from_numpy(np.array(Image.open(target_path))).bool()
image = draw_segmentation_masks(image, target, colors="red", alpha=0.4)
image = Resize(size=200)(image)
display(ToPILImage()(image))
for i in range(4, 7):
img_path, target_path = train_loader.dataset.samples_targets_tuples_list[i]
plot_seg_data(img_path, target_path)
Create a PPLiteSeg nn.Module, with 1 class segmentation head classifier. For simplicity use_aux_head
is set as False
and extra Auxiliary heads aren't used for training.
from super_gradients.training import models
from super_gradients.common.object_names import Models
# The model is a torch.nn.module
model = models.get(
model_name=Models.PP_LITE_T_SEG75, # You can use any model listed in the Models.<Name>
arch_params={"use_aux_heads": False},
num_classes=1, # Change this if you work on another dataset with more classes
pretrained_weights="cityscapes" # Drop this line to train from scratch
)
Notes
The training parameters includes loss, metrics, learning rates and much more. You can check out the default training parameters. For this task, we will train for 30 epoch, using Binary IoU using the SGD optimizer.
from super_gradients.training.metrics.segmentation_metrics import BinaryIOU
train_params = {
"max_epochs": 30,
"lr_mode": "CosineLRScheduler",
"initial_lr": 0.005,
"lr_warmup_epochs": 5,
"multiply_head_lr": 10,
"optimizer": "SGD",
"loss": "BCEDiceLoss",
"ema": True,
"zero_weight_decay_on_bias_and_bn": True,
"average_best_models": True,
"metric_to_watch": "target_IOU",
"greater_metric_to_watch_is_better": True,
"train_metrics_list": [BinaryIOU()],
"valid_metrics_list": [BinaryIOU()],
"loss_logging_items_names": ["loss"],
}
The Trainer in SuperGradient takes care of the entire training and validation process.
It serves as a convenient and efficient tool to handle all the details of the training process, allowing you to focus on the development of your model.
from super_gradients import Trainer
trainer = Trainer(
experiment_name="segmentation_example", # Your experiment checkpoints and logs will be saved in a folder names after the experiment_name.
ckpt_root_dir='/path/to/experiment/folder' # Path to the folder where you want to save all of your experiments.
)
trainer.train(model=model, training_params=training_params, train_loader=train_dataloader, valid_loader=valid_dataloader)
from torchvision.transforms import Compose, ToTensor, Resize, Normalize, ToPILImage
pre_proccess = Compose([
ToTensor(),
Normalize([.485, .456, .406], [.229, .224, .225])
])
demo_img_path = "/home/data/supervisely-persons/images/ache-adult-depression-expression-41253.png"
img = Image.open(demo_img_path)
# Resize the image and display
img = Resize(size=(480, 320))(img)
display(img)
# Run pre-proccess - transforms to tensor and apply normalizations.
img_inp = pre_proccess(img).unsqueeze(0).cuda()
# Run inference
mask = model(img_inp)
# Run post-proccess - apply sigmoid to output probabilities, then apply hard
# threshold of 0.5 for binary mask prediction.
mask = torch.sigmoid(mask).gt(0.5).squeeze()
mask = ToPILImage()(mask.float())
display(mask)
If you encounter any issues, please check out our troubleshooting guide.
Please check out our tutorial on how to use multiple GPUs'
In case you have a GPU with limited memory, you can use the gradients accumulation technique to "fake" larger batch sizes.
This is not 100% equivalent to training with larger batch sizes, but it is a good approximation.
You can set the desired number of batches to accumulate by changing the training_hyperparams.batch_accumulate
parameter.
Press p or to see the previous file or, n or to see the next file
Browsing data directories saved to S3 is possible with DAGsHub. Let's configure your repository to easily display your data in the context of any commit!
super-gradients is now integrated with AWS S3!
Are you sure you want to delete this access key?
Browsing data directories saved to Google Cloud Storage is possible with DAGsHub. Let's configure your repository to easily display your data in the context of any commit!
super-gradients is now integrated with Google Cloud Storage!
Are you sure you want to delete this access key?
Browsing data directories saved to Azure Cloud Storage is possible with DAGsHub. Let's configure your repository to easily display your data in the context of any commit!
super-gradients is now integrated with Azure Cloud Storage!
Are you sure you want to delete this access key?
Browsing data directories saved to S3 compatible storage is possible with DAGsHub. Let's configure your repository to easily display your data in the context of any commit!
super-gradients is now integrated with your S3 compatible storage!
Are you sure you want to delete this access key?