Spaces:
Sleeping
Sleeping
File size: 5,534 Bytes
5191667 54e72a4 cae6a01 5191667 54e72a4 5191667 cae6a01 5191667 cae6a01 54326c4 cae6a01 54326c4 cae6a01 54326c4 cae6a01 b429c2e cae6a01 a9354bd cae6a01 b429c2e cae6a01 452ee12 cae6a01 54326c4 cae6a01 54e72a4 b429c2e cae6a01 7f02edc cae6a01 92564f2 cae6a01 dda5b9d cae6a01 b04c6e7 cae6a01 4946aa6 cae6a01 7f02edc cae6a01 b04c6e7 cae6a01 4946aa6 7f02edc cae6a01 a1ae682 |
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
from PIL import Image, ImageDraw, ImageFont
from dotenv import load_dotenv
import matplotlib.pyplot as plt
from io import BytesIO
import gradio as gr
import numpy as np
import requests
import base64
import boto3
import uuid
import os
import io
load_dotenv()
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
s3 = boto3.client('s3',
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
def upload2aws(img_array):
image = Image.fromarray(img_array)
buffer = io.BytesIO()
image.save(buffer, format='JPEG')
buffer.seek(0)
unique_name = str(uuid.uuid4())
s3.put_object(Bucket='predict-packages', Key=f'images_webapp_counters/{unique_name}.jpg', Body=buffer)
return None
def send2api(input_img, api_url):
buf = io.BytesIO()
plt.imsave(buf, input_img, format='jpg')
files = {'image': buf.getvalue()}
res = requests.post(api_url, files=files)
try:
res.raise_for_status()
if res.status_code != 204:
response = res.json()
except Exception as e:
print(str(e))
return response
def displaytext_detclasim(c_cnames, c_scinames, coverage):
countings_list = list(c_scinames.items())
countings_list.sort(key = lambda x: x[1], reverse=True)
total = 0
for (_,c) in countings_list:
total += c
text = f'coverage = {coverage}'+'\n\n'
text += 'Countings by scientific name:\n'
countings_list = list(c_scinames.items())
countings_list.sort(key = lambda x: x[1], reverse=True)
for key,value in countings_list:
text += f'{key} = {value}'+'\n'
text += '\n\n'
text += 'Countings by common name:\n'
countings_list = list(c_cnames.items())
countings_list.sort(key = lambda x: x[1], reverse=True)
for key,value in countings_list:
text += f'{key} = {value}'+'\n'
text += '\n'
text += f'total = {total}'+'\n'
return text
def displaytext_yolocounter(countings, coverage):
countings_list = list(countings.items())
countings_list.sort(key = lambda x: x[1], reverse=True)
total = 0
for (y_class,c) in countings_list:
total += c
text = f'coverage = {coverage}'+'\n\n'
for key,value in countings_list:
text += f'{key} = {value}'+'\n'
text += '\n'
text += f'total = {total}'+'\n'
return text
def display_detectionsandcountings_directcounter(img_array, countings, prob_th=0, cth = 0):
img = Image.fromarray(img_array)
img1 = ImageDraw.Draw(img)
h, w = img.size
ratio = h/4000
countings_list = list(countings.items())
countings_list.sort(key = lambda x: x[1], reverse=True)
yi=int(20*ratio)
total = 0
for (y_class,c) in countings_list:
if c > cth:
img1.text((int(50*ratio), yi), "# {} = {}".format(y_class, c), fill='red')
yi += int(100*ratio)
total += c
yi += int(100*ratio)
img1.text((int(50*ratio), yi), "# {} = {}".format('total', total), fill='red')
text = ''
for key,value in countings_list:
text += f'{key} = {value}'+'\n'
text += '\n'
text += f'total = {total}'+'\n'
return img, text
def testing_countingid(input_img):
upload2aws(input_img)
api_url = 'http://countingid-test.us-east-1.elasticbeanstalk.com/predict'
response = send2api(input_img, api_url)
c_cnames = response['countings_cnames']
c_scinames = response['countings_scinames']
coverage = response['coverage']
detections = response['detections']
img_out = response['img_out']
img = Image.open(BytesIO(base64.b64decode(img_out)))
_, text = displaytext_detclasim(c_cnames, c_scinames, coverage)
return img, text
def testing_yolocounter(input_img):
api_url = 'http://yolocounter-test.us-east-1.elasticbeanstalk.com/predict'
response = send2api(input_img, api_url)
countings = response['countings_scinames']
coverage = response['coverage']
detections = response['detections']
img_out = response['img_out']
img = Image.open(BytesIO(base64.b64decode(img_out)))
text = displaytext_yolocounter(countings, coverage)
return img, text
def testing_directcounter(input_img):
api_url = 'http://directcounter-test.us-east-1.elasticbeanstalk.com/predict'
response = send2api(input_img, api_url)
countings = response['countings_scinames']
img, text = display_detectionsandcountings_directcounter(input_img, countings, prob_th=0, cth = 0)
return img, text
with gr.Blocks() as demo:
gr.Markdown("Submit an image with insects in a trap")
with gr.Tab("Species & Common Name Count"):
with gr.Row():
input1 = gr.Image()
output1 =[gr.Image().style(height=500, width=500), gr.Textbox(lines=20)]
button1 = gr.Button("Submit")
button1.click(testing_countingid, input1, output1)
with gr.Tab("Simplified Scientific Name Count"):
with gr.Row():
#input2 = gr.Image()
output2 =[gr.Image().style(height=500, width=500), gr.Textbox(lines=20)]
#button2 = gr.Button("Submit")
button1.click(testing_yolocounter, input1, output2)
""" with gr.Tab("Direct insect counter"):
with gr.Row():
#input3 = gr.Image()
output3 =[gr.Image().style(height=500, width=500), gr.Textbox(lines=20)]
#button3 = gr.Button("Submit")
button1.click(testing_directcounter, input1, output3)
"""
demo.launch() |