Spaces:
Running
Running
import os | |
import re | |
from types import SimpleNamespace | |
from typing import Any | |
import gradio as gr | |
import numpy as np | |
from detectron2 import engine | |
from inference import main, setup_cfg | |
# internal settings | |
NUM_PROCESSES = 1 | |
CROP = False | |
SCORE_THRESHOLD = 0.8 | |
MAX_PARTS = 5 | |
ARGS = SimpleNamespace( | |
config_file="configs/coco/instance-segmentation/swin/opd_v1_real.yaml", | |
model="...", | |
input_format="RGB", | |
output=".output", | |
cpu=True, | |
) | |
def predict(rgb_image: str, depth_image: str, intrinsics: np.ndarray, num_samples: int) -> list[Any]: | |
def find_gifs(path: str) -> list[str]: | |
"""Scrape folders for all generated gif files.""" | |
for file in os.listdir(path): | |
sub_path = os.path.join(path, file) | |
if os.path.isdir(sub_path): | |
for image_file in os.listdir(sub_path): | |
if re.match(r".*\.gif$", image_file): | |
yield os.path.join(sub_path, image_file) | |
cfg = setup_cfg(ARGS) | |
engine.launch( | |
main, | |
NUM_PROCESSES, | |
args=( | |
cfg, | |
rgb_image, | |
depth_image, | |
intrinsics, | |
num_samples, | |
CROP, | |
SCORE_THRESHOLD, | |
), | |
) | |
# process output | |
# TODO: may want to select these in decreasing order of score | |
pre_outputs = list(find_gifs(ARGS.output)) | |
outputs = [] | |
for idx in range(MAX_PARTS): # hide unused components | |
if idx < len(pre_outputs): | |
outputs.append(gr.update(value=pre_outputs[idx], visible=True)) | |
else: | |
outputs.append(gr.update(visible=False)) | |
return outputs | |
def variable_outputs(idx): | |
idx = int(idx) | |
with gr.Blocks() as app: | |
gr.Markdown( | |
""" | |
# OPDMulti Demo | |
Upload an image to see its range of motion. | |
""" | |
) | |
# TODO: add gr.Examples | |
with gr.Row(): | |
rgb_image = gr.Image( | |
image_mode="RGB", source="upload", type="filepath", label="RGB Image", show_label=True, interactive=True | |
) | |
depth_image = gr.Image( | |
image_mode="L", source="upload", type="filepath", label="Depth Image", show_label=True, interactive=True | |
) | |
intrinsics = gr.Dataframe( | |
value=[ | |
[ | |
214.85935872395834, | |
0.0, | |
0.0, | |
], | |
[ | |
0.0, | |
214.85935872395834, | |
0.0, | |
], | |
[ | |
125.90160319010417, | |
95.13726399739583, | |
1.0, | |
], | |
], | |
row_count=(3, "fixed"), | |
col_count=(3, "fixed"), | |
datatype="number", | |
type="numpy", | |
label="Intrinsics matrix", | |
show_label=True, | |
interactive=True, | |
) | |
num_samples = gr.Number( | |
value=10, | |
label="Number of samples", | |
show_label=True, | |
interactive=True, | |
precision=0, | |
minimum=3, | |
maximum=20, | |
) | |
submit_btn = gr.Button("Run model") | |
# TODO: do we want to set a maximum limit on how many parts we render? We could also show the number of components | |
# identified. | |
outputs = [gr.Image(type="filepath", label=f"Part {idx + 1}", visible=False) for idx in range(MAX_PARTS)] | |
# TODO: maybe need to use a queue here so we don't overload the instance | |
submit_btn.click( | |
fn=predict, inputs=[rgb_image, depth_image, intrinsics, num_samples], outputs=outputs, api_name="run_model" | |
) | |
app.launch() | |