Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import base64 | |
| import requests | |
| import random | |
| import os | |
| from openai import OpenAI | |
| from PIL import Image | |
| import json | |
| import cohere | |
| iucn_api_token = os.environ.get('IUCN_API') | |
| cohere_api_token = os.environ.get('COHERE_API') | |
| openai_api_token = os.environ.get('OPENAI_API') | |
| client = OpenAI(api_key=openai_api_token) | |
| co = cohere.Client(cohere_api_token) | |
| def encode_image(image_path): | |
| with open(image_path, "rb") as image_file: | |
| return base64.b64encode(image_file.read()).decode('utf-8') | |
| def summarize_with_llm(text, prompt, max_token=210): | |
| response = co.generate( | |
| model='command', | |
| prompt=f'This is a piece of information about an animal: "{text}". {prompt}', | |
| max_tokens=max_token, | |
| temperature=0.5, | |
| k=0, | |
| stop_sequences=[], | |
| return_likelihoods='NONE') | |
| return response.generations[0].text | |
| def get_iucn_data(genus, species): | |
| iucn_narrative = requests.get(f"https://apiv3.iucnredlist.org/api/v3/species/narrative/{genus}%20{species}?token={iucn_api_token}") | |
| iucn_status = requests.get(f"https://apiv3.iucnredlist.org/api/v3/species/history/name/{genus}%20{species}?token={iucn_api_token}") | |
| iucn_common_name = requests.get(f"https://apiv3.iucnredlist.org/api/v3/species/common_names/{genus}%20{species}?token={iucn_api_token}") | |
| iucn_web_link = requests.get(f"https://apiv3.iucnredlist.org/api/v3/weblink/{genus}%20{species}") | |
| if iucn_narrative.status_code == 200: | |
| narratives = iucn_narrative.json() | |
| conservation_status = iucn_status.json() | |
| if conservation_status['result'] == []: | |
| return dict() | |
| status_category = conservation_status['result'][0]['category'] | |
| status_code = conservation_status['result'][0]['code'] | |
| common_name = iucn_common_name.json()['result'][0]['taxonname'] | |
| web_link = iucn_web_link.json()['rlurl'] | |
| threats = summarize_with_llm(narratives['result'][0]['threats'], 'In one sentence, the threats posing this species are', max_token=210) | |
| population = summarize_with_llm(narratives['result'][0]['population'], 'In one sentence, estimation of the population of this species is', max_token=210) | |
| habitat = summarize_with_llm(narratives['result'][0]['habitat'], 'Description of the habitat of this species is') | |
| return { | |
| "status_category": status_category, | |
| "status_code": status_code, | |
| "common_name": common_name, | |
| "web_link": web_link, | |
| "threats": threats.strip().split('.')[0], | |
| "population": population.strip().split('.')[0], | |
| "habitat": habitat.strip().split('.')[0] | |
| } | |
| else: | |
| return dict() | |
| def get_taxonomy(image): | |
| # Path to your image | |
| id = random.randint(0, 1000) | |
| image_path = f"upload_{id}.png" | |
| image.save(image_path) | |
| # Getting the base64 string | |
| base64_image = encode_image(image_path) | |
| os.remove(image_path) | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {openai_api_token}" | |
| } | |
| payload = { | |
| "model": "gpt-4-vision-preview", | |
| "messages": [ | |
| { | |
| "role": "user", | |
| "content": [ | |
| { | |
| "type": "text", | |
| "text": """ | |
| Your role is to identify scientific names of species from zoo signs in images, focusing strictly on extracting the scientific name. | |
| If the image is low quality or unreadable, the response in the JSON will be 'low quality image'. | |
| If no informational sign is detected, it will respond with 'no sign found'. | |
| When multiple signs are present, the response will be 'more than one sign'. | |
| The GPT interacts minimally, responding in a dictionary format with the key "result" and the value being the scientific name or the specific response based on the image analysis. | |
| """ | |
| }, | |
| { | |
| "type": "image_url", | |
| "image_url": { | |
| "url": f"data:image/jpeg;base64,{base64_image}", | |
| "detail": "low" | |
| } | |
| } | |
| ] | |
| } | |
| ], | |
| "max_tokens": 300 | |
| } | |
| response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload) | |
| result = response.json()['choices'][0]['message']['content'] | |
| json_string = "".join(result.split("\n")[1:-1]) | |
| # Parse the JSON string into a dictionary | |
| result_dict = json.loads(json_string) | |
| return result_dict['result'] | |
| def get_information(image): | |
| taxonomy = get_taxonomy(image) | |
| genus, species = taxonomy.split()[0], taxonomy.split()[1] | |
| iucn_data = get_iucn_data(genus, species) | |
| information = f"## {taxonomy}" | |
| if len(list(iucn_data.keys())) > 0: | |
| information += f""" | |
| ## {iucn_data['common_name']} | |
| **Conservation status**: {iucn_data['status_category']} ({iucn_data['status_code']}). | |
| **Threats**: {iucn_data['threats']}. | |
| **Population**: {iucn_data['population']}. | |
| **Habitat**: {iucn_data['habitat']}. | |
| *For more information, please visit this species page*: {iucn_data['web_link']} | |
| """ | |
| return information | |
| image = gr.Image(label="Image", type='pil') | |
| output = gr.Markdown() | |
| demo = gr.Interface( | |
| fn=get_information, | |
| inputs=[image], | |
| outputs=output, | |
| title="ZooSign Reader", | |
| examples=['example_2.jpeg'], | |
| description=""" | |
| Introducing **ZooSign Reader**, an innovative application designed to enhance your zoo experience! **ZooSign Reader** allows users to effortlessly upload images of zoo informational signs and receive detailed information about the species mentioned on those signs. | |
| With **ZooSign Reader**, you no longer need to spend time searching for information about a particular animal or bird species while visiting the zoo. Simply capture an image of the sign using your smartphone camera, or choose an existing image from your gallery, and let **ZooSign Reader** do the rest. | |
| Using cutting-edge image recognition and natural language processing technologies, **ZooSign Reader** quickly analyzes the uploaded image and extracts the text containing the scientific name. The app then searches the IUCN Redlist's extensive database, which includes a wide range of animals, birds, and reptiles found in zoos worldwide. | |
| *Please note that it may take up to 20 seconds to process one image.* | |
| """ | |
| ) | |
| demo.launch() | |