fcernafukuzaki commited on
Commit
e806366
1 Parent(s): 6331b5e

Código para YOLOv9

Browse files
Files changed (1) hide show
  1. app.py +86 -74
app.py CHANGED
@@ -20,102 +20,114 @@ Este Notebook se acelera opcionalmente con un entorno de ejecución de GPU
20
  import os
21
  import re
22
  import json
 
23
  import pandas as pd
24
  import gradio as gr
25
  import torch
26
  from PIL import Image
 
27
 
28
  # Images
29
- torch.hub.download_url_to_file('https://huggingface.co/spaces/Municipalidad-de-Vicente-Lopez/Trampas_Barcelo/resolve/main/2024-03-11T10-50-27.jpg', 'ejemplo1.jpg')
30
  torch.hub.download_url_to_file('https://i.pinimg.com/originals/c2/ce/e0/c2cee05624d5477ffcf2d34ca77b47d1.jpg', 'ejemplo2.jpg')
31
 
32
  # Model
33
- #model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # force_reload=True to update
34
-
35
- #model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt') # local model o google colab
36
- #model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt', force_reload=True, autoshape=True) # local model o google colab
37
- #model = torch.hub.load('path/to/yolov5', 'custom', path='/content/yolov56.pt', source='local') # local repo
38
- model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt', force_reload=True, autoshape=True, trust_repo=True)
39
-
40
-
41
- #HF_TOKEN = os.getenv("ZIKA_TOKEN_WRITE")
42
- #hf_writer = gr.HuggingFaceDatasetSaver(HF_TOKEN, "demo-iazika-flags")
43
-
44
- def getQuantity(string):
45
- contador_raw = ''.join(string.split(" ")[3:])
46
-
47
- resultado_especie_1 = 'Aedes'
48
- resultado_especie_2 = 'Mosquito'
49
- resultado_especie_3 = 'Mosca'
50
- resultado_cantidad_1 = ''.join(re.findall(r'\d+',''.join(re.findall(r'\d+'+resultado_especie_1, contador_raw))))
51
- resultado_cantidad_2 = ''.join(re.findall(r'\d+',''.join(re.findall(r'\d+'+resultado_especie_2, contador_raw))))
52
- resultado_cantidad_3 = ''.join(re.findall(r'\d+',''.join(re.findall(r'\d+'+resultado_especie_3, contador_raw))))
53
- resultado_cantidad_1 = resultado_cantidad_1 if len(resultado_cantidad_1) > 0 else "0"
54
- resultado_cantidad_2 = resultado_cantidad_2 if len(resultado_cantidad_2) > 0 else "0"
55
- resultado_cantidad_3 = resultado_cantidad_3 if len(resultado_cantidad_3) > 0 else "0"
56
-
57
- resultado_lista = [[resultado_cantidad_1,resultado_especie_1],
58
- [resultado_cantidad_2,resultado_especie_2],
59
- [resultado_cantidad_3,resultado_especie_3]]
60
-
61
- return resultado_lista
62
-
63
- def listJSON(resultado):
64
- resultado_lista = getQuantity(resultado)
65
- img_name = " ".join(resultado.split(" ")[0:2])
66
- img_size = "".join(resultado.split(" ")[2])
67
- strlista = ""
68
- for resultado_lista, description in resultado_lista:
69
- strlista += '{"quantity":"'+resultado_lista+'","description":"'+description+'"},'
70
- strlista = strlista[:-1]
71
- str_resultado_lista = '{"image":"'+str(img_name)+'","size":"'+str(img_size)+'","detail":['+strlista+']}'
72
- json_string = json.loads(str_resultado_lista)
73
- return json_string
74
-
75
- def arrayLista(resultado):
76
- resultado_lista = getQuantity(resultado)
77
- df = pd.DataFrame(resultado_lista,columns=['Cantidad','Especie'])
78
- return df
 
 
 
 
 
 
 
79
 
80
  def yolo(size, iou, conf, im):
81
  '''Wrapper fn for gradio'''
82
  g = (int(size) / max(im.size)) # gain
83
  im = im.resize((int(x * g) for x in im.size), Image.LANCZOS) # resize with antialiasing
84
 
 
85
 
86
- model.iou = iou
87
-
88
- model.conf = conf
89
 
90
-
91
- results2 = model(im) # inference
92
-
93
- results2.render() # updates results.imgs with boxes and labels
 
94
 
95
- results_detail = str(results2)
96
- lista = listJSON(results_detail)
97
- lista2 = arrayLista(results_detail)
98
- return Image.fromarray(results2.ims[0]), lista2, lista
99
 
100
  #------------ Interface-------------
101
 
 
 
 
 
102
 
103
-
104
- in1 = gr.inputs.Radio(['640', '1280'], label="Tamaño de la imagen", default='640', type='value')
105
- in2 = gr.inputs.Slider(minimum=0, maximum=1, step=0.05, default=0.25, label='NMS IoU threshold')
106
- in3 = gr.inputs.Slider(minimum=0, maximum=1, step=0.05, default=0.50, label='Umbral o threshold')
107
- in4 = gr.inputs.Image(type='pil', label="Original Image")
108
-
109
- out2 = gr.outputs.Image(type="pil", label="YOLOv5")
110
- out3 = gr.outputs.Dataframe(label="Cantidad_especie", headers=['Cantidad','Especie'], type="pandas")
111
- out4 = gr.outputs.JSON(label="JSON")
112
  #-------------- Text-----
113
  title = 'Trampas Barceló'
114
- description = '<p><center>Sistemas de Desarrollado por Subsecretaría de Modernización del Municipio de Vicente López. Advertencia solo usar fotos provenientes de las trampas Barceló, no de celular o foto de internet.<img src="https://www.vicentelopez.gov.ar/assets/images/logo-mvl.png" alt="logo" width="250"/></center></p>'
115
-
 
 
 
 
 
 
116
  article ="<p style='text-align: center'><a href='https://docs.google.com/presentation/d/1T5CdcLSzgRe8cQpoi_sPB4U170551NGOrZNykcJD0xU/edit?usp=sharing' target='_blank'>Para mas info, clik para ir al white paper</a></p><p style='text-align: center'><a href='https://drive.google.com/drive/folders/1owACN3HGIMo4zm2GQ_jf-OhGNeBVRS7l?usp=sharing ' target='_blank'>Google Colab Demo</a></p><p style='text-align: center'><a href='https://github.com/Municipalidad-de-Vicente-Lopez/Trampa_Barcelo' target='_blank'>Repo Github</a></p></center></p>"
117
 
118
- examples = [['640',0.25, 0.5,'ejemplo1.jpg'], ['640',0.25, 0.5,'ejemplo2.jpg']]
119
 
120
  iface = gr.Interface(yolo,
121
  inputs=[in1, in2, in3, in4],
@@ -125,11 +137,11 @@ iface = gr.Interface(yolo,
125
  examples=examples,
126
  analytics_enabled=False,
127
  allow_flagging="manual",
128
- flagging_options=["Correcto", "Incorrecto", "Casi correcto", "Error", "Otro"],
129
- #flagging_callback=hf_writer
130
  )
131
-
132
- iface.launch(enable_queue=True, debug=True)
 
133
 
134
  """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).
135
  ## Citation
 
20
  import os
21
  import re
22
  import json
23
+ import numpy as np
24
  import pandas as pd
25
  import gradio as gr
26
  import torch
27
  from PIL import Image
28
+ from ultralytics import YOLO
29
 
30
  # Images
31
+ torch.hub.download_url_to_file('https://i.pinimg.com/originals/7f/5e/96/7f5e9657c08aae4bcd8bc8b0dcff720e.jpg', 'ejemplo1.jpg')
32
  torch.hub.download_url_to_file('https://i.pinimg.com/originals/c2/ce/e0/c2cee05624d5477ffcf2d34ca77b47d1.jpg', 'ejemplo2.jpg')
33
 
34
  # Model
35
+ class YOLODetect():
36
+ def __init__(self, modelo):
37
+ self.modelo = modelo
38
+
39
+ def predecir(self, url):
40
+ # conf float 0.25 umbral de confianza del objeto para la detección
41
+ # iou float 0.7 umbral de intersección sobre unión (IoU) para NMS
42
+ self.source = url
43
+ self.results = self.modelo.predict(source=self.source, save=True, imgsz=640, conf=0.5, iou=0.40)
44
+ return self.results
45
+
46
+ def show(self):
47
+ results = self.results[0]
48
+ render = None #render_result(model=self.modelo, image=self.source, result=self.results[0])
49
+ render = Image.open(f"runs/detect/predict/{results.path}")
50
+ return render
51
+
52
+ def to_json(self):
53
+ results = self.results[0]
54
+ img_size = results.orig_shape
55
+ img_name = results.path
56
+ array_numpy = results.boxes.cls.cpu().numpy().astype(np.int32)
57
+
58
+ # Definir las clases y sus nombres correspondientes
59
+ clases = {
60
+ 0: "Aedes",
61
+ 1: "Mosquitos",
62
+ 2: "Moscas"
63
+ }
64
+
65
+ # Contabilizar las clases
66
+ conteo_clases = np.bincount(array_numpy)
67
+
68
+ self.json_result = [{'Especie': clases[i], 'Cantidad': str(conteo_clases[i]) if i < len(conteo_clases) else str(0)} for i in range(len(clases))]
69
+ # Crear un diccionario con los elementos necesarios
70
+ result_dict = {
71
+ "image": str(img_name),
72
+ "size": str(img_size),
73
+ "detail": self.json_result
74
+ }
75
+
76
+ # Convertir el diccionario a una cadena JSON
77
+ result_dict = json.dumps(result_dict)
78
+
79
+ # Convertir la cadena JSON a un objeto Python (diccionario)
80
+ result_dict = json.loads(result_dict)
81
+
82
+ return result_dict
83
+
84
+ def to_dataframe(self):
85
+ return pd.DataFrame(self.json_result)
86
+
87
+ modelo_yolo = YOLO('best.pt')
88
 
89
  def yolo(size, iou, conf, im):
90
  '''Wrapper fn for gradio'''
91
  g = (int(size) / max(im.size)) # gain
92
  im = im.resize((int(x * g) for x in im.size), Image.LANCZOS) # resize with antialiasing
93
 
94
+ print(type(im))
95
 
96
+ source = im#Image.open(im)
97
+ model = YOLODetect(modelo_yolo)
98
+ results = model.predecir(source)
99
 
100
+ result_json = model.to_json()
101
+ print(result_json)
102
+ result_df = model.to_dataframe()
103
+ print(result_df)
104
+ result_img = model.show()
105
 
106
+ return result_img, result_df, result_json
 
 
 
107
 
108
  #------------ Interface-------------
109
 
110
+ in1 = gr.Radio(['640', '1280'], label="Tamaño de la imagen", type='value')
111
+ in2 = gr.Slider(minimum=0, maximum=1, step=0.05, label='NMS IoU threshold')
112
+ in3 = gr.Slider(minimum=0, maximum=1, step=0.05, label='Umbral o threshold')
113
+ in4 = gr.Image(type='pil', label="Original Image")
114
 
115
+ out2 = gr.Image(type="pil", label="YOLOv5")
116
+ out3 = gr.Dataframe(label="Cantidad_especie", headers=['Cantidad','Especie'], type="pandas")
117
+ out4 = gr.JSON(label="JSON")
 
 
 
 
 
 
118
  #-------------- Text-----
119
  title = 'Trampas Barceló'
120
+ description = """
121
+ <p>
122
+ <center>
123
+ Sistemas de Desarrollado por Subsecretaría de Modernización del Municipio de Vicente López. Advertencia solo usar fotos provenientes de las trampas Barceló, no de celular o foto de internet.
124
+ <img src="https://www.vicentelopez.gov.ar/assets/images/logo-mvl.png" alt="logo" width="250"/>
125
+ </center>
126
+ </p>
127
+ """
128
  article ="<p style='text-align: center'><a href='https://docs.google.com/presentation/d/1T5CdcLSzgRe8cQpoi_sPB4U170551NGOrZNykcJD0xU/edit?usp=sharing' target='_blank'>Para mas info, clik para ir al white paper</a></p><p style='text-align: center'><a href='https://drive.google.com/drive/folders/1owACN3HGIMo4zm2GQ_jf-OhGNeBVRS7l?usp=sharing ' target='_blank'>Google Colab Demo</a></p><p style='text-align: center'><a href='https://github.com/Municipalidad-de-Vicente-Lopez/Trampa_Barcelo' target='_blank'>Repo Github</a></p></center></p>"
129
 
130
+ examples = [['640',0.45, 0.75,'ejemplo1.jpg'], ['640',0.45, 0.75,'ejemplo2.jpg']]
131
 
132
  iface = gr.Interface(yolo,
133
  inputs=[in1, in2, in3, in4],
 
137
  examples=examples,
138
  analytics_enabled=False,
139
  allow_flagging="manual",
140
+ flagging_options=["Correcto", "Incorrecto", "Casi correcto", "Error", "Otro"]
 
141
  )
142
+
143
+ iface.queue()
144
+ iface.launch(debug=True)
145
 
146
  """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).
147
  ## Citation