-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathagents.py
More file actions
198 lines (158 loc) · 7.63 KB
/
agents.py
File metadata and controls
198 lines (158 loc) · 7.63 KB
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#Librerias para el archivo
#pip install agentpy
#pip install owlready2
#pip install twilio
#pip install roboflow
import agentpy as ap #Para los agentes y simulación
#import numpy as np #Para ver los datos
import random #Para datos dummies
from owlready2 import * #Para ontologias
from twilio.rest import Client #Para enviar mensajes de whatsApp
from dotenv import load_dotenv #Para variables de entorno
from roboflow import Roboflow #Para la API de Roboflow
import os
# Initialize Roboflow model
load_dotenv()
rf = Roboflow(api_key=os.getenv('ROBOFLOW_API_KEY'))
project = rf.workspace().project("tc2008")
model = project.version(1).model
def camionDetectado(self, camera_id, current_step):
# Mapping camera_id to directory names
camera_dirs = {1: "camera1Images", 2: "camera2Images", 3: "camera3Images"}
camera_dir = camera_dirs.get(camera_id)
print(f"Folder: {camera_dir}")
if camera_dir is None:
print(f"Invalid camera ID: {camera_id}")
return False
image_file = f"{current_step}.png"
image_path = os.path.join(camera_dir, image_file)
# Check if the file exists and process it
if os.path.isfile(image_path):
json_output = model.predict(image_path, confidence=70, overlap=30).json()
for prediction in json_output['predictions']:
if prediction['class'] == 'full_truck':
print(f"Full truck found in {image_file} in directory {camera_dir}: {prediction}")
return True # Return True as soon as a full_truck is detected
return False # Return False if the file doesn't exist or no full_truck is detected
class camara(ap.Agent): #Agente camara
def setup(self):
#Beliefs del agente
self.detectCamion = False # Desires, contar los camiones detactados
self.countTrucks = 0 # Intentions, cuantos camiones ha detectado
self.totalTrucks = self.model.p.totalTrucks #El numero de camiones que han pagado
self.intentions = True #Intentions si quiere detectar camiones
self.conteoTotal = 0 #Conteo total de camiones de todos los agentes/camaras
def see(self, current_step): #Ver en el mapa (Imagen/Video) si hay un camión a la vista
if camionDetectado(self, self.id, current_step): #Enviar imagen a la funcion de camionDetected para que lo envie a roboflow
self.communicate("Camion detectado por camara ", self.id) #Hablar con el resto de las camaras y avisarles de su avistamiento
self.brf() #Cambiar las beliefs del agente
def brf(self): #si detecta un camion su belief de ver camion cambia a true y ve sus opciones
self.detectCamion = True
self.options()
def options(self): #si detecta camion y tiene la intencion de detectar va a dar la opcion de true y seguir al filtro
if self.detectCamion == True and self.intentions == True:
self.filter()
return True
else:
return False
def filter(self): #Si se detecta camion y esta la intencion de contar se llama a la acción
if self.detectCamion and self.intentions:
self.action()
self.detectCamion = False
def action(self): #Se cuenta el camion, se vota si reportarlo
self.countTrucks = self.countTrucks + 1
self.votacion()
self.conteoTotal = 0
#enviarWhats(f"Se detecto robo por la camara {self.id}")
def communicate(self, message, ids): #Comunicación entre agentes, el agente que detecte camión le avisa al resto de los agentes
for agente in self.model.agents:#Se envia mensaje a todos menos a si mismo
if self != agente:
agente.receive_message(message, ids)
def receive_message(self, message, id): #Metodo para recivir mensajes de otro agente
print("")
print(f"Agente {self.id} recibe el mensade: {message} del agente ", id)
self.reply(id)
def reply(self,ids):
for agente in self.model.agents:
if ids == agente.id:
agente.receive_reply(self.countTrucks , self.id)
def receive_reply(self, message, id): #Metodo para recivir mensajes de otro agente
print("Reply del agente ", id," : ",message," camiones detectados")
self.conteoTotal = self.conteoTotal + message
def votacion(self):
self.conteoTotal = self.conteoTotal + self.countTrucks
eleccion = 1
print("Conteo de camiones del agente ",self.id," : ",self.conteoTotal)
if self.conteoTotal > self.totalTrucks: #Si el numero de camiones totales es mayor al esperado se manda votar
print("Eleccion : el agente ",self.id," llama a votar, voto +")
for agente in self.model.agents:#Se envia mensaje a todos menos a si mismo
if self != agente:
eleccion = eleccion + agente.votar()
self.conteoTotal = 0
if eleccion >= self.model.p.numCamaras/2:
print("Se ha votado por que se reporte el robo")
mensaje = "Se ha detectado un robo en la camara " + str(self.id)
enviarWhats(mensaje)
else:
print("Se ha votado por no reportar el robo")
def votar(self): #Se vota para reportar el robo
if self.intentions:
print("El agente ",self.id," vota +")
return 1
else:
print("El agente ",self.id," vota -")
return 0
class simulacion(ap.Model):
def setup(self):#Set up de los agentes dentro de la simulacion
# Create agents list
self.agents = ap.AgentList(self, self.p.numCamaras, camara)
self.current_step = 0 # Initialize step counter
def step(self):#En cada paso los agentes miran si detectan un camión
self.current_step += 1 # Increment step counter
for agent in self.agents:
agent.see(self.current_step) # Pass the current step to the see method
def update(self): #Por cada update se ve el numero de camiones detectados por camara
camionesContados = 0
total = 0
for agentes in self.agents:
camionesContados = agentes.countTrucks
total = total + camionesContados
print("Total de camiones detectado por camara ",agentes.id," -> ",camionesContados )
self.record('Camionestotales', total)
def end(self):#AL final de la evaluación se ve el numero de camiones contados por camara
mensaje = "Reporte del día : "
print("Camiones contados por agente durante la simulación")
for agente in self.agents:
mensaje = mensaje + " La camara "+str(agente.id)+" detecto "+str(agente.countTrucks)+" camiones. "
print("La camara ",agente.id," detecto ",agente.countTrucks)
enviarWhats(mensaje)
def simi(numCam, pasos, total):#Prep para la simulación
parameters = { #Parametros de la simulación
'numCamaras': numCam, #EL numero de camaras/agentes
'steps' : pasos, #El numero de pasos a realizar
'totalTrucks' : total #El numero de camiones pagados
}
model = simulacion(parameters)
results = model.run()
print(results)
print(results.info)
#print(results.variables.simulacion)
resultados = results.variables.simulacion.iloc[-1]
resutadoFinal = resultados['Camionestotales']
enviarWhats(f"Se robaron {resutadoFinal-total} camiones")
def enviarWhats(mensajeEnviar): #No subir esto a github porque me dexean
account_sid = os.getenv('TWILIO_ACCOUNT_SID')
auth_token = os.getenv('TWILIO_AUTH_TOKEN')
client = Client(account_sid, auth_token)
message = client.messages.create(
from_='whatsapp:+14155238886',
body=mensajeEnviar,
to='os.getenv("PHONE_NUMBER")'
)
print(message.sid)
print("Mensajes de whatsApp")
print(mensajeEnviar)
numCamaras = 3 #el numero de camaras/carpetas de imagenes
pasos = 40 #numero de iteraciones de los agentes, se cambia al numero de fotos a analizar
numeroCamiones = 4 #Camiones que pagaron
simi(numCamaras, pasos, numeroCamiones)