File size: 3,048 Bytes
3834351 4768cde dd1d7f5 a32df56 4c1c4a7 3834351 7c31b44 c170961 4768cde 7c31b44 2716edf 49abd9f 2716edf 7c31b44 4768cde e768711 3c8af25 c170961 3c8af25 c170961 3c8af25 e768711 c170961 3834351 9226311 2716edf c170961 e768711 d807150 7c31b44 d807150 e768711 c170961 5f6c42c 3c8af25 c170961 e768711 c170961 3834351 7c31b44 |
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 |
import gradio as gr
import tempfile
from pathlib import Path
from wrapper import run_pipeline_on_image
from PIL import Image
def process(file_obj):
if not file_obj:
return None, None, None, None, [], ""
with tempfile.TemporaryDirectory() as tmpdir:
# file_obj is a dict when using gr.File(type="file")
src = Path(file_obj.name)
ext = src.suffix.lstrip('.') or 'tif'
img_path = Path(tmpdir) / f"input.{ext}"
try:
img_bytes = src.read_bytes()
img_path.write_bytes(img_bytes)
except Exception:
# Fallback: save via PIL if direct copy fails
Image.open(src).save(img_path)
outputs = run_pipeline_on_image(str(img_path), tmpdir, save_artifacts=True)
def load_pil(path_str):
try:
if not path_str:
return None
im = Image.open(path_str)
copied = im.copy()
im.close()
return copied
except Exception:
return None
composite = load_pil(outputs.get('Composite'))
overlay = load_pil(outputs.get('Overlay'))
mask = load_pil(outputs.get('Mask'))
size_img = load_pil(str(Path(tmpdir) / 'results/size.size_analysis.png'))
# Texture LBP green path
lbp_path = Path(tmpdir) / 'texture_output/lbp_green.png'
texture_img = load_pil(str(lbp_path)) if lbp_path.exists() else None
order = ['NDVI', 'GNDVI', 'SAVI']
gallery_items = [load_pil(outputs[k]) for k in order if k in outputs]
stats_text = outputs.get('StatsText', '')
return size_img, composite, mask, overlay, texture_img, gallery_items, stats_text
with gr.Blocks() as demo:
gr.Markdown("# 🌿 Automated Plant Analysis Demo")
gr.Markdown("Upload a sorghum plant image to compute and visualize composite, mask, overlay, texture (LBP), vegetation indices, and statistics.")
with gr.Row():
with gr.Column():
# Use gr.File instead of gr.Image so TIFF is preserved
inp = gr.File(type="file", file_types=[".tif", ".tiff", ".png", ".jpg"], label="Upload Image")
run = gr.Button("Run Pipeline", variant="primary")
with gr.Row():
size_img = gr.Image(type="pil", label="Morphology Size", interactive=False)
composite_img = gr.Image(type="pil", label="Composite (Segmentation Input)", interactive=False)
mask_img = gr.Image(type="pil", label="Mask", interactive=False)
overlay_img = gr.Image(type="pil", label="Segmentation Overlay", interactive=False)
with gr.Row():
texture_img = gr.Image(type="pil", label="Texture LBP (Green Band)", interactive=False)
gallery = gr.Gallery(label="Vegetation Indices", columns=3, height="auto")
stats = gr.Textbox(label="Statistics", lines=4)
run.click(process, inputs=inp, outputs=[size_img, composite_img, mask_img, overlay_img, texture_img, gallery, stats])
if __name__ == "__main__":
demo.launch()
|