File size: 4,803 Bytes
e8746a9
 
9cca2b0
69de931
 
da3ef81
 
cc03be5
69de931
9a83a8a
c7b6a4c
 
9a83a8a
69de931
 
 
9a83a8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69de931
 
e8746a9
9a83a8a
da3ef81
9a83a8a
 
 
 
 
da3ef81
 
9a83a8a
d4ccb5d
9a83a8a
 
 
 
 
d4ccb5d
 
9a83a8a
9cca2b0
 
 
c7b6a4c
e8746a9
9a83a8a
69de931
d4ccb5d
e9c62c9
c7b6a4c
 
9a83a8a
5c93b6c
 
 
da3ef81
e9c62c9
5c93b6c
 
 
 
c7b6a4c
9a83a8a
da3ef81
 
d4ccb5d
9a83a8a
9cca2b0
9a83a8a
69de931
9a83a8a
c7b6a4c
69de931
9a83a8a
c7b6a4c
69de931
 
9a83a8a
c7b6a4c
9a83a8a
 
 
 
 
c7b6a4c
9a83a8a
e211546
 
 
c7b6a4c
ef50b14
c7b6a4c
 
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
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

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

# Wikipedia links dictionary
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"
}

# Prompt templates for AI generation
prompt_templates = [
    "A dreamy watercolor scene of a {flower} on a misty morning trail...",
    "A loose, expressive watercolor sketch of a {flower} in a wild meadow...",
    "An artist's nature journal page featuring a detailed {flower} study...",
    "A vibrant plein air painting of a {flower} patch along a coastal trail...",
    "A whimsical mixed-media scene of a {flower} garden at sunrise..."
]

# Local example image 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")),
]

# Logging for FAL client
def on_queue_update(update):
    if isinstance(update, fal_client.InProgress):
        for log in update.logs:
            print(log["message"])

# Process image and return classification + AI-generated artwork + Wiki URL
def process_image(img):
    predicted_class, _, probs = learn.predict(img)
    classification_results = dict(zip(learn.dls.vocab, map(float, probs)))
    wiki_url = search_terms_wikipedia.get(predicted_class.lower(), "No Wikipedia entry found.")

    # Generate image via FAL 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,
    )

    image_url = result["images"][0]["url"]
    response = requests.get(image_url)
    generated_image = Image.open(io.BytesIO(response.content))

    return classification_results, generated_image, str(wiki_url)

# Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("# 🌼 California Native Plant Classifier & AI Art Generator")

    with gr.Row():
        input_image = gr.Image(type="pil", label="Upload a Photo", height=250)

    with gr.Row():
        with gr.Column():
            label_output = gr.Label(label="Classification Results")
            wiki_output = gr.Textbox(label="Wikipedia Link")
        generated_image = gr.Image(label="AI-Generated Artistic Interpretation")

    # Submit button to trigger image processing
    submit_btn = gr.Button("Submit")
    submit_btn.click(fn=process_image, inputs=input_image, outputs=[label_output, generated_image, wiki_output])

    # Examples
    gr.Examples(
        examples=example_images,
        inputs=input_image,
        examples_per_page=6
    )

demo.launch()