trapper-sample / app.py
skylord's picture
Update app.py
a3ce23d
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()