import os from io import StringIO import pandas as pd import requests from tabulate import tabulate from requests.compat import urljoin as urlj import json from IPython.display import Image, display import cv2 import ast import gradio as gr from PIL import Image import os import requests API_TOKEN_FROM_YOUR_PROFILE = '0953ed57513ab57a7dccbc6859472657383dd56b' token = API_TOKEN_FROM_YOUR_PROFILE def request_data(url): auth_header = {"Authorization": f"Token {token}"} r = requests.get(url, headers=auth_header) req = json.loads(r.text) return req projects_url = "https://sweden.trapper-project.org/media_classification/api/projects" projects = request_data(projects_url) p13_df = pd.read_csv('observations_0_13.csv') p6_df = pd.read_csv('observations_0_6.csv') p2_df = pd.read_csv('observations_0_2.csv') def display_image(file_path, width=1000, height=None): print(file_path) if os.path.exists(file_path): display(Image(file_path, width=width, height=height)) else: print('File not in dir (yet)') def draw_bboxs(img_path, coordinates, out_path=None, display_now=False): image = cv2.imread(img_path) height, width, channels = image.shape for c in coordinates: start_point = (int(c[0]*width), int(c[1]*height)) #end_point = (int(c[2]*width), int(c[3]*height)) end_point = (int(c[0]*width)+ int(c[2]*width), int(c[1]*height) + int(c[3]*height)) cv2.rectangle(image, start_point, end_point, color=(0,255,0), thickness=2) if not out_path: out_path = img_path.replace('.', '_bboxes.') cv2.imwrite(out_path, image) if display_now: display_image(out_path) return out_path def select_by_species(df, species): return df[df['commonName'] == species] def show_random_species(df, species): display_now = True sdf = select_by_species(df, species) if sdf.empty: print('Species not in available photo set') row = sdf.sample(n=None) print(row.to_markdown()) row = row.squeeze() photo_path = download_image_url(row.filePath, f'{row.fileName}.png', display_now=display_now) row['local_path'] = photo_path row['bboxes'] = ast.literal_eval(row['bboxes']) return row def download_image_url(url, file_name, file_path='photos', display_now=False): photo_path = os.path.join(file_path, file_name) auth_header = {"Authorization": f"Token {token}"} r = requests.get(url, headers=auth_header) if r.status_code == 200: os.makedirs(file_path, exist_ok=True) with open(photo_path, 'wb') as out_file: out_file.write(r.content) else: print(f"ERROR code: {r.status_code} on URL: {url}") return None if display_now: display_image(photo_path) return photo_path def display_image(photo_path): image = Image.open(photo_path) image.show() return image def outputImg(df_name, species): print("Project Name", df_name) if df_name == "[13] Scandcam-Västerbotten2122": df = p13_df elif df_name == "[6] Beyond Moose": df = p6_df elif df_name == "[2] Träffa dina vilda grannar": df = p2_df else: print("Invalid DataFrame selected") return None image_info = show_random_species(df, species) print(image_info['local_path'], image_info.to_string()) details_table = tabulate(pd.DataFrame(image_info).transpose(), headers='keys', tablefmt='pipe') print("details_table",details_table) bbimg = draw_bboxs(image_info['local_path'], image_info.bboxes)#image_info['local_path'], image_info.to_string() return display_image(bbimg), details_table#image_info.to_string() iface = gr.Interface( fn=outputImg, inputs=[ gr.inputs.Dropdown(label="project Name", choices=["[13] Scandcam-Västerbotten2122", "[6] Beyond Moose", "[2] Träffa dina vilda grannar"]), gr.inputs.Dropdown(label="species", choices=list(pd.concat([p13_df['commonName'], p6_df['commonName'], p2_df['commonName']]).unique())), #gr.inputs.Textbox(label="DataFrame") ], outputs=[ gr.outputs.Image(type="pil", label="Random Image"), gr.outputs.Textbox(label="Details", type="text") ] ) iface.launch()