|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
import sys |
|
import subprocess |
|
import logging |
|
import time |
|
import shutil |
|
|
|
|
|
logging.basicConfig(level=logging.INFO, |
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') |
|
logger = logging.getLogger("SEEM-HF") |
|
|
|
def run_command(cmd, description=None): |
|
"""Run a shell command and log its output""" |
|
if description: |
|
logger.info(f"Running: {description}") |
|
logger.info(f"Command: {cmd}") |
|
|
|
try: |
|
process = subprocess.Popen( |
|
cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, |
|
universal_newlines=True |
|
) |
|
|
|
|
|
for line in process.stdout: |
|
line = line.rstrip() |
|
logger.info(line) |
|
|
|
process.wait() |
|
return process.returncode == 0 |
|
except Exception as e: |
|
logger.error(f"Error executing command: {e}") |
|
return False |
|
|
|
def install_dependencies(): |
|
"""Install required dependencies""" |
|
|
|
run_command("apt-get update", "Updating package lists") |
|
|
|
|
|
logger.info("Checking for ffmpeg...") |
|
if not run_command("which ffmpeg", "Checking ffmpeg"): |
|
logger.info("Installing ffmpeg...") |
|
run_command("apt-get install -y ffmpeg", "Installing ffmpeg") |
|
|
|
|
|
logger.info("Installing Python dependencies...") |
|
|
|
|
|
if os.path.exists("assets/requirements/requirements.txt"): |
|
run_command("pip install -r assets/requirements/requirements.txt", "Installing base requirements") |
|
|
|
|
|
if os.path.exists("assets/requirements/requirements_custom.txt"): |
|
run_command("pip install -r assets/requirements/requirements_custom.txt", "Installing custom requirements") |
|
|
|
|
|
try: |
|
import detectron2 |
|
logger.info("detectron2 is already installed") |
|
except ImportError: |
|
logger.info("Installing detectron2-xyz...") |
|
run_command("pip install git+https://github.com/MaureenZOU/detectron2-xyz.git", "Installing detectron2-xyz") |
|
|
|
def setup_environment(): |
|
"""Set up the necessary directories and environment""" |
|
|
|
if not os.path.exists("demo/seem"): |
|
logger.error("demo/seem directory not found!") |
|
return False |
|
|
|
|
|
os.makedirs('demo/seem/examples', exist_ok=True) |
|
|
|
|
|
if not os.path.exists("configs"): |
|
logger.error("configs directory not found!") |
|
|
|
os.makedirs('configs/seem', exist_ok=True) |
|
logger.info("Created configs directory") |
|
|
|
|
|
config_path = "configs/seem/focall_unicl_lang_demo.yaml" |
|
if not os.path.exists(config_path): |
|
os.makedirs(os.path.dirname(config_path), exist_ok=True) |
|
with open(config_path, 'w') as f: |
|
f.write("""# Model config for demo |
|
model: |
|
type: seem |
|
sem_seg_head: |
|
type: UniHead |
|
num_classes: 133 |
|
embed_dim: 768 |
|
learning_type: end2end |
|
lang_encoder: unicl |
|
dim_feedforward: 1024 |
|
dropout: 0.1 |
|
activation: relu |
|
nheads: 8 |
|
dec_layers: 9 |
|
enc_layers: 0 |
|
text_encoder: "bert-base-uncased" |
|
mask_dim: 256 |
|
task_switch: |
|
semantic: true |
|
instance: true |
|
panoptic: true |
|
refimg: true |
|
grounding: true |
|
audio: false |
|
audio_grounding: false |
|
video: true |
|
""") |
|
logger.info(f"Created default config file at {config_path}") |
|
|
|
|
|
utils_dir = "utils" |
|
os.makedirs(utils_dir, exist_ok=True) |
|
constants_path = os.path.join(utils_dir, "constants.py") |
|
if not os.path.exists(constants_path): |
|
with open(constants_path, 'w') as f: |
|
f.write("""# COCO Panoptic Classes |
|
COCO_PANOPTIC_CLASSES = [ |
|
'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', |
|
'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', |
|
'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', |
|
'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', |
|
'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', |
|
'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', |
|
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', |
|
'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', |
|
'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', |
|
'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush' |
|
] |
|
""") |
|
logger.info(f"Created constants.py at {constants_path}") |
|
|
|
return True |
|
|
|
def download_model_weights(): |
|
"""Download model weights if they don't exist""" |
|
model_path = "seem_focall_v0.pt" |
|
if not os.path.exists(model_path): |
|
logger.info(f"Downloading model weights {model_path}...") |
|
run_command( |
|
f"wget https://huggingface.co/xdecoder/SEEM/resolve/main/{model_path}", |
|
f"Downloading {model_path}" |
|
) |
|
logger.info(f"Downloaded {model_path}") |
|
else: |
|
logger.info(f"Model weights {model_path} already exist") |
|
|
|
def main(): |
|
"""Main entry point""" |
|
logger.info("Starting SEEM Hugging Face Space") |
|
|
|
|
|
install_dependencies() |
|
|
|
|
|
if not setup_environment(): |
|
return |
|
|
|
|
|
download_model_weights() |
|
|
|
|
|
app_path = "demo/seem/app.py" |
|
if not os.path.exists(app_path): |
|
logger.error(f"Application file not found at {app_path}!") |
|
return |
|
|
|
logger.info(f"Running application from {app_path}") |
|
|
|
|
|
cmd = f"python {app_path}" |
|
run_command(cmd, "Running SEEM demo app") |
|
|
|
if __name__ == "__main__": |
|
main() |