Spaces:
Runtime error
Runtime error
Updated version with ProPainter integration
Browse files- Dockerfile +60 -0
- README.md +2 -4
- app.py +35 -14
- requirements.txt +0 -10
Dockerfile
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
|
2 |
+
|
3 |
+
ENV DEBIAN_FRONTEND=noninteractive
|
4 |
+
|
5 |
+
#RUN apt-get update && apt-get install -y \
|
6 |
+
# git wget libgl1-mesa-glx libglib2.0-0 ffmpeg libx264-dev \
|
7 |
+
# && rm -rf /var/lib/apt/lists/*
|
8 |
+
|
9 |
+
RUN apt-get update && apt-get install -y \
|
10 |
+
git make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
|
11 |
+
libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev \
|
12 |
+
libxmlsec1-dev libffi-dev liblzma-dev git-lfs ffmpeg libsm6 libxext6 cmake \
|
13 |
+
libgl1-mesa-glx \
|
14 |
+
&& rm -rf /var/lib/apt/lists/* && git lfs install
|
15 |
+
|
16 |
+
RUN useradd -m -u 1000 user
|
17 |
+
|
18 |
+
USER user
|
19 |
+
|
20 |
+
ENV HOME=/home/user \
|
21 |
+
PATH=/home/user/.local/bin:$PATH \
|
22 |
+
PYTHONPATH=$HOME/app \
|
23 |
+
PYTHONUNBUFFERED=1 \
|
24 |
+
GRADIO_ALLOW_FLAGGING=never \
|
25 |
+
GRADIO_NUM_PORTS=1 \
|
26 |
+
GRADIO_SERVER_NAME=0.0.0.0 \
|
27 |
+
GRADIO_THEME=huggingface \
|
28 |
+
GRADIO_SHARE=False \
|
29 |
+
SYSTEM=spaces
|
30 |
+
|
31 |
+
# Set the working directory to the user's home directory
|
32 |
+
WORKDIR $HOME/app
|
33 |
+
|
34 |
+
# Clone your repository or add your code to the container
|
35 |
+
RUN git clone https://github.com/sczhou/ProPainter.git $HOME/app
|
36 |
+
|
37 |
+
# Install specific versions of PyTorch and TorchVision
|
38 |
+
RUN pip install torch==2.0.1+cu117 torchvision==0.15.2+cu117 -f https://download.pytorch.org/whl/torch_stable.html
|
39 |
+
|
40 |
+
# Install dependencies
|
41 |
+
RUN pip install --no-cache-dir -r requirements.txt \
|
42 |
+
gradio==3.50.2 opencv-python transformers supervision
|
43 |
+
|
44 |
+
# Download weights
|
45 |
+
RUN mkdir -p $HOME/app/weigths
|
46 |
+
RUN wget -c -O $HOME/app/weigths/i3d_rgb_imagenet.pt https://huggingface.co/camenduru/ProPainter/resolve/main/i3d_rgb_imagenet.pt
|
47 |
+
RUN wget -c -O $HOME/app/weights/raft-things.pth https://huggingface.co/camenduru/ProPainter/resolve/main/raft-things.pth
|
48 |
+
RUN wget -c -O $HOME/app/weights/recurrent_flow_completion.pth https://huggingface.co/camenduru/ProPainter/resolve/main/recurrent_flow_completion.pth
|
49 |
+
RUN wget -c -O $HOME/app/weights/ProPainter.pth https://huggingface.co/camenduru/ProPainter/resolve/main/ProPainter.pth
|
50 |
+
|
51 |
+
COPY app.py .
|
52 |
+
|
53 |
+
RUN find $HOME/app
|
54 |
+
|
55 |
+
# Set the environment variable to specify the GPU device
|
56 |
+
ENV CUDA_DEVICE_ORDER=PCI_BUS_ID
|
57 |
+
ENV CUDA_VISIBLE_DEVICES=0
|
58 |
+
|
59 |
+
# Run your app.py script
|
60 |
+
CMD ["python", "app.py"]
|
README.md
CHANGED
@@ -1,11 +1,9 @@
|
|
1 |
---
|
2 |
title: SAM And ProPainter
|
3 |
-
emoji:
|
4 |
colorFrom: pink
|
5 |
colorTo: purple
|
6 |
-
sdk:
|
7 |
-
sdk_version: 3.50.2
|
8 |
-
app_file: app.py
|
9 |
pinned: false
|
10 |
---
|
11 |
|
|
|
1 |
---
|
2 |
title: SAM And ProPainter
|
3 |
+
emoji: π¨βπ¨
|
4 |
colorFrom: pink
|
5 |
colorTo: purple
|
6 |
+
sdk: docker
|
|
|
|
|
7 |
pinned: false
|
8 |
---
|
9 |
|
app.py
CHANGED
@@ -1,13 +1,13 @@
|
|
1 |
-
import uuid
|
2 |
-
from typing import Tuple, List
|
3 |
-
|
4 |
import gradio as gr
|
5 |
import numpy as np
|
|
|
6 |
import supervision as sv
|
7 |
import torch
|
|
|
8 |
from PIL import Image
|
9 |
from tqdm import tqdm
|
10 |
from transformers import pipeline, CLIPModel, CLIPProcessor
|
|
|
11 |
|
12 |
MARKDOWN = """
|
13 |
# Auto β‘ ProPainter π§βπ¨
|
@@ -17,7 +17,7 @@ This is a demo for automatic removal of objects from videos using
|
|
17 |
[ProPainter](https://github.com/sczhou/ProPainter) combo.
|
18 |
|
19 |
- [x] Automated object masking using SAM + MetaCLIP
|
20 |
-
- [
|
21 |
- [ ] Automated β‘ object masking using FastSAM + MetaCLIP
|
22 |
"""
|
23 |
|
@@ -88,19 +88,35 @@ def mask_frame(frame: np.ndarray, prompt: str, confidence: float) -> np.ndarray:
|
|
88 |
return np.repeat(mask[:, :, np.newaxis], 3, axis=2)
|
89 |
|
90 |
|
91 |
-
def mask_video(source_video: str, prompt: str, confidence: float,
|
92 |
-
video_info = sv.VideoInfo.from_video_path(source_video)
|
93 |
frame_iterator = iter(sv.get_video_frames_generator(
|
94 |
source_path=source_video, start=START_FRAME, end=END_FRAME))
|
95 |
|
96 |
-
with sv.ImageSink(
|
97 |
-
with sv.
|
98 |
for _ in tqdm(range(TOTAL), desc="Masking frames"):
|
99 |
frame = next(frame_iterator)
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
|
105 |
|
106 |
def process(
|
@@ -110,8 +126,13 @@ def process(
|
|
110 |
progress=gr.Progress(track_tqdm=True)
|
111 |
) -> Tuple[str, str]:
|
112 |
name = str(uuid.uuid4())
|
113 |
-
|
114 |
-
|
|
|
|
|
|
|
|
|
|
|
115 |
|
116 |
|
117 |
with gr.Blocks() as demo:
|
|
|
|
|
|
|
|
|
1 |
import gradio as gr
|
2 |
import numpy as np
|
3 |
+
import subprocess
|
4 |
import supervision as sv
|
5 |
import torch
|
6 |
+
import uuid
|
7 |
from PIL import Image
|
8 |
from tqdm import tqdm
|
9 |
from transformers import pipeline, CLIPModel, CLIPProcessor
|
10 |
+
from typing import Tuple, List
|
11 |
|
12 |
MARKDOWN = """
|
13 |
# Auto β‘ ProPainter π§βπ¨
|
|
|
17 |
[ProPainter](https://github.com/sczhou/ProPainter) combo.
|
18 |
|
19 |
- [x] Automated object masking using SAM + MetaCLIP
|
20 |
+
- [x] Automated inpainting using ProPainter
|
21 |
- [ ] Automated β‘ object masking using FastSAM + MetaCLIP
|
22 |
"""
|
23 |
|
|
|
88 |
return np.repeat(mask[:, :, np.newaxis], 3, axis=2)
|
89 |
|
90 |
|
91 |
+
def mask_video(source_video: str, prompt: str, confidence: float, frames_dir: str, masked_frames_dir: str) -> None:
|
|
|
92 |
frame_iterator = iter(sv.get_video_frames_generator(
|
93 |
source_path=source_video, start=START_FRAME, end=END_FRAME))
|
94 |
|
95 |
+
with sv.ImageSink(masked_frames_dir, image_name_pattern="{:05d}.png") as masked_frames_sink:
|
96 |
+
with sv.ImageSink(frames_dir, image_name_pattern="{:05d}.jpg") as frames_sink:
|
97 |
for _ in tqdm(range(TOTAL), desc="Masking frames"):
|
98 |
frame = next(frame_iterator)
|
99 |
+
frames_sink.save_image(frame)
|
100 |
+
masked_frame = mask_frame(frame, prompt, confidence)
|
101 |
+
masked_frames_sink.save_image(masked_frame)
|
102 |
+
|
103 |
+
return frames_dir, masked_frames_dir
|
104 |
+
|
105 |
+
|
106 |
+
def execute_command(command: str) -> None:
|
107 |
+
subprocess.run(command, check=True)
|
108 |
+
|
109 |
+
|
110 |
+
def paint_video(frames_dir: str, masked_frames_dir: str, results_dir: str) -> None:
|
111 |
+
command = [
|
112 |
+
f"python",
|
113 |
+
f"inference_propainter.py",
|
114 |
+
f"--video={frames_dir}",
|
115 |
+
f"--mask={masked_frames_dir}",
|
116 |
+
f"--output={results_dir}",
|
117 |
+
f"--save_fps={25}"
|
118 |
+
]
|
119 |
+
execute_command(command)
|
120 |
|
121 |
|
122 |
def process(
|
|
|
126 |
progress=gr.Progress(track_tqdm=True)
|
127 |
) -> Tuple[str, str]:
|
128 |
name = str(uuid.uuid4())
|
129 |
+
frames_dir = f"{name}/frames"
|
130 |
+
masked_frames_dir = f"{name}/masked_frames"
|
131 |
+
results_dir = f"{name}/results"
|
132 |
+
|
133 |
+
mask_video(source_video, prompt, confidence, frames_dir, masked_frames_dir)
|
134 |
+
paint_video(frames_dir, masked_frames_dir, results_dir)
|
135 |
+
return f"{name}/results/frames/masked_in.mp4", f"{name}/results/frames/inpaint_out.mp4"
|
136 |
|
137 |
|
138 |
with gr.Blocks() as demo:
|
requirements.txt
DELETED
@@ -1,10 +0,0 @@
|
|
1 |
-
--extra-index-url https://download.pytorch.org/whl/cu118
|
2 |
-
torch
|
3 |
-
torchvision
|
4 |
-
|
5 |
-
numpy
|
6 |
-
opencv-python
|
7 |
-
pillow
|
8 |
-
gradio==3.50.2
|
9 |
-
transformers
|
10 |
-
supervision
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|