#CAPTURA import cv2 import os # Define la ruta de la carpeta donde se guardarán las fotos ESTE SE IRÁ MODIFICANDO ruta_carpeta = "data/test_set/YO" # Crea la carpeta si no existe if not os.path.exists(ruta_carpeta): os.makedirs(ruta_carpeta) # Inicializa la cámara cap = cv2.VideoCapture(0) # Define el tiempo de espera entre fotos (en milisegundos) tiempo_espera = 1000 # 1 segundos # Bucle principal while(True): # Lee un frame de la cámara ret, frame = cap.read() # Muestra el frame en la ventana cv2.imshow('Presiona "p" para tomar fotos', frame) # Espera por una tecla presionada key = cv2.waitKey(1) & 0xFF # Si se presiona la tecla "p" if key == ord('p'): # Toma 200 fotos for i in range(200): # Lee un frame de la cámara ret, frame = cap.read() # Guarda la foto con el nombre "i.jpg" nombre_archivo = os.path.join(ruta_carpeta, f"{i}.jpg") cv2.imwrite(nombre_archivo, frame) # Imprime un mensaje en la terminal print(f"Foto {i+1} tomada") # Espera el tiempo definido cv2.waitKey(tiempo_espera) # Imprime un mensaje de finalización print("Se tomaron 200 fotos") # Rompe el bucle break # Libera los recursos cap.release() cv2.destroyAllWindows()
@IN3DMEX2.0Ай бұрын
#ENTRENAMIENTO import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms from modelo import CNN # Importa la clase CNN # Define el dispositivo (CPU o GPU) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Define las transformaciones para las imágenes data_transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # Carga el dataset de entrenamiento train_dataset = datasets.ImageFolder(root='data/training_set', transform=data_transform) # Crea un DataLoader para el dataset de entrenamiento train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) # Crea una instancia de la CNN y mueve la red al dispositivo modelo = CNN().to(device) # Define el optimizador y la función de pérdida optimizer = optim.Adam(modelo.parameters(), lr=0.001) criterion = nn.CrossEntropyLoss() # Entrena la red num_epochs = 10 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = images.to(device) labels = labels.to(device) outputs = modelo(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if i % 100 == 0: print(f'Epoch {epoch+1}/{num_epochs}, Batch {i+1}/{len(train_loader)}, Loss: {loss.item():.4f}') # Guarda los pesos del modelo entrenado torch.save(modelo.state_dict(), 'modelo_pesos.pth')
@IN3DMEX2.0Ай бұрын
#MODELO import torch import torch.nn as nn class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1) self.relu1 = nn.ReLU() self.maxpool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1) self.relu2 = nn.ReLU() self.maxpool2 = nn.MaxPool2d(kernel_size=2, stride=2) self.flatten = nn.Flatten() self.fc1 = nn.Linear(32 * 56 * 56, 128) self.relu3 = nn.ReLU() self.fc2 = nn.Linear(128, 2) def forward(self, x): x = self.conv1(x) x = self.relu1(x) x = self.maxpool1(x) x = self.conv2(x) x = self.relu2(x) x = self.maxpool2(x) x = self.flatten(x) x = self.fc1(x) x = self.relu3(x) x = self.fc2(x) return x # Crea una instancia de la CNN modelo = CNN()
@IN3DMEX2.0Ай бұрын
#INFERENCIA import torch from torchvision import datasets, transforms from modelo import CNN # Importa la clase CNN import cv2 import os from PIL import Image import RPi.GPIO as GPIO import time LED = 7 GPIO.setmode(GPIO.BOARD) GPIO.setup(LED, GPIO.OUT) # Define el dispositivo (CPU o GPU) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Define las transformaciones para las imágenes data_transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # Crea una instancia de la CNN y mueve la red al dispositivo modelo = CNN().to(device) # Carga los pesos del modelo entrenado modelo.load_state_dict(torch.load('modelo_pesos.pth')) # Pon el modelo en modo de evaluación modelo.eval() # Inicializa la cámara cap = cv2.VideoCapture(0) # Define los nombres de las clases class_names = ['NADIE', 'YO'] # Bucle principal while(True): # Lee un frame de la cámara ret, frame = cap.read() # Convierte el frame a formato RGB frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # Crea una imagen PIL a partir del frame image = Image.fromarray(frame) # Aplica las transformaciones a la imagen image = data_transform(image) # Convierte la imagen a un tensor y mueve al dispositivo image = image.unsqueeze(0).to(device) # Realiza la predicción output = modelo(image) # Obtiene la clase predicha _, predicted_class = torch.max(output.data, 1) # Obtiene el nombre de la clase predicted_class_name = class_names[predicted_class.item()] # Enciende el LED si se detecta "YO" if predicted_class_name == "YO": GPIO.output(LED, True) else: GPIO.output(LED, False) # Imprime la clase predicha print(f'Predicted class: {predicted_class_name}') # Muestra el frame con la predicción cv2.imshow('Camera Feed', frame) # Espera por una tecla presionada if cv2.waitKey(1) & 0xFF == ord('q'): break # Libera los recursos cap.release() cv2.destroyAllWindows() #IMPORTANTE LIMPIAR PINES GPIO.cleanup(LED)