File size: 3,364 Bytes
5cdb85a
 
6fc8c46
5cdb85a
6fc8c46
 
 
 
5cdb85a
6fc8c46
 
 
 
5cdb85a
 
6fc8c46
 
 
5cdb85a
 
6fc8c46
 
5cdb85a
6fc8c46
5cdb85a
6fc8c46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5cdb85a
 
6fc8c46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import gradio as gr
from transformers import pipeline
import sys # Import sys for stderr printing

# Load the image-to-text pipeline
# We'll use a common pre-trained model for image captioning: "nlpconnect/vit-gpt2-image-captioning"
# This model requires the 'transformers' library and its dependencies (like torch)
# It also requires the Pillow library for image handling.
try:
    print("Attempting to load image-to-text model...")
    # Specify the task and model name
    image_to_text_pipeline = pipeline("image-to-text", model="nlpconnect/vit-gpt2-image-captioning")
    print("Image-to-text model loaded successfully.")
    model_loaded = True
except Exception as e:
    print(f"Error loading model: {e}", file=sys.stderr)
    print("Please ensure you have 'transformers', 'torch' (or tensorflow), and 'Pillow' installed.", file=sys.stderr)
    image_to_text_pipeline = None # Set to None if loading fails
    model_loaded = False


def generate_text_from_image(image):
    """
    Generates text (caption) from an input image using the loaded model.
    """
    if not model_loaded or not image_to_text_pipeline:
        return "Model not loaded. Please check the application logs for errors."

    if image is None:
        return "Please upload an image."

    print("Received image for processing.")

    try:
        # The pipeline expects a PIL Image object or a file path
        # Gradio's Image input component returns a PIL Image by default
        print("Calling image-to-text pipeline...")
        # The output is typically a list of dictionaries, e.g., [{'generated_text': 'a cat sitting on a couch'}]
        output = image_to_text_pipeline(image)
        print(f"Pipeline raw output: {output}")

        # Extract the generated text
        if output and isinstance(output, list) and len(output) > 0 and 'generated_text' in output[0]:
            generated_text = output[0]['generated_text']
            print(f"Generated text: {generated_text}")
            return generated_text
        else:
            print(f"Unexpected pipeline output format: {output}", file=sys.stderr)
            return "Could not generate text. Unexpected output format from model."

    except Exception as e:
        print(f"An error occurred during image processing: {e}", file=sys.stderr)
        # Print the traceback for more detailed error info
        import traceback
        traceback.print_exc(file=sys.stderr)
        return f"An error occurred during image processing: {e}"


# Create the Gradio interface
# Input is an Image component, Output is a Textbox component
if model_loaded: # Only create interface if model loaded successfully
    interface = gr.Interface(
        fn=generate_text_from_image, # The function to run
        inputs=gr.Image(type="pil", label="Upload Image"), # Input component (Image)
        outputs=gr.Textbox(label="Generated Text"), # Output component (Textbox)
        title="Image to Text Generator", # Title of the app
        description="Upload an image and get a text description generated by a Hugging Face model." # Description
    )

    # Launch the Gradio interface
    if __name__ == "__main__":
        print("Launching Gradio interface...")
        interface.launch()
        print("Gradio interface launched.")
else:
    print("Gradio interface not launched due to model loading error.", file=sys.stderr)