OceanApp / app.py
Geraldine J
Update file
b00b76d
raw
history blame
No virus
7.24 kB
# -*- coding: utf-8 -*-
"""Deploy OceanApp demo.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1j0T8gdLIa0X8fzkIgFpXDoU27BF49RUz?usp=sharing
![ ](https://i.pinimg.com/564x/3e/b8/f7/3eb8f7c348dffd7b3dffcafe81fbf2a6.jpg)
# Modelo
YOLO es una familia de modelos de detecci贸n de objetos a escala compuesta entrenados en COCO dataset, e incluye una funcionalidad simple para Test Time Augmentation (TTA), model ensembling, hyperparameter evolution, and export to ONNX, CoreML and TFLite.
## Gradio Inferencia
![](https://i.ibb.co/982NS6m/header.png)
Este Notebook se acelera opcionalmente con un entorno de ejecuci贸n de GPU
----------------------------------------------------------------------
YOLOv5 Gradio demo
*Author: Ultralytics LLC and Gradio*
# C贸digo
"""
#!pip install -qr https://raw.githubusercontent.com/ultralytics/yolov5/master/requirements.txt gradio # install dependencies
import gradio as gr
import pandas as pd
import torch
import logging
import json
import re
import os
import boto3
from botocore.exceptions import NoCredentialsError
import tempfile
import io
from PIL import Image
from pandas import json_normalize
# Imagenes por defecto para HF
torch.hub.download_url_to_file('https://i.pinimg.com/564x/18/0b/00/180b00e454362ff5caabe87d9a763a6f.jpg', 'ejemplo1.jpg')
torch.hub.download_url_to_file('https://i.pinimg.com/564x/3b/2f/d4/3b2fd4b6881b64429f208c5f32e5e4be.jpg', 'ejemplo2.jpg')
aws_access_key_id = os.environ['aws_access_key_id']
aws_secret_access_key = os.environ['aws_secret_access_key']
region = os.environ['region']
#Elimina espacios en blanco
def removeStr(string):
return string.replace(" ", "")
#Informacion del Dataframe a partir del json
def arrayListax(json_data):
dict = json_data
df2 = json_normalize(dict['detail'])
return df2
#Imagen temporal guardada en upload_file
def tempFileJSON(img_file):
temp = tempfile.NamedTemporaryFile(mode="wb")
with temp as jpg:
jpg.write(img_file)
print(jpg.name)
uf = upload_file(jpg.name)
return uf
# Envio de imagenes a S3
def upload_file(file_name, bucket=None, object_name=None):
"""Upload a file to an S3 bucket
:param file_name: File to upload
:param bucket: Bucket to upload to
:param object_name: S3 object name. If not specified then file_name is used
:return: Json if file was uploaded, else False
"""
# Si S3 object_name no esta especificado, usa file_name
if object_name is None:
object_name = os.path.basename(file_name+".jpg")
if bucket is None:
bucket = 'oceanapp'
s3_client = boto3.client('s3',aws_access_key_id=aws_access_key_id,aws_secret_access_key=aws_secret_access_key)
aws_region = boto3.session.Session().region_name
# Subida del archivo
try:
with open(file_name, "rb") as f:
response = s3_client.upload_fileobj(f, bucket, object_name)
s3_url = f"https://{bucket}.s3.amazonaws.com/{object_name}"
stado = '"url_details":[{"statusCode":200, "s3_url":"'+s3_url+'"}]'
print(s3_url)
except FileNotFoundError:
print("The file was not found")
return False
except NoCredentialsError as e:
logging.error(e)
return False
return stado
# Contador de los resultados del modelo
def qtyEspecies(datax, datay, resImg):
numLobos = 0
numPelicanos = 0
dfEspecies = pd.DataFrame(datax)
for i in range(0, dfEspecies['name'].size):
if(dfEspecies['class'][i] == 0):
numLobos= numLobos + 1
if(dfEspecies['class'][i] == 1):
numPelicanos= numPelicanos + 1
strlista = '"detail":[{"quantity":"'+str(numLobos)+'","description":"Lobo marino"},{"quantity":"'+str(numPelicanos)+'","description":"Pelicano"}]'
data = '{"image":"'+str(removeStr(datay[0:9]))+'","size":"'+str(removeStr(datay[11:18]))+'",'+strlista+','+resImg+'}'
json_data = json.loads(data)
return json_data
# Modelo Yolov5x
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt', force_reload=True, autoshape=True) # local model o google colab
def yolo(size, iou, conf, im):
try:
'''Wrapper fn for gradio'''
# gain
g = (int(size) / max(im.size))
im = im.resize((int(x * g) for x in im.size), Image.ANTIALIAS)
model.iou = iou
model.conf = conf
# inference
results2 = model(im)
# actualiza el results.imgs con boxes y labels
results2.render()
results3 = str(results2)
# contador de especies
results5=results2.pandas().xyxy[0].sort_values('name')
# transforma la img en bytes
pil_im = Image.fromarray(results2.ims[0])
b = io.BytesIO()
pil_im.save(b, 'jpeg')
im_bytes = b.getvalue()
fileImg = tempFileJSON(im_bytes)
#Envia la informacion al contador de especies
results6 = qtyEspecies(results5,results3,fileImg)
lista2 = arrayListax(results6)
return Image.fromarray(results2.ims[0]), lista2, results6
except Exception as e:
logging.error(e, exc_info=True)
#------------ Interface-------------
in1 = gr.inputs.Radio(['640', '1280'], label="Tama帽o de la imagen", default='640', type='value')
in2 = gr.inputs.Slider(minimum=0, maximum=1, step=0.05, default=0.45, label='NMS IoU threshold')
in3 = gr.inputs.Slider(minimum=0, maximum=1, step=0.05, default=0.50, label='Umbral o threshold')
in4 = gr.inputs.Image(type='pil', label="Original Image")
out2 = gr.outputs.Image(type="pil", label="Identificaci贸n con Yolov5")
out3 = gr.outputs.Dataframe(type="pandas", label="Descripci贸n", headers=['Cantidad','Especie'])
out4 = gr.outputs.JSON(label="JSON")
#-------------- Text-----
title = 'OceanApp'
description = """
<p>
<center>
<p>Sistema para el reconocimiento de las especies en la pesca acompa帽ante de cerco, utilizando redes neuronales convolucionales para una empresa del sector pesquero en los puertos de callao y paracas.</p>
<p><b>Nota</b>: Este modelo solo acepta imagenes de <b>Lobos marinos</b> o <b>Pelicanos</b> proporcionados por empresas peruanas.</p>
<center>
<img src="https://i.pinimg.com/564x/3e/b8/f7/3eb8f7c348dffd7b3dffcafe81fbf2a6.jpg" alt="logo" width="250"/>
</center>
</center>
</p>
"""
article ="<p style='text-align: center'><a href='' target='_blank'>Para mas info, clik para ir al white paper</a></p><p style='text-align: center'><a href='https://colab.research.google.com/drive/1j0T8gdLIa0X8fzkIgFpXDoU27BF49RUz?usp=sharing' target='_blank'>Google Colab Demo</a></p><p style='text-align: center'><a href='https://github.com/MssLune/OceanApp-Model' target='_blank'>Repo Github</a></p></center></p>"
examples = [['640',0.45, 0.75,'ejemplo1.jpg'], ['640',0.45, 0.75,'ejemplo2.jpg']]
iface = gr.Interface(yolo, inputs=[in1, in2, in3, in4], outputs=[out2,out3,out4], title=title, description=description, article=article, examples=examples,theme="huggingface", analytics_enabled=False).launch(
debug=True)
iface.launch()
"""For YOLOv5 PyTorch Hub inference with **PIL**, **OpenCV**, **Numpy** or **PyTorch** inputs please see the full [YOLOv5 PyTorch Hub Tutorial](https://github.com/ultralytics/yolov5/issues/36).
## Citation
[![DOI](https://zenodo.org/badge/264818686.svg)](https://zenodo.org/badge/latestdoi/264818686)
"""