import gradio as gr import cv2 from geti_sdk.deployment import Deployment from geti_sdk.utils import show_image_with_annotation_scene import numpy as np from urllib.request import urlopen import re # Step 1: Load the deployment deployment = Deployment.from_folder("deployment") deployment.load_inference_models(device="CPU") def is_valid_url(url): pattern = r'^(https?|ftp)://[^\s/$.?#].[^\s]*$' return re.match(pattern, url) is not None def resize_image(image, target_dimension): height, width = image.shape[:2] max_dimension = max(height, width) scale_factor = target_dimension / max_dimension new_width = int(width * scale_factor) new_height = int(height * scale_factor) resized_image = cv2.resize(image, (new_width, new_height)) return resized_image def infer(image=None, url:str=None): if image is None and url is None: return [None,'Error: No image or URL provided'] if image is None: if isinstance(url, str): if not is_valid_url(url): return [None,'Error: URL appears to be invalid'] req = urlopen(url) arr = np.asarray(bytearray(req.read()), dtype=np.uint8) image = cv2.imdecode(arr, -1) if image is None: return [None, f'Error: Unable to fetch image from {url}'] image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = resize_image(image, 1200) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) prediction = deployment.infer(image) output = show_image_with_annotation_scene(image, prediction, show_results=False) output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB) return [output, prediction.overview] interface = gr.Interface(fn=infer, inputs=['image', 'text'], outputs=['image','text'], allow_flagging='manual', flagging_dir='flagged', examples=[["eggsample1.jpg", ""], ["eggsample2.jpg",""], [None,"https://upload.wikimedia.org/wikipedia/commons/f/f9/Eastern_Phoebe-nest-Brown-headed-Cowbird-egg.jpg"], [None,"https://upload.wikimedia.org/wikipedia/commons/7/72/White-breasted_Woodswallow_chicks_in_nest.jpg"], ]) interface.launch()