fotographer's picture
Fix model path models/voxel_scripted.pt
041aacc verified
Raw
History Blame Contribute Delete
1.82 kB
"""
Gradio demo for Hugging Face Spaces.
Upload a short Minecraft gameplay clip → top-3 action predictions.
Deploy: create Space with sdk=gradio, app_file=app.py
Requires voxel_scripted.pt in the model repo (download on startup).
"""
import os
from pathlib import Path
import gradio as gr
import torch
from hf_inference import CLASS_NAMES, load_model, predict_video
MODEL_ID = os.environ.get("HF_MODEL_ID", "fotographer/VoxelMind-2M-Minecraft-Classifier")
MODEL_FILE = os.environ.get("VOXELMIND_WEIGHTS", "models/voxel_scripted.pt")
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
_model = None
def get_model():
global _model
if _model is None:
path = Path(MODEL_FILE)
if not path.exists():
from huggingface_hub import hf_hub_download
path = Path(
hf_hub_download(
repo_id=MODEL_ID,
filename=MODEL_FILE,
repo_type="model",
)
)
_model = load_model(path, DEVICE)
return _model
def run(video_path: str):
if not video_path:
return "Upload a video first."
preds = predict_video(get_model(), video_path, device=DEVICE, topk=3)
lines = [f"**{name}** — {prob * 100:.1f}%" for name, prob in preds]
return "\n\n".join(lines)
demo = gr.Interface(
fn=run,
inputs=gr.Video(label="Minecraft clip (≥22 frames recommended)"),
outputs=gr.Markdown(label="Top-3 predictions"),
title="VoxelMind action classifier",
description=(
"Classifies player actions from 22×64×64 grayscale frames. "
f"Classes: {', '.join(CLASS_NAMES)}. "
"Inference uses a TorchScript export — architecture source is not published."
),
examples=[],
)
if __name__ == "__main__":
demo.launch()