This repo will be used to build a project for Video Object Removal & Inpainting
Python
0
36 commits
updated May 12, 2026
This repository implements a three-stage video object removal workflow.
The previous long-form README has been preserved as README_Outdated.md.
parkour and dance-twirl are integrated into the same CLI workflow as bmx-trees and tennis.src/common/figure_scripts/generate_metric_figures_davis.py into results/visualizations/figures/davis/.--max-frames now write to isolated output names such as {sequence}_maxframes2 and no longer overwrite full-run results.Commands below assume the Conda environment is named project3 and are run from the repository root.
conda activate project3
pip install -r requirements.txt
Expected model locations:
models/yolo_v8_seg/yolov8x-seg.ptmodels/sam2/checkpoints/models/ProPainter/weights/models/sam3/checkpoints/sam3.ptmodels/controlnet/Supported sequence keys are defined in configs/common.yaml.
bmx-treestennisparkourdance-twirldata/raw/davis/DAVIS/JPEGImages/480p/Supported aliases:
bmx_trees -> bmx-treesdance_twirl -> dance-twirlPart 1 combines:
src/part1_baseline/pipeline_part1.pysrc/part1_baseline/mask_extraction_yolo.pysrc/part1_baseline/dynamic_judgment.pysrc/part1_baseline/inpaint_traditional.pysrc/common/configs/common.yamlconfigs/part1_baseline.yamlperson, bicycledynamic_filter, postprocess, inpainting, visualizationresults/masks/part1/{sequence}/results/videos/part1/{sequence}_part1.mp4results/visualizations/part1/{sequence}/results/metrics/part1/{sequence}/Run the default Part 1 sequence:
python src/part1_baseline/pipeline_part1.py \
--common-config configs/common.yaml \
--phase-config configs/part1_baseline.yaml
Run a specific sequence:
python src/part1_baseline/pipeline_part1.py \
--sequence parkour \
--common-config configs/common.yaml \
--phase-config configs/part1_baseline.yaml
Quick smoke test:
python src/part1_baseline/pipeline_part1.py \
--sequence bmx-trees \
--max-frames 3 \
--common-config configs/common.yaml \
--phase-config configs/part1_baseline.yaml
Wrapper script:
bash scripts/run_part1.sh
Standard evaluation:
python scripts/evaluate_metrics.py \
--phase-config configs/part1_baseline.yaml \
--sequence parkour
Optional short evaluation:
python scripts/evaluate_metrics.py \
--phase-config configs/part1_baseline.yaml \
--sequence parkour \
--max-frames 3
If --reference-frames-dir is not provided, PSNR and SSIM are computed in background_preservation mode.
Each sequence visualization folder contains:
motion_scores/mask_overlays/comparisons/These assets are used for debugging and report figures.
Part 2 combines:
src/part2_sota/pipeline_part2.pysrc/part2_sota/prompt_utils.pysrc/part2_sota/mask_sam2.pysrc/part2_sota/inpaint_pro_painter.pyconfigs/common.yamlconfigs/part2_sota.yamlprompts: blockparkour and dance-twirl are already configuredresults/masks/part2/{sequence}/objects/results/masks/part2/{sequence}/combined/results/videos/part2/{sequence}_inpainted.mp4results/visualizations/part2/{sequence}/results/metrics/part2/{sequence}/Run the default Part 2 sequence:
python src/part2_sota/pipeline_part2.py \
--common-config configs/common.yaml \
--phase-config configs/part2_sota.yaml
Run a specific sequence:
python src/part2_sota/pipeline_part2.py \
--sequence dance-twirl \
--common-config configs/common.yaml \
--phase-config configs/part2_sota.yaml
Wrapper script:
bash scripts/run_part2.sh
python scripts/evaluate_metrics.py \
--phase-config configs/part2_sota.yaml \
--sequence dance-twirl
The evaluator automatically resolves the standard Part 2 video name and uses combined/ masks for overall foreground evaluation.
Each sequence visualization folder contains:
motion_scores/ for object overlaysmask_overlays/comparisons/Part 3 combines:
src/part3_exploration/pipeline_part3.pysrc/part3_exploration/sam3_upgrade.pysrc/part3_exploration/diffusion_controlnet.pysrc/part3_exploration/dynamic_masking_loop.pyconfigs/common.yamlconfigs/part3_exploration.yamlrefinement, postprocess, visualization, exportresults/masks/part3/{sequence}/objects/results/masks/part3/{sequence}/combined/results/masks/part3/{sequence}/keyframes/results/masks/part3/{sequence}/sd_blend_frames/ and sd_blend_masks/results/videos/part3/{sequence}_part3.mp4results/visualizations/part3/{sequence}/results/metrics/part3/{sequence}/If --max-frames N is used, Part 3 writes to isolated names such as results/masks/part3/{sequence}_maxframesN/ and results/videos/part3/{sequence}_maxframesN_part3.mp4.
Run the default Part 3 sequence:
python src/part3_exploration/pipeline_part3.py \
--common-config configs/common.yaml \
--phase-config configs/part3_exploration.yaml
Run a specific sequence:
python src/part3_exploration/pipeline_part3.py \
--sequence parkour \
--common-config configs/common.yaml \
--phase-config configs/part3_exploration.yaml
Short smoke test without overwriting the full run:
python src/part3_exploration/pipeline_part3.py \
--sequence parkour \
--max-frames 2 \
--common-config configs/common.yaml \
--phase-config configs/part3_exploration.yaml
Wrapper script:
bash scripts/run_part3.sh
python scripts/evaluate_metrics.py \
--phase-config configs/part3_exploration.yaml \
--sequence parkour
Part 3 uses the same evaluation interface as Part 1 and Part 2.
Each sequence visualization folder contains:
motion_scores/ for refined candidate overlaysmask_overlays/comparisons/DAVIS-only metric figures for parkour and dance-twirl can be generated with:
python src/common/figure_scripts/generate_metric_figures_davis.py \
--metrics-root results/metrics \
--output-dir results/visualizations/figures/davis
```# Video Object Removal and Inpainting
This repository implements a staged video object removal project. The currently implemented pipelines cover Part 1 as a classical baseline built around YOLOv8-Seg, sparse optical flow, temporal background propagation, and traditional image inpainting, plus Part 2 as a higher-quality SOTA pipeline built around SAM2 mask propagation and ProPainter video inpainting.
Part 1 is no longer just a mask extraction demo. It now runs a full baseline pipeline:
1. Detect candidate dynamic classes with YOLOv8-Seg.
2. Use Lucas-Kanade sparse optical flow to decide whether each detected instance is actually moving.
3. Postprocess masks with dilation, hole filling, connected-component cleanup, and short temporal smoothing.
4. Restore the video by borrowing clean background pixels from nearby frames first.
5. Fill any remaining holes with `cv2.inpaint` using Telea or Navier-Stokes.
6. Export masks, restored video, visualization artifacts, and evaluation metrics.
## Current Status
- Part 1 baseline: implemented and validated.
- Part 2 SOTA pipeline: implemented; requires SAM2 and ProPainter assets under `models/sam2` and `models/ProPainter`.
- Part 3 exploration pipeline: interface scaffold only.
## Environment
The commands below assume the Conda environment is named `project3`.
```bash
conda activate project3
pip install -r requirements.txt
Expected Part 1 model weight path:
models/yolo_v8_seg/yolov8x-seg.pt
If the weight file is missing, place the YOLOv8 segmentation checkpoint at that location or update configs/part1_baseline.yaml.
Expected Part 2 model roots:
models/sam2
models/ProPainter
The SAM2 repository should include checkpoints under models/sam2/checkpoints/. ProPainter weights are downloaded into models/ProPainter/weights/ on first use.
Run all evaluation commands in sequence with:
bash run_all_metrics.sh
src/common/figure_scripts/ contains the figure-generation entrypoints and shared plotting modules used to convert metric CSVs into publication-style PNG figures.
generate_metric_figures.py generates the main figure suite under results/visualizations/figures/generate_metric_figures_davis.py generates the DAVIS-only figure suite for parkour and dance-twirl under results/visualizations/figures/davis/generate_wild_comparison.py generates the Wild Video qualitative comparison figuremetric_figure_data.py, metric_figure_plots.py, metric_figure_output.py, and metric_figure_constants.py provide the shared data loading, plotting, output, and naming logicRun all three figure-generation commands in sequence with:
bash run_all_figure.sh
Before generating figures, make sure metric CSVs already exist under results/metrics/{part1,part2,part3}/{sequence}/.
Typical workflow:
python scripts/evaluate_metrics.py --phase-config configs/part1_baseline.yaml --sequence parkour
python scripts/evaluate_metrics.py --phase-config configs/part2_sota.yaml --sequence parkour
python scripts/evaluate_metrics.py --phase-config configs/part3_exploration.yaml --sequence parkour
Repeat that for every sequence you want included in the plots.
Generate the overall figure set:
python src/common/figure_scripts/generate_metric_figures.py \
--metrics-root results/metrics \
--output-dir results/visualizations/figures
This writes summary CSVs, a generated README manifest, distribution plots, frame-wise trend plots, paired-delta figures, heatmaps, and summary tables into results/visualizations/figures/.
Generate the DAVIS-only figure set:
python src/common/figure_scripts/generate_metric_figures_davis.py \
--metrics-root results/metrics \
--output-dir results/visualizations/figures/davis
This writes the same style of metric visualizations, but restricted to parkour and dance-twirl.
Generate the Wild Video qualitative comparison figure:
python src/common/figure_scripts/generate_wild_comparison.py
metric_figure_plots.py.This repo will be used to build a project for Video Object Removal & Inpainting
Python
0
36 commits
updated May 12, 2026
This repository implements a three-stage video object removal workflow.
The previous long-form README has been preserved as README_Outdated.md.
parkour and dance-twirl are integrated into the same CLI workflow as bmx-trees and tennis.src/common/figure_scripts/generate_metric_figures_davis.py into results/visualizations/figures/davis/.--max-frames now write to isolated output names such as {sequence}_maxframes2 and no longer overwrite full-run results.Commands below assume the Conda environment is named project3 and are run from the repository root.
conda activate project3
pip install -r requirements.txt
Expected model locations:
models/yolo_v8_seg/yolov8x-seg.ptmodels/sam2/checkpoints/models/ProPainter/weights/models/sam3/checkpoints/sam3.ptmodels/controlnet/Supported sequence keys are defined in configs/common.yaml.
bmx-treestennisparkourdance-twirldata/raw/davis/DAVIS/JPEGImages/480p/Supported aliases:
bmx_trees -> bmx-treesdance_twirl -> dance-twirlPart 1 combines:
src/part1_baseline/pipeline_part1.pysrc/part1_baseline/mask_extraction_yolo.pysrc/part1_baseline/dynamic_judgment.pysrc/part1_baseline/inpaint_traditional.pysrc/common/configs/common.yamlconfigs/part1_baseline.yamlperson, bicycledynamic_filter, postprocess, inpainting, visualizationresults/masks/part1/{sequence}/results/videos/part1/{sequence}_part1.mp4results/visualizations/part1/{sequence}/results/metrics/part1/{sequence}/Run the default Part 1 sequence:
python src/part1_baseline/pipeline_part1.py \
--common-config configs/common.yaml \
--phase-config configs/part1_baseline.yaml
Run a specific sequence:
python src/part1_baseline/pipeline_part1.py \
--sequence parkour \
--common-config configs/common.yaml \
--phase-config configs/part1_baseline.yaml
Quick smoke test:
python src/part1_baseline/pipeline_part1.py \
--sequence bmx-trees \
--max-frames 3 \
--common-config configs/common.yaml \
--phase-config configs/part1_baseline.yaml
Wrapper script:
bash scripts/run_part1.sh
Standard evaluation:
python scripts/evaluate_metrics.py \
--phase-config configs/part1_baseline.yaml \
--sequence parkour
Optional short evaluation:
python scripts/evaluate_metrics.py \
--phase-config configs/part1_baseline.yaml \
--sequence parkour \
--max-frames 3
If --reference-frames-dir is not provided, PSNR and SSIM are computed in background_preservation mode.
Each sequence visualization folder contains:
motion_scores/mask_overlays/comparisons/These assets are used for debugging and report figures.
Part 2 combines:
src/part2_sota/pipeline_part2.pysrc/part2_sota/prompt_utils.pysrc/part2_sota/mask_sam2.pysrc/part2_sota/inpaint_pro_painter.pyconfigs/common.yamlconfigs/part2_sota.yamlprompts: blockparkour and dance-twirl are already configuredresults/masks/part2/{sequence}/objects/results/masks/part2/{sequence}/combined/results/videos/part2/{sequence}_inpainted.mp4results/visualizations/part2/{sequence}/results/metrics/part2/{sequence}/Run the default Part 2 sequence:
python src/part2_sota/pipeline_part2.py \
--common-config configs/common.yaml \
--phase-config configs/part2_sota.yaml
Run a specific sequence:
python src/part2_sota/pipeline_part2.py \
--sequence dance-twirl \
--common-config configs/common.yaml \
--phase-config configs/part2_sota.yaml
Wrapper script:
bash scripts/run_part2.sh
python scripts/evaluate_metrics.py \
--phase-config configs/part2_sota.yaml \
--sequence dance-twirl
The evaluator automatically resolves the standard Part 2 video name and uses combined/ masks for overall foreground evaluation.
Each sequence visualization folder contains:
motion_scores/ for object overlaysmask_overlays/comparisons/Part 3 combines:
src/part3_exploration/pipeline_part3.pysrc/part3_exploration/sam3_upgrade.pysrc/part3_exploration/diffusion_controlnet.pysrc/part3_exploration/dynamic_masking_loop.pyconfigs/common.yamlconfigs/part3_exploration.yamlrefinement, postprocess, visualization, exportresults/masks/part3/{sequence}/objects/results/masks/part3/{sequence}/combined/results/masks/part3/{sequence}/keyframes/results/masks/part3/{sequence}/sd_blend_frames/ and sd_blend_masks/results/videos/part3/{sequence}_part3.mp4results/visualizations/part3/{sequence}/results/metrics/part3/{sequence}/If --max-frames N is used, Part 3 writes to isolated names such as results/masks/part3/{sequence}_maxframesN/ and results/videos/part3/{sequence}_maxframesN_part3.mp4.
Run the default Part 3 sequence:
python src/part3_exploration/pipeline_part3.py \
--common-config configs/common.yaml \
--phase-config configs/part3_exploration.yaml
Run a specific sequence:
python src/part3_exploration/pipeline_part3.py \
--sequence parkour \
--common-config configs/common.yaml \
--phase-config configs/part3_exploration.yaml
Short smoke test without overwriting the full run:
python src/part3_exploration/pipeline_part3.py \
--sequence parkour \
--max-frames 2 \
--common-config configs/common.yaml \
--phase-config configs/part3_exploration.yaml
Wrapper script:
bash scripts/run_part3.sh
python scripts/evaluate_metrics.py \
--phase-config configs/part3_exploration.yaml \
--sequence parkour
Part 3 uses the same evaluation interface as Part 1 and Part 2.
Each sequence visualization folder contains:
motion_scores/ for refined candidate overlaysmask_overlays/comparisons/DAVIS-only metric figures for parkour and dance-twirl can be generated with:
python src/common/figure_scripts/generate_metric_figures_davis.py \
--metrics-root results/metrics \
--output-dir results/visualizations/figures/davis
```# Video Object Removal and Inpainting
This repository implements a staged video object removal project. The currently implemented pipelines cover Part 1 as a classical baseline built around YOLOv8-Seg, sparse optical flow, temporal background propagation, and traditional image inpainting, plus Part 2 as a higher-quality SOTA pipeline built around SAM2 mask propagation and ProPainter video inpainting.
Part 1 is no longer just a mask extraction demo. It now runs a full baseline pipeline:
1. Detect candidate dynamic classes with YOLOv8-Seg.
2. Use Lucas-Kanade sparse optical flow to decide whether each detected instance is actually moving.
3. Postprocess masks with dilation, hole filling, connected-component cleanup, and short temporal smoothing.
4. Restore the video by borrowing clean background pixels from nearby frames first.
5. Fill any remaining holes with `cv2.inpaint` using Telea or Navier-Stokes.
6. Export masks, restored video, visualization artifacts, and evaluation metrics.
## Current Status
- Part 1 baseline: implemented and validated.
- Part 2 SOTA pipeline: implemented; requires SAM2 and ProPainter assets under `models/sam2` and `models/ProPainter`.
- Part 3 exploration pipeline: interface scaffold only.
## Environment
The commands below assume the Conda environment is named `project3`.
```bash
conda activate project3
pip install -r requirements.txt
Expected Part 1 model weight path:
models/yolo_v8_seg/yolov8x-seg.pt
If the weight file is missing, place the YOLOv8 segmentation checkpoint at that location or update configs/part1_baseline.yaml.
Expected Part 2 model roots:
models/sam2
models/ProPainter
The SAM2 repository should include checkpoints under models/sam2/checkpoints/. ProPainter weights are downloaded into models/ProPainter/weights/ on first use.
Run all evaluation commands in sequence with:
bash run_all_metrics.sh
src/common/figure_scripts/ contains the figure-generation entrypoints and shared plotting modules used to convert metric CSVs into publication-style PNG figures.
generate_metric_figures.py generates the main figure suite under results/visualizations/figures/generate_metric_figures_davis.py generates the DAVIS-only figure suite for parkour and dance-twirl under results/visualizations/figures/davis/generate_wild_comparison.py generates the Wild Video qualitative comparison figuremetric_figure_data.py, metric_figure_plots.py, metric_figure_output.py, and metric_figure_constants.py provide the shared data loading, plotting, output, and naming logicRun all three figure-generation commands in sequence with:
bash run_all_figure.sh
Before generating figures, make sure metric CSVs already exist under results/metrics/{part1,part2,part3}/{sequence}/.
Typical workflow:
python scripts/evaluate_metrics.py --phase-config configs/part1_baseline.yaml --sequence parkour
python scripts/evaluate_metrics.py --phase-config configs/part2_sota.yaml --sequence parkour
python scripts/evaluate_metrics.py --phase-config configs/part3_exploration.yaml --sequence parkour
Repeat that for every sequence you want included in the plots.
Generate the overall figure set:
python src/common/figure_scripts/generate_metric_figures.py \
--metrics-root results/metrics \
--output-dir results/visualizations/figures
This writes summary CSVs, a generated README manifest, distribution plots, frame-wise trend plots, paired-delta figures, heatmaps, and summary tables into results/visualizations/figures/.
Generate the DAVIS-only figure set:
python src/common/figure_scripts/generate_metric_figures_davis.py \
--metrics-root results/metrics \
--output-dir results/visualizations/figures/davis
This writes the same style of metric visualizations, but restricted to parkour and dance-twirl.
Generate the Wild Video qualitative comparison figure:
python src/common/figure_scripts/generate_wild_comparison.py
metric_figure_plots.py.