Spaces:
Running
Running
| import gradio as gr | |
| from transformers import AutoProcessor, LlavaForConditionalGeneration | |
| from PIL import Image | |
| import torch | |
| # Load model & processor | |
| # model_id = "llava-hf/llava-1.5-7b-hf" # Exceeding 16 GB Memory | |
| # model_id = "llava-hf/llava-1.5-7b-hf-int4" #Does not exists | |
| model_id = "bczhou/tiny-llava-v1-hf" | |
| processor = AutoProcessor.from_pretrained(model_id) | |
| processor.patch_size = 14 # β Fix: set manually | |
| model = LlavaForConditionalGeneration.from_pretrained( | |
| model_id, | |
| torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32, | |
| low_cpu_mem_usage=True, | |
| device_map="auto", | |
| ) | |
| # Main prediction function | |
| def analyze_palm(image, question, history): | |
| if image is None or not question.strip(): | |
| history.append((question, "Please provide both image and question.")) | |
| return history, "" | |
| # Add <image> token explicitly in the text | |
| prompt = f"<image>\n{question}" | |
| print("Processing image and prompt") | |
| # Manual prompt construction (works for TinyLLaVA) | |
| inputs = processor(text=prompt, images=image, return_tensors="pt").to(model.device) | |
| print("Inputs encoded") | |
| outputs = model.generate(**inputs, max_new_tokens=256) | |
| print("Output generated") | |
| response = processor.decode(outputs[0], skip_special_tokens=True) | |
| history.append((question, response)) | |
| print("Returning response") | |
| return history, "" | |
| # Build UI using Blocks | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## ποΈ AI Palm Reader\nUpload a palm image and ask a question. Get a palmistry-style response.") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| image_input = gr.Image(type="pil", label="Palm Image") | |
| prompt_input = gr.Textbox(lines=2, label="Your Question", placeholder="What does my palm say?") | |
| submit_btn = gr.Button("Ask") | |
| with gr.Column(scale=2): | |
| chatbot = gr.Chatbot(label="Palmistry Chat") | |
| state = gr.State([]) | |
| submit_btn.click( | |
| fn=analyze_palm, | |
| inputs=[image_input, prompt_input, state], | |
| outputs=[chatbot, prompt_input] | |
| ) | |
| demo.launch() | |