Roboflow 2.0

Use the Roboflow 2.0 semantic segmentation model through our Serverless Hosted API

Roboflow 2.0 is a DeepLabv3-based semantic segmentation model. You train Roboflow 2.0 models on the Roboflow platform and deploy them through our Serverless Hosted API.

For self-hosted deployment, see Roboflow Inference.

Roboflow 2.0 has no public default models. You call your own trained model using its project/version identifier from your Roboflow Project.

Code sample

Install the Inference SDK and supervision:

pip install inference-sdk supervision

Run inference against a Roboflow 2.0 semantic segmentation model you have trained, decode the per-pixel class map, and write an annotated PNG. Replace your-project/1 with your model URL and version. Pass your Roboflow API Key via the API_KEY environment variable.

The response contains a segmentation_mask (base64-encoded grayscale PNG where each pixel value is a class ID and 0 is background) and a class_map mapping class IDs to class names. The script splits that into one sv.Detections row per class so sv.MaskAnnotator can overlay the masks on the source image.

import base64
import os
import urllib.request

import cv2
import numpy as np
import supervision as sv
from inference_sdk import InferenceHTTPClient

image_url = "https://storage.googleapis.com/com-roboflow-marketing/notebooks/examples/bicycle.png"
image_path = "bicycle.png"
urllib.request.urlretrieve(image_url, image_path)

image = cv2.imread(image_path)
OUTPUT_PATH = "annotated.png"

client = InferenceHTTPClient(
    api_url="https://serverless.roboflow.com",
    api_key=os.getenv("API_KEY"),
)
result = client.infer(image, model_id="your-project/1")
predictions = result["predictions"]

mask_bytes = base64.b64decode(predictions["segmentation_mask"])
class_map = predictions.get("class_map", {})
class_mask = cv2.imdecode(np.frombuffer(mask_bytes, np.uint8), cv2.IMREAD_GRAYSCALE)
class_mask = cv2.resize(class_mask, (image.shape[1], image.shape[0]), interpolation=cv2.INTER_NEAREST)

class_ids = [cid for cid in np.unique(class_mask).tolist() if cid != 0]
if class_ids:
    masks, xyxy, names = [], [], []
    for cid in class_ids:
        binary = class_mask == cid
        rows = np.where(np.any(binary, axis=1))[0]
        cols = np.where(np.any(binary, axis=0))[0]
        xyxy.append([cols[0], rows[0], cols[-1], rows[-1]])
        masks.append(binary)
        names.append(class_map.get(str(cid), str(cid)))

    detections = sv.Detections(
        xyxy=np.array(xyxy, dtype=np.float64),
        mask=np.array(masks),
        class_id=np.array(class_ids),
        data={"class_name": np.array(names)},
    )
    annotated = sv.MaskAnnotator().annotate(scene=image.copy(), detections=detections)
    annotated = sv.LabelAnnotator().annotate(scene=annotated, detections=detections)
else:
    annotated = image

cv2.imwrite(OUTPUT_PATH, annotated)
print(f"Saved {OUTPUT_PATH}")

Set api_url to match your deployment target:

  • https://serverless.roboflow.com for the Serverless Hosted API.

  • http://localhost:9001 for a local Inference server.

  • Your Dedicated Deployment URL for a private endpoint.

Last updated

Was this helpful?