File size: 6,483 Bytes
e8746a9
 
9cca2b0
69de931
 
da3ef81
 
cc03be5
69de931
3a82508
69de931
 
 
9a83a8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69de931
 
e8746a9
3a82508
da3ef81
7a28231
3a82508
7a28231
3a82508
7a28231
 
 
da3ef81
 
3a82508
d4ccb5d
3a82508
 
 
 
 
 
d4ccb5d
 
3a82508
9cca2b0
 
 
3a82508
e8746a9
3a82508
69de931
3a82508
d4ccb5d
e9c62c9
3a82508
 
 
 
 
5c93b6c
 
 
da3ef81
e9c62c9
5c93b6c
 
 
 
3a82508
 
 
da3ef81
 
3a82508
 
d4ccb5d
3a82508
 
 
 
 
 
 
9cca2b0
3a82508
 
c7b6a4c
3a82508
 
 
69de931
3a82508
 
 
69de931
 
9a83a8a
3a82508
 
 
 
e211546
 
 
3a82508
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ef50b14
c7b6a4c
3a82508
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
from fastai.vision.all import *
import gradio as gr
import fal_client
from PIL import Image
import io
import random
import requests
from pathlib import Path

# Dictionary of plant names and their Wikipedia links
search_terms_wikipedia = {
    "blazing star": "https://en.wikipedia.org/wiki/Mentzelia",
    "bristlecone pine": "https://en.wikipedia.org/wiki/Pinus_longaeva",
    "california bluebell": "https://en.wikipedia.org/wiki/Phacelia_minor",
    "california buckeye": "https://en.wikipedia.org/wiki/Aesculus_californica",
    "california buckwheat": "https://en.wikipedia.org/wiki/Eriogonum_fasciculatum",
    "california fuchsia": "https://en.wikipedia.org/wiki/Epilobium_canum",
    "california checkerbloom": "https://en.wikipedia.org/wiki/Sidalcea_malviflora",
    "california lilac": "https://en.wikipedia.org/wiki/Ceanothus",
    "california poppy": "https://en.wikipedia.org/wiki/Eschscholzia_californica",
    "california sagebrush": "https://en.wikipedia.org/wiki/Artemisia_californica",
    "california wild grape": "https://en.wikipedia.org/wiki/Vitis_californica",
    "california wild rose": "https://en.wikipedia.org/wiki/Rosa_californica",
    "coyote mint": "https://en.wikipedia.org/wiki/Monardella",
    "elegant clarkia": "https://en.wikipedia.org/wiki/Clarkia_unguiculata",
    "baby blue eyes": "https://en.wikipedia.org/wiki/Nemophila_menziesii",
    "hummingbird sage": "https://en.wikipedia.org/wiki/Salvia_spathacea",
    "delphinium": "https://en.wikipedia.org/wiki/Delphinium",
    "matilija poppy": "https://en.wikipedia.org/wiki/Romneya_coulteri",
    "blue-eyed grass": "https://en.wikipedia.org/wiki/Sisyrinchium_bellum",
    "penstemon spectabilis": "https://en.wikipedia.org/wiki/Penstemon_spectabilis",
    "seaside daisy": "https://en.wikipedia.org/wiki/Erigeron_glaucus",
    "sticky monkeyflower": "https://en.wikipedia.org/wiki/Diplacus_aurantiacus",
    "tidy tips": "https://en.wikipedia.org/wiki/Layia_platyglossa",
    "wild cucumber": "https://en.wikipedia.org/wiki/Marah_(plant)",
    "douglas iris": "https://en.wikipedia.org/wiki/Iris_douglasiana",
    "goldfields coreopsis": "https://en.wikipedia.org/wiki/Coreopsis"
}

# Templates for AI image generation
prompt_templates = [
    "A dreamy Picasso-like scene of a {flower} on a misty morning trail, with golden sunbeams filtering through towering redwoods, and a curious hummingbird hovering nearby.",
    "A loose, expressive watercolor sketch of a {flower} in a wild meadow, surrounded by dancing butterflies and morning dew drops sparkling like diamonds in the dawn light.",
    "An artist's nature journal page featuring a detailed {flower} study, with delicate ink lines and soft crayon etching, complete with small sketches of bees and field notes in the margins.",
    "A vibrant plein air painting of a {flower} patch along a coastal hiking trail, with crashing waves and rugged cliffs in the background, painted in bold, energetic brushstrokes.",
    "A whimsical mixed-media scene of a {flower} garden at sunrise, combining loose watercolor washes with detailed botanical illustrations, featuring hidden wildlife and morning fog rolling through the valley.",
    "In a dim, graffiti-covered subway station, a vibrant spray-painted {flower} with neon petals and shimmering gold accents blooms defiantly on a grimy tiled wall, its dripping paint and curling vines injecting unexpected life into the underground gloom.",
    "Amid a bleak industrial wasteland strewn with rusted metal and trash, a single {flower} bathed in a shaft of golden light stands in stark contrast, its delicate form glowing with quiet resilience against the surrounding decay."
]

# Example images (using local paths)
example_images = [
    str(Path('example_images/example_1.jpg')),
    str(Path('example_images/example_2.jpg')),
    str(Path('example_images/example_3.jpg')),
    str(Path('example_images/example_4.jpg')),
    str(Path('example_images/example_5.jpg'))
    
]

# Function to handle AI generation progress updates
def on_queue_update(update):
    if isinstance(update, fal_client.InProgress):
        for log in update.logs:
           print(log["message"])

# Main function to process the uploaded image
def process_image(img):
    # Classify the image
    predicted_class, _, probs = learn.predict(img)
    classification_results = dict(zip(learn.dls.vocab, map(float, probs)))
    
    # Get Wikipedia link
    wiki_url = search_terms_wikipedia.get(predicted_class, "No Wikipedia entry found.")
    
    # Generate artistic interpretation by calling the Flux API
    result = fal_client.subscribe(
        "fal-ai/flux/schnell",
        arguments={
            "prompt": random.choice(prompt_templates).format(flower=predicted_class),
            "image_size": "portrait_4_3"
        },
        with_logs=True,
        on_queue_update=on_queue_update,
    )
    
    # Get the generated image
    image_url = result['images'][0]['url']
    response = requests.get(image_url)
    generated_image = Image.open(io.BytesIO(response.content))
    
    return classification_results, generated_image, wiki_url

# Function to clear all outputs
def clear_outputs():
    return {
        label_output: None,
        generated_image: None,
        wiki_output: None
    }

# Load the AI model
learn = load_learner('resnet50_30_categories.pkl')

# Create the web interface
with gr.Blocks() as demo:
    # Input section
    with gr.Row():
        input_image = gr.Image(height=230, width=230, label="Upload Image for Classification", type="pil")
    
    # Output section
    with gr.Row():
        with gr.Column():
            label_output = gr.Label(label="Classification Results")
            wiki_output = gr.Textbox(label="Wikipedia Article Link", lines=1)
        generated_image = gr.Image(label="AI Generated Interpretation")
    
    # Add example images using local paths
    gr.Examples(
        examples=example_images,
        inputs=input_image,
        examples_per_page=6,
        fn=process_image,
        outputs=[label_output, generated_image, wiki_output]
    )
    
    # Set up what happens when an image is uploaded or removed
    input_image.change(
        fn=process_image,
        inputs=input_image,
        outputs=[label_output, generated_image, wiki_output]
    )
    
    input_image.clear(
        fn=clear_outputs,
        inputs=[],
        outputs=[label_output, generated_image, wiki_output]
    )

# Start the application
demo.launch(inline=False)