# FoundationPose Hugging Face Space Deployment Guide This directory contains the code for deploying FoundationPose on Hugging Face Spaces with ZeroGPU support. ## Current Status - ✅ Gradio app structure created - ✅ API endpoints defined (/initialize, /estimate) - ✅ ZeroGPU decorators added (@spaces.GPU) - ✅ Client library for API calls created - ⚠️ FoundationPose model integration incomplete (placeholder code) ## Next Steps ### 1. Complete FoundationPose Integration The current `app.py` has placeholder code marked with `# TODO` comments. You need to: 1. **Install FoundationPose in the Space**: - Add FoundationPose installation to requirements.txt or use a custom Dockerfile - Download pre-trained weights (need to be included in the Space or downloaded at startup) 2. **Implement model initialization** (line ~40 in app.py): ```python # Replace the TODO with actual FoundationPose initialization from FoundationPose import FoundationPoseEstimator self.model = FoundationPoseEstimator(device=self.device) ``` 3. **Implement object registration** (line ~70): ```python # Replace the TODO with actual registration self.model.register_object(object_id, reference_images, camera_intrinsics) ``` 4. **Implement pose estimation** (line ~120): ```python # Replace the TODO with actual inference result = self.model.estimate_pose(object_id, query_image, camera_intrinsics) ``` ### 2. Handle Model Weights FoundationPose requires pre-trained weights. Options: **Option A: Git LFS (Recommended)** ```bash cd foundationpose git lfs install mkdir weights # Download weights from FoundationPose repo wget https://... -O weights/model.pth git lfs track "weights/*.pth" git add weights/model.pth .gitattributes git commit -m "Add model weights" ``` **Option B: Download at Runtime** Add to `app.py`: ```python def download_weights(): from huggingface_hub import hf_hub_download weights_path = hf_hub_download( repo_id="NVlabs/FoundationPose", filename="model.pth" ) return weights_path ``` ### 3. Test Locally Before deploying, test the Space locally: ```bash cd foundationpose pip install -r requirements.txt python app.py ``` This will start a local Gradio server at http://localhost:7860 ### 4. Deploy to Hugging Face ```bash cd foundationpose git add . git commit -m "Add FoundationPose inference implementation" git push ``` The Space will automatically rebuild and deploy. ### 5. Monitor GPU Usage After deployment: 1. Check the Space logs for GPU allocation messages 2. Monitor inference times (cold start vs warm) 3. Adjust `@spaces.GPU(duration=X)` parameters if needed ### 6. Integrate with Training Pipeline Once the Space is working, update the training code: **In training/nova_sim_trainer/perception/foundation_pose_wrapper.py**: ```python from foundationpose.client import FoundationPoseClient class FoundationPoseWrapper(PoseEstimator): def __init__(self, api_url: str, ...): self.client = FoundationPoseClient(api_url) # Initialize with reference images ref_images = load_reference_images(reference_dir) self.client.initialize(object_id, ref_images) def estimate_poses(self, frame, camera_intrinsics, scene_objects): poses = self.client.estimate_pose(self.object_id, frame, camera_intrinsics) return [DetectedPose(**pose) for pose in poses] ``` **In training/observations.yaml**: ```yaml perception: enabled: true model: foundation_pose api_url: https://gpue-foundationpose.hf.space tracked_objects: - object_id: target_cube reference_images_dir: ./perception/reference/target_cube ``` ## Performance Considerations ### ZeroGPU Latency - **Cold start**: 15-30 seconds (GPU allocation + model loading) - **Warm inference**: 0.5-2 seconds per query - **GPU duration**: Tune the `duration` parameter in `@spaces.GPU` decorators ### Recommended Usage - ✅ **Batch processing**: Process multiple frames in one GPU allocation - ✅ **Validation**: Check perception quality on recorded episodes - ✅ **Demos**: Show 6D pose estimation capabilities - ⚠️ **Real-time training**: Too slow for 30 Hz control loop - use dummy estimator instead ### Optimization Tips 1. **Batch multiple queries** to amortize cold start time 2. **Keep GPU warm** by sending periodic keep-alive requests 3. **Use lower resolution** if inference is too slow 4. **Cache results** for static scenes ## Troubleshooting ### Space won't start - Check Space logs for errors - Verify all dependencies in requirements.txt - Check Python version compatibility (3.12) ### GPU timeout - Increase `duration` in `@spaces.GPU(duration=X)` - Optimize model inference code - Reduce image resolution ### Out of memory - Reduce batch size - Use smaller model variant - Request more GPU memory in Space settings ## Alternative: Docker Deployment If ZeroGPU is too restrictive, consider running locally with Docker: ```bash cd foundationpose docker build -t foundationpose . docker run -p 7860:7860 --gpus all foundationpose ``` Then set `api_url: http://localhost:7860` in observations.yaml. ## References - [FoundationPose GitHub](https://github.com/NVlabs/FoundationPose) - [Hugging Face Spaces](https://huggingface.co/docs/hub/spaces) - [ZeroGPU Documentation](https://huggingface.co/docs/hub/spaces-gpus-zerogpu) - [Gradio Documentation](https://www.gradio.app/docs)