--- library_name: transformers tags: [] --- # Model Card for Model ID SegFormer model with a MiT-b2 backbone fine-tuned on Coralscapes at resolution 1024x1024, as introduced in ... ## Model Details ### Model Description Training is conducted following the Segformer original [implementation](https://proceedings.neurips.cc/paper_files/paper/2021/file/64f1f27bf1b4ec22924fd0acb550c235-Paper.pdf), using a batch size of 8 for 265 epochs, using the AdamW optimizer with an initial learning rate of 6e-5, weight decay of 1e-2 and polynomial learning rate scheduler with a power of 1. During training, images are randomly scaled within a range of 1 and 2, flipped horizontally with a 0.5 probability and randomly cropped to 1024×1024 pixels. Input images are normalized using the ImageNet mean and standard deviation. For evaluation, a non-overlapping sliding window strategy is employed, using a window size of 1024x1024. - **Developed by:** [More Information Needed] - **Funded by [optional]:** [More Information Needed] - **Shared by [optional]:** [More Information Needed] - **Model type:** [More Information Needed] - **License:** [More Information Needed] - **Finetuned from model:** [SegFormer (b2-sized) encoder pre-trained-only (`nvidia/mit-b2`)](https://huggingface.co/nvidia/mit-b2) ### Model Sources [optional] - **Repository:** [coralscapesScripts](https://github.com/eceo-epfl/coralscapesScripts/) - **Paper [optional]:** [More Information Needed] - **Demo** [Hugging Face Spaces](https://huggingface.co/spaces/EPFL-ECEO/coralscapes_demo): ## Uses ### Direct Use [More Information Needed] ### Downstream Use [optional] [More Information Needed] ### Out-of-Scope Use [More Information Needed] ## Bias, Risks, and Limitations [More Information Needed] ### Recommendations Users (both direct and downstream) should be made aware of the risks, biases and limitations of the model. More information needed for further recommendations. ## How to Get Started with the Model The simplest way to use this model to segment an image of the Coralscapes dataset is as follows: ```python from transformers import SegformerImageProcessor, SegformerForSemanticSegmentation from PIL import Image from datasets import load_dataset # Load an image from the coralscapes dataset or load your own image dataset = load_dataset("EPFL-ECEO/coralscapes") image = dataset["test"][42]["image"] preprocessor = SegformerImageProcessor.from_pretrained("EPFL-ECEO/segformer-b2-finetuned-coralscapes-1024-1024") model = SegformerForSemanticSegmentation.from_pretrained("EPFL-ECEO/segformer-b2-finetuned-coralscapes-1024-1024") inputs = preprocessor(image, return_tensors = "pt") outputs = model(**inputs) outputs = preprocessor.post_process_semantic_segmentation(outputs, target_sizes=[(image.size[1], image.size[0])]) label_pred = outputs[0].cpu().numpy() ``` While using the above approach should still work for images of different sizes and scales, for images that are not close to the training size of the model (1024x1024), we recommend using the following approach using a sliding window to achieve better results: ```python import torch import torch.nn.functional as F from transformers import SegformerImageProcessor, SegformerForSemanticSegmentation from PIL import Image from datasets import load_dataset import numpy as np def resize_image(image, target_size=1024): """ Used to resize the image such that the smaller side equals 1024 """ h_img, w_img = image.size if h_img < w_img: new_h, new_w = target_size, int(w_img * (target_size / h_img)) else: new_h, new_w = int(h_img * (target_size / w_img)), target_size resized_img = image.resize((new_h, new_w)) return resized_img def segment_image(image, preprocessor, model, crop_size = (1024, 1024), num_classes = 40, transform=None): """ Finds an optimal stride based on the image size and aspect ratio to create overlapping sliding windows of size 1024x1024 which are then fed into the model. """ h_crop, w_crop = crop_size img = torch.Tensor(np.array(resize_image(image, target_size=1024)).transpose(2, 0, 1)).unsqueeze(0) batch_size, _, h_img, w_img = img.size() if transform: img = torch.Tensor(transform(image = img.numpy())["image"]).to(device) h_grids = int(np.round(3/2*h_img/h_crop)) if h_img > h_crop else 1 w_grids = int(np.round(3/2*w_img/w_crop)) if w_img > w_crop else 1 h_stride = int((h_img - h_crop + h_grids -1)/(h_grids -1)) if h_grids > 1 else h_crop w_stride = int((w_img - w_crop + w_grids -1)/(w_grids -1)) if w_grids > 1 else w_crop preds = img.new_zeros((batch_size, num_classes, h_img, w_img)) count_mat = img.new_zeros((batch_size, 1, h_img, w_img)) for h_idx in range(h_grids): for w_idx in range(w_grids): y1 = h_idx * h_stride x1 = w_idx * w_stride y2 = min(y1 + h_crop, h_img) x2 = min(x1 + w_crop, w_img) y1 = max(y2 - h_crop, 0) x1 = max(x2 - w_crop, 0) crop_img = img[:, :, y1:y2, x1:x2] with torch.no_grad(): if(preprocessor): inputs = preprocessor(crop_img, return_tensors = "pt") inputs["pixel_values"] = inputs["pixel_values"].to(device) else: inputs = crop_img.to(device) outputs = model(**inputs) resized_logits = F.interpolate( outputs.logits[0].unsqueeze(dim=0), size=crop_img.shape[-2:], mode="bilinear", align_corners=False ) preds += F.pad(resized_logits, (int(x1), int(preds.shape[3] - x2), int(y1), int(preds.shape[2] - y2))) count_mat[:, :, y1:y2, x1:x2] += 1 assert (count_mat == 0).sum() == 0 preds = preds / count_mat preds = preds.argmax(dim=1) preds = F.interpolate(preds.unsqueeze(0).type(torch.uint8), size=image.size[::-1], mode='nearest') label_pred = preds.squeeze().cpu().numpy() return label_pred # Load an image from the coralscapes dataset or load your own image dataset = load_dataset("EPFL-ECEO/coralscapes") image = dataset["test"][42]["image"] preprocessor = SegformerImageProcessor.from_pretrained("EPFL-ECEO/segformer-b2-finetuned-coralscapes-1024-1024") model = SegformerForSemanticSegmentation.from_pretrained("EPFL-ECEO/segformer-b2-finetuned-coralscapes-1024-1024") label_pred = segment_image(image, preprocessor, model) ``` ## Training Details ### Training Data [More Information Needed] ### Training Procedure #### Preprocessing [optional] [More Information Needed] #### Training Hyperparameters - **Training regime:** [More Information Needed] #### Speeds, Sizes, Times [optional] [More Information Needed] ## Evaluation ### Testing Data, Factors & Metrics #### Testing Data [More Information Needed] #### Factors [More Information Needed] #### Metrics [More Information Needed] ### Results [More Information Needed] #### Summary ## Model Examination [optional] [More Information Needed] ## Environmental Impact Carbon emissions can be estimated using the [Machine Learning Impact calculator](https://mlco2.github.io/impact#compute) presented in [Lacoste et al. (2019)](https://arxiv.org/abs/1910.09700). - **Hardware Type:** [More Information Needed] - **Hours used:** [More Information Needed] - **Cloud Provider:** [More Information Needed] - **Compute Region:** [More Information Needed] - **Carbon Emitted:** [More Information Needed] ## Technical Specifications [optional] ### Model Architecture and Objective [More Information Needed] ### Compute Infrastructure [More Information Needed] #### Hardware [More Information Needed] #### Software [More Information Needed] ## Citation [optional] **BibTeX:** [More Information Needed] **APA:** [More Information Needed] ## Glossary [optional] [More Information Needed] ## More Information [optional] [More Information Needed] ## Model Card Authors [optional] [More Information Needed] ## Model Card Contact [More Information Needed]