| name | corridorkey-green-screen |
| description | AI-powered green screen keyer that unmixes foreground colors and generates clean linear alpha channels using neural networks |
| triggers | ["green screen keying with AI","remove green screen background","extract foreground from green screen","CorridorKey setup and usage","generate alpha matte from green screen","VFX green screen compositing Python","chroma key neural network unmixing","corridorkey inference pipeline"] |
CorridorKey Green Screen Keying
Skill by ara.so — Daily 2026 Skills collection.
CorridorKey is a neural network that solves the color unmixing problem in green screen footage. For every pixel — including semi-transparent ones from motion blur, hair, or out-of-focus edges — it predicts the true straight (un-premultiplied) foreground color and a clean linear alpha channel. It reads/writes 16-bit and 32-bit EXR files for VFX pipeline integration.
How It Works
Two inputs required per frame:
- RGB green screen image — sRGB or linear gamma, sRGB/REC709 gamut
- Alpha Hint — rough coarse B&W mask (doesn't need to be precise)
The model fills in fine detail from the hint; it's trained on blurry/eroded masks.
Installation
Prerequisites
- uv package manager (handles Python automatically)
- NVIDIA GPU with CUDA 12.8+ drivers (for GPU), or Apple M1+ (for MLX), or CPU fallback
Windows
# Double-click or run from terminal:
Install_CorridorKey_Windows.bat
# Optional heavy modules:
Install_GVM_Windows.bat
Install_VideoMaMa_Windows.bat
Linux / macOS
curl -LsSf https://astral.sh/uv/install.sh | sh
uv sync
uv sync --extra cuda
uv sync --extra mlx
mkdir -p CorridorKeyModule/checkpoints
Model download: https://huggingface.co/nikopueringer/CorridorKey_v1.0/resolve/main/CorridorKey_v1.0.pth
Optional Alpha Hint Generators
uv run hf download geyongtao/gvm --local-dir gvm_core/weights
uv run hf download SammyLim/VideoMaMa \
--local-dir VideoMaMaInferenceModule/checkpoints/VideoMaMa
uv run hf download stabilityai/stable-video-diffusion-img2vid-xt \
--local-dir VideoMaMaInferenceModule/checkpoints/stable-video-diffusion-img2vid-xt \
--include "feature_extractor/*" "image_encoder/*" "vae/*" "model_index.json"
Key CLI Commands
uv run python main.py run_inference --device cuda
uv run python main.py run_inference --device cpu
uv run python main.py run_inference --device mps
uv run python main.py list
uv run python main.py wizard
uv run python main.py wizard --win_path /path/to/ClipsForInference
Docker (Linux + NVIDIA GPU)
docker build -t corridorkey:latest .
docker run --rm -it --gpus all \
-e OPENCV_IO_ENABLE_OPENEXR=1 \
-v "$(pwd)/ClipsForInference:/app/ClipsForInference" \
-v "$(pwd)/Output:/app/Output" \
-v "$(pwd)/CorridorKeyModule/checkpoints:/app/CorridorKeyModule/checkpoints" \
corridorkey:latest run_inference --device cuda
docker compose build
docker compose --profile gpu run --rm corridorkey run_inference --device cuda
docker compose --profile gpu run --rm corridorkey list
NVIDIA_VISIBLE_DEVICES=0 docker compose --profile gpu run --rm corridorkey run_inference --device cuda
Directory Structure
CorridorKey/
├── ClipsForInference/ # Input shots go here
│ └── my_shot/
│ ├── frames/ # Green screen RGB frames (PNG/EXR)
│ ├── alpha_hints/ # Coarse alpha masks (grayscale)
│ └── VideoMamaMaskHint/ # Optional: hand-drawn hints for VideoMaMa
├── Output/ # Processed results
│ └── my_shot/
│ ├── foreground/ # Straight RGBA EXR frames
│ └── alpha/ # Linear alpha channel frames
├── CorridorKeyModule/
│ └── checkpoints/
│ └── CorridorKey.pth # Required model weights
├── gvm_core/weights/ # Optional GVM weights
└── VideoMaMaInferenceModule/
└── checkpoints/ # Optional VideoMaMa weights
Python Usage Examples
Basic Inference Pipeline
import torch
from pathlib import Path
from CorridorKeyModule.model import CorridorKeyModel
from CorridorKeyModule.inference import run_inference
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = CorridorKeyModel()
model.load_state_dict(torch.load("CorridorKeyModule/checkpoints/CorridorKey.pth"))
model.to(device)
model.eval()
run_inference(
shot_dir=Path("ClipsForInference/my_shot"),
output_dir=Path("Output/my_shot"),
device=device,
)
Reading/Writing EXR Files
import cv2
import numpy as np
import os
os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1"
frame = cv2.imread("frame_0001.exr", cv2.IMREAD_UNCHANGED | cv2.IMREAD_ANYCOLOR)
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
foreground_bgra = cv2.cvtColor(foreground, cv2.COLOR_RGBA2BGRA)
cv2.imwrite("output_0001.exr", foreground_bgra.astype(np.float32))
Generating a Coarse Alpha Hint with OpenCV
import cv2
import numpy as np
def generate_chroma_key_hint(image_bgr: np.ndarray, erode_px: int = 5) -> np.ndarray:
"""
Quick-and-dirty green screen hint for CorridorKey input.
Returns grayscale mask (0=background, 255=foreground).
"""
hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV)
lower_green = np.array([35, 50, 50])
upper_green = np.array([85, 255, 255])
green_mask = cv2.inRange(hsv, lower_green, upper_green)
foreground_mask = cv2.bitwise_not(green_mask)
kernel = np.ones((erode_px, erode_px), np.uint8)
eroded = cv2.erode(foreground_mask, kernel, iterations=2)
blurred = cv2.GaussianBlur(eroded, (15, 15), 5)
return blurred
frame = cv2.imread("greenscreen_frame.png")
hint = generate_chroma_key_hint(frame, erode_px=8)
cv2.imwrite("alpha_hint.png", hint)
Batch Processing Frames
from pathlib import Path
import cv2
import numpy as np
import os
os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1"
def prepare_shot_folder(
raw_frames_dir: Path,
output_shot_dir: Path,
hint_generator_fn=None
):
"""
Prepares a CorridorKey shot folder from raw green screen frames.
"""
frames_out = output_shot_dir / "frames"
hints_out = output_shot_dir / "alpha_hints"
frames_out.mkdir(parents=True, exist_ok=True)
hints_out.mkdir(parents=True, exist_ok=True)
frame_paths = sorted(raw_frames_dir.glob("*.png")) + \
sorted(raw_frames_dir.glob("*.exr"))
for frame_path in frame_paths:
frame = cv2.imread(str(frame_path), cv2.IMREAD_UNCHANGED | cv2.IMREAD_ANYCOLOR)
cv2.imwrite(str(frames_out / frame_path.name), frame)
if hint_generator_fn:
hint = hint_generator_fn(frame)
else:
hint = generate_chroma_key_hint(frame)
hint_name = frame_path.stem + ".png"
cv2.imwrite(str(hints_out / hint_name), hint)
print(f"Prepared {len(frame_paths)} frames in {output_shot_dir}")
prepare_shot_folder(
raw_frames_dir=Path("raw_footage/shot_01"),
output_shot_dir=Path("ClipsForInference/shot_01"),
)
Using clip_manager.py Alpha Hint Generators
from clip_manager import generate_alpha_hints_gvm
generate_alpha_hints_gvm(
shot_dir="ClipsForInference/my_shot",
device="cuda"
)
from clip_manager import generate_alpha_hints_videomama
generate_alpha_hints_videomama(
shot_dir="ClipsForInference/my_shot",
device="cuda"
)
from clip_manager import generate_alpha_hints_birefnet
generate_alpha_hints_birefnet(
shot_dir="ClipsForInference/my_shot",
device="cuda"
)
Alpha Hint Best Practices
kernel = np.ones((10, 10), np.uint8)
good_hint = cv2.erode(raw_mask, kernel, iterations=3)
good_hint = cv2.GaussianBlur(good_hint, (21, 21), 7)
bad_hint = cv2.dilate(raw_mask, kernel, iterations=3)
acceptable_hint = raw_chroma_key_mask
Output Integration (Nuke / Fusion / Resolve)
CorridorKey outputs straight (un-premultiplied) RGBA EXRs in linear light:
import cv2, numpy as np, os
os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1"
result = cv2.imread("Output/shot_01/foreground/frame_0001.exr",
cv2.IMREAD_UNCHANGED | cv2.IMREAD_ANYCOLOR)
h, w = result.shape[:2]
sample_alpha = result[h//2, w//2, 3]
sample_color = result[h//2, w//2, :3]
print(f"Alpha: {sample_alpha:.3f}, Color: {sample_color}")
Troubleshooting
CUDA not detected / falling back to CPU
nvidia-smi
uv sync --extra cuda
uv run python -c "import torch; print(torch.cuda.is_available(), torch.version.cuda)"
OpenEXR read/write fails
export OPENCV_IO_ENABLE_OPENEXR=1
uv run python your_script.py
import os
os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1"
import cv2
Out of VRAM
uv run python main.py run_inference --device cpu
uv run python main.py run_inference --device mps
Model file not found
ls CorridorKeyModule/checkpoints/
mv CorridorKeyModule/checkpoints/CorridorKey_v1.0.pth \
CorridorKeyModule/checkpoints/CorridorKey.pth
Docker GPU passthrough fails
docker run --rm --gpus all nvidia/cuda:12.6.3-runtime-ubuntu22.04 nvidia-smi
sudo systemctl restart docker
Poor keying results
- Hint too expanded: Erode your alpha hint more — CorridorKey is better at adding edge detail than removing unwanted mask area
- Wrong color space: Ensure input is sRGB/REC709 gamut; don't pass log-encoded footage directly
- Green spill: The model handles color unmixing, but extreme green spill in source may degrade results; consider a despill pass before inference
- Static subjects: GVM works best on people; try VideoMaMa with a hand-drawn hint for props/objects
Community & Resources