import streamlit as st from streamlit_pannellum import streamlit_pannellum from diffusers import StableDiffusionLDM3DPipeline from PIL import Image from typing import Optional from torch import Tensor from torch.nn import functional as F from torch.nn import Conv2d from torch.nn.modules.utils import _pair # Function to override _conv_forward method def asymmetricConv2DConvForward(self, input: Tensor, weight: Tensor, bias: Optional[Tensor]): paddingX = (self._reversed_padding_repeated_twice[0], self._reversed_padding_repeated_twice[1], 0, 0) paddingY = (0, 0, self._reversed_padding_repeated_twice[2], self._reversed_padding_repeated_twice[3]) working = F.pad(input, paddingX, mode='circular') working = F.pad(working, paddingY, mode='constant') return F.conv2d(working, weight, bias, self.stride, _pair(0), self.dilation, self.groups) # Load the pipeline pipe = StableDiffusionLDM3DPipeline.from_pretrained("Intel/ldm3d-pano") pipe.to("cuda") # Patch the Conv2d layers targets = [pipe.vae, pipe.text_encoder, pipe.unet] for target in targets: for module in target.modules(): if isinstance(module, Conv2d): module._conv_forward = asymmetricConv2DConvForward.__get__(module, Conv2d) # Function to generate panoramic images def generate_panoramic_image(prompt, name): output = pipe(prompt, width=1024, height=512, guidance_scale=7.0, num_inference_steps=50) rgb_image, depth_image = output.rgb, output.depth rgb_image[0].save(name + "_ldm3d_rgb.jpg") depth_image[0].save(name + "_ldd3d_depth.png") return name + "_ldm3d_rgb.jpg", name + "_ldd3d_depth.png" # Streamlit Interface st.title("Pannellum Streamlit plugin") st.markdown("This space is a showcase of the [streamlit_pannellum](https://gitlab.com/nicolalandro/streamlit-pannellum) lib.") prompt = st.text_input("Enter a prompt for the panoramic image", "360, Ben Erdt, Ognjen Sporin, Raphael Lacoste. A garden of oversized flowers...") generate_button = st.button("Generate Panoramic Image") if generate_button: name = "generated_image" # This can be dynamic rgb_image_path, _ = generate_panoramic_image(prompt, name) # Display the generated panoramic image in Pannellum viewer streamlit_pannellum( config={ "default": { "firstScene": "generated", "autoLoad": True }, "scenes": { "generated": { "title": "Generated Panoramic Image", "type": "equirectangular", "panorama": rgb_image_path, "autoLoad": True, } } } )