Spaces:
Sleeping
Sleeping
| import os | |
| import cv2 | |
| import pandas as pd | |
| import torch | |
| import torch.nn as nn | |
| import torchvision.transforms as transforms | |
| from torchvision.models import resnet18 # Usaremos uma CNN pré-treinada (ResNet18) | |
| # Configurações | |
| DATASET_PATH = "./animals/" # Pasta principal com as subpastas de animais | |
| CSV_FOLDER = "./csv_folder" # Pasta para salvar os CSVs | |
| IMAGE_SIZE = (224, 224) # Tamanho das imagens para a CNN | |
| # Criar a pasta csv_folder se não existir | |
| if not os.path.exists(CSV_FOLDER): | |
| os.makedirs(CSV_FOLDER) | |
| # Carregar uma CNN pré-treinada (ResNet18) e remover a camada final (fully connected) | |
| cnn_model = resnet18(pretrained=True) | |
| cnn_model = nn.Sequential(*list(cnn_model.children())[:-1]) # Remove a última camada | |
| cnn_model.eval() # Colocar o modelo em modo de avaliação | |
| # Transformações para a imagem | |
| transform = transforms.Compose([ | |
| transforms.ToPILImage(), | |
| transforms.Resize(IMAGE_SIZE), | |
| transforms.ToTensor(), | |
| transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # Normalização para o modelo pré-treinado | |
| ]) | |
| # Função para extrair características de uma imagem usando a CNN | |
| def extract_features(image): | |
| with torch.no_grad(): # Desativar cálculo de gradientes | |
| image_tensor = transform(image).unsqueeze(0) # Adicionar dimensão do batch | |
| features = cnn_model(image_tensor) # Extrair características | |
| return features.flatten().numpy() # Achatar e converter para numpy array | |
| # Função para processar uma subpasta (espécie) e salvar em um DataFrame | |
| def process_animal_folder(animal_class, class_path): | |
| # Lista para armazenar os dados da subpasta | |
| data = [] | |
| # Percorrer as imagens da subpasta | |
| for image_name in os.listdir(class_path): | |
| image_path = os.path.join(class_path, image_name) | |
| try: | |
| # Verificar se o arquivo é uma imagem válida | |
| if not image_name.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')): | |
| print(f"Ignorando arquivo não suportado: {image_path}") | |
| continue | |
| # Carregar a imagem | |
| image = cv2.imread(image_path) | |
| if image is None: | |
| raise ValueError(f"Falha ao carregar a imagem: {image_path}") | |
| # Extrair características usando a CNN | |
| features = extract_features(image) | |
| # Adicionar ao dataset com o label sendo o nome da subpasta | |
| data.append([animal_class] + list(features)) | |
| except Exception as e: | |
| print(f"Erro ao processar {image_path}: {e}") | |
| # Verificar se há dados antes de criar o DataFrame | |
| if not data: | |
| print(f"Nenhuma imagem válida encontrada na pasta: {class_path}") | |
| return None | |
| # Criar DataFrame | |
| columns = ["label"] + [f"feature_{i}" for i in range(len(data[0]) - 1)] | |
| df = pd.DataFrame(data, columns=columns) | |
| return df | |
| # Percorrer as subpastas | |
| for animal_class in os.listdir(DATASET_PATH): | |
| class_path = os.path.join(DATASET_PATH, animal_class) | |
| # Verificar se é uma pasta | |
| if os.path.isdir(class_path): | |
| print(f"Processando imagens da classe: {animal_class}") | |
| # Processar a subpasta e obter o DataFrame | |
| df = process_animal_folder(animal_class, class_path) | |
| if df is not None: | |
| # Salvar CSV com o nome do animal | |
| csv_filename = os.path.join(CSV_FOLDER, f"{animal_class}_dataset.csv") | |
| try: | |
| df.to_csv(csv_filename, index=False) | |
| print(f"Dataset salvo como '{csv_filename}'") | |
| except Exception as e: | |
| print(f"Erro ao salvar o dataset {csv_filename}: {e}") | |
| print("Processamento concluído!") |