DAVIS - Video Object Segmentation with Mask Propagation
Semi-supervised video object segmentation on DAVIS (Pont-Tuset et al., 2017): mask each object on the first frame, then propagate it through the clip with SAM 2 and correct the frames where it drifts.
About this dataset
DAVIS, for Densely Annotated VIdeo Segmentation, is the reference benchmark for video object segmentation. The 2017 challenge was presented by Jordi Pont-Tuset, Federico Perazzi, Sergi Caelles, Pablo Arbelaez, Alexander Sorkine-Hornung and Luc Van Gool in "The 2017 DAVIS Challenge on Video Object Segmentation", with a dedicated workshop co-located with CVPR 2017. It comprises a dataset, an evaluation methodology and a public competition.
In the semi-supervised task the ground-truth mask for the first frame is given, and a method must segment the same object or objects through the remaining frames. DAVIS 2017 extended the single-object setting of the earlier DAVIS release to multiple objects within a clip. Official metrics are computed on images and annotations at 480p, with full-resolution frames also published.
In Potato this becomes an annotation workflow rather than a scoring harness. The annotator masks each object once, presses Track forward, and SAM 2 propagates the mask through the frames that follow, each result arriving as a keyframe they can scrub through and correct. Correcting a frame re-anchors the track from that point.
Propagation runs on the server by deliberate choice. The cost is per frame rather than per prompt and the model is large, so a hundred frames of it in a browser tab would be minutes of frozen UI. Potato's in-browser path is a separate, lighter carry-forward that re-prompts frame to frame; the two should not be confused. Measured against known ground truth, server-side propagation holds a per-frame IoU of 0.974 to 0.979 with no decay from the first frame to the last, at roughly 1.32 seconds per frame on CPU.
The model decides for itself when an object is occluded and returns an empty frame rather than guessing, which is the behaviour you want while correcting: a guessed mask on a hidden frame is work to undo. DAVIS sequences are chosen to exercise exactly these cases, so the config also asks the annotator to tag what made each clip hard. Masks are held rather than blended across interpolated frames and held frames are marked in the timeline.
Every clip is masked twice, independently, which is what makes mask agreement computable. Potato resolves mask consensus with STAPLE, which estimates a latent boundary together with each rater's sensitivity and specificity instead of taking a per-pixel majority vote. On a corpus where two careful annotators are outnumbered three-to-two by noisy ones, majority vote scores Dice 0.846 against truth where STAPLE scores 1.000.
- Task
- Semi-supervised video object segmentation
- Given at inference
- First-frame mask
- Objects per clip
- One or more (multi-object from 2017)
- Official metric resolution
- 480p
- Venue / Year
- CVPR 2017 workshop
Configuration Fileconfig.yaml
This Potato config reproduces the annotation task. Save it as config.yaml and run potato start config.yaml to try it.
# yaml-language-server: $schema=https://potatoannotator.readthedocs.io/en/latest/schemas/potato-config.schema.json
#
# DAVIS — Video Object Segmentation with Mask Propagation
#
# Paper: Pont-Tuset, Perazzi, Caelles, Arbelaez, Sorkine-Hornung & Van Gool,
# "The 2017 DAVIS Challenge on Video Object Segmentation"
# https://arxiv.org/abs/1704.00675
# Dataset: https://davischallenge.org/
#
# DAVIS (Densely Annotated VIdeo Segmentation) is the reference benchmark for
# video object segmentation. In the semi-supervised task the annotator is given
# the ground-truth mask on the first frame and the object must be segmented
# through the rest of the clip. Official metrics are computed at 480p, though
# full-resolution frames are published as well.
#
# This is exactly the loop Potato's mask propagation was built for: mask the
# object once, press Track forward, and SAM 2 follows it through the frames
# that follow, each result arriving as a keyframe you can scrub through and
# correct.
#
# Reproduction notes
# ------------------
# `mode: tracking` gives the propagation workflow. Propagation runs on the
# server by design: the cost is per frame rather than per prompt, and a hundred
# frames of a video model in the browser would be minutes of a frozen tab. The
# browser has a separate, lighter carry-forward path; the two are not the same
# thing.
#
# The model decides for itself when an object is occluded and returns an empty
# frame rather than guessing, which is the behaviour you want while correcting:
# a guessed mask on a hidden frame is work to undo. DAVIS sequences are chosen
# for exactly these cases, so expect it.
#
# Masks are held rather than blended across interpolated frames, and held
# frames are marked in the timeline. An honest representation beats a smooth
# wrong one.
#
# Multi-object sequences: add one label per object identity. DAVIS 2017 moved
# from the single-object setting of DAVIS 2016 to multiple objects per clip,
# and instance-keyed masks keep them separate.
#
# Two annotators per clip, so mask agreement is defined. Potato resolves mask
# consensus with STAPLE, which estimates a latent boundary along with each
# rater's sensitivity and specificity, rather than taking a majority vote per
# pixel.
port: 8000
annotation_task_name: "DAVIS - Video Object Segmentation"
task_dir: "."
media_directory: media
output_annotation_dir: "annotation_output/"
output_annotation_format: "json"
data_files:
- sample-data.json
item_properties:
id_key: "id"
text_key: "video_url"
user_config:
allow_all_users: true
users: []
num_annotators_per_item:
default: 2
annotation_schemes:
- annotation_type: video_annotation
name: object_masks
description: "Mask each object on the first frame, then track it through the clip."
source_field: video_url
mode: tracking
labels:
- name: object_1
color: "#d1495b"
key_value: "1"
- name: object_2
color: "#2f9e6f"
key_value: "2"
- name: object_3
color: "#6e56cf"
key_value: "3"
tracking_options:
interpolation: linear
auto_advance_frames: 5
video_fps: 24
show_timecode: true
frame_stepping: true
zoom_enabled: true
- annotation_type: multiselect
name: difficulties
description: "Which of these make this clip hard? (select all that apply)"
labels:
- name: occlusion
tooltip: "The object is hidden, fully or partly, for some frames"
- name: fast_motion
tooltip: "The object moves far between consecutive frames"
- name: motion_blur
tooltip: "The object's edges are blurred by motion"
- name: deformation
tooltip: "The object changes shape substantially"
- name: scale_variation
tooltip: "The object's size changes substantially"
- name: appearance_change
tooltip: "Lighting or viewpoint changes the object's appearance"
- name: similar_objects
tooltip: "Another object of the same category could be confused with it"
- annotation_type: text
name: notes
description: "Where did tracking need the most correction? (optional)"
annotation_instructions: |
Each clip contains one or more objects to segment through time.
1. On the first frame, mask each object. Use click-to-segment for a first
pass and the brush to correct the boundary.
2. Press Track forward. The mask is propagated through the following frames
and each result arrives as a keyframe.
3. Scrub through the keyframes and correct any frame where the mask has
drifted. Correcting a frame re-anchors the track from that point.
If the object is fully hidden on a frame, leave it empty. An empty frame is
the correct answer for an occluded object, and the model will usually return
one rather than guessing.
Mask the whole object including parts that are thin or low-contrast. Where
the object is partly occluded, mask only the visible part.
Finally, tag what made the clip hard. These attributes are what DAVIS
sequences were selected to exercise.
Sample Datasample-data.json
[
{
"id": "davis_001",
"video_url": "sequences/blackswan.mp4",
"sequence": "blackswan",
"first_frame_mask": "annotations/blackswan/00000.png",
"context": "A swan glides across water; reflections and ripples confuse the boundary."
},
{
"id": "davis_002",
"video_url": "sequences/bmx-trees.mp4",
"sequence": "bmx-trees",
"first_frame_mask": "annotations/bmx-trees/00000.png",
"context": "A rider passes behind trees, so the object is repeatedly occluded."
}
]
// ... and 8 more itemsGet This Design
Clone or download from the repository
Quick start:
git clone https://github.com/davidjurgens/potato-showcase.git cd potato-showcase/video/segmentation/davis-video-object-segmentation potato start config.yaml
Dataset & paper
Pont-Tuset et al., 2017
Citation (BibTeX)
@article{ponttuset2017davis,
title = {The 2017 {DAVIS} Challenge on Video Object Segmentation},
author = {Pont-Tuset, Jordi and Perazzi, Federico and Caelles, Sergi and Arbel\'aez, Pablo and Sorkine-Hornung, Alexander and Van Gool, Luc},
journal = {arXiv:1704.00675},
year = {2017}
}Details
Annotation Types
Domain
Use Cases
Tags
Found an issue or want to improve this design?
Open an IssueRelated Designs
ActivityNet Captions: Dense Video Captioning Dataset
ActivityNet Captions pairs 20k untrimmed videos with 100k temporally localized sentence descriptions for dense-captioning research. This Potato config reproduces the segment-and-describe workflow.
AVA: Atomic Visual Actions Dataset
AVA spatio-temporally localizes 80 atomic actions on people in movie clips, labeled at 1 Hz keyframes. This Potato config reproduces the box-and-action labeling task for video clips.
FineDiving: Procedure-aware Action Quality Assessment
Fine-grained diving action quality assessment. Annotators mark a dive and its consecutive sub-action steps on the timeline, then record the dive type, difficulty degree, and scores (Xu et al., CVPR 2022).