HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
장지원 페이지/
📕
2024 UGRP
/
Member Page
Member Page
/
[11-12] 데이터 수집 + 모델

[11-12] 데이터 수집 + 모델

Task 1
Task 2

1. 추가 스케치 데이터 수집

happiness, sadness, fear, surprise, anger, and disgust 감정 바탕
 

1. Children - (Anger)

notion image
“시험을 못봤을 때의 제 감정을 담았습니다”
 
 

2. Children - (Sadness)

notion image
“옆에서 선생님이 노트북으로 공부하는 모습이 슬퍼보였습니다”
 

3. 20대 대학생 - (Happiness)

notion image
notion image
“화학공학도로써 졸업한 순간이 너무 행복해서 그림으로 그려봤음”
 

4. 20대 대학생 - (Happiness)

notion image
“지금 생각해보니 놀이터에서 놀던 순진한 때가 제일 행복했다”
 
 

5. 20대 대학생 - (Sadness)

notion image
“공부 때문에 20년 내내 스트레스 받아서 공부만 생각하면 슬프다”
 
 

2. 모델 코드 - ResNet

notion image
import torch import torch.nn as nn import torch.optim as optim from torchvision import models, transforms from torch.utils.data import DataLoader, Dataset from PIL import Image from datasets import load_dataset ds = load_dataset("xodhks/EmoSet118K_MonetStyle") emotion_classes = ["happiness", "sadness", "fear", "surprise", "anger", "disgust"] transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) class SketchDataset(Dataset): def __init__(self, data, labels, transform=None): self.data = data self.labels = labels self.transform = transform def __len__(self): return len(self.data) def __getitem__(self, idx): image = Image.open(self.data[idx]).convert("RGB") label = self.labels[idx] if self.transform: image = self.transform(image) return image, label # 모델 정의 (ResNet-18 사용) def create_resnet_model(num_classes): model = models.resnet18(pretrained=True) model.fc = nn.Linear(model.fc.in_features, num_classes) return model # 학습 및 평가 함수 def train_model(model, dataloader, criterion, optimizer, num_epochs=10): model.train() for epoch in range(num_epochs): running_loss = 0.0 for inputs, labels in dataloader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() * inputs.size(0) epoch_loss = running_loss / len(dataloader.dataset) print(f"Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}") device = torch.device("cuda" if torch.cuda.is_available() else "cpu") num_classes = len(emotion_classes) model = create_resnet_model(num_classes).to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) train_data = ["path/to/image1.jpg", "path/to/image2.jpg", ...] # 이미지 경로 리스트 train_labels = [0, 1, ...] # 각 이미지에 대한 라벨 (0~5까지의 정수로 매핑) train_dataset = SketchDataset(train_data, train_labels, transform=transform) train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) # 모델 학습 train_model(model, train_loader, criterion, optimizer, num_epochs=10)
  • 추가 수정 → 이미지를 제대로 못받음, 크기 조정?
 
import torch import torch.nn as nn import torch.optim as optim from torchvision import models, transforms from torch.utils.data import DataLoader, Dataset from datasets import load_dataset from PIL import Image # 감정 클래스 목록 및 매핑 emotion_classes = ["Anger", "Disgust", "Fear", "Happiness", "Sadness", "Surprise"] label_mapping = {emotion: idx for idx, emotion in enumerate(emotion_classes)} # 데이터 전처리 (이미지 크기 조정 및 정규화) transform = transforms.Compose([ transforms.Resize((224, 224)), # ResNet 입력 크기 transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) # 사용자 정의 데이터셋 클래스 class EmoSetDataset(Dataset): def __init__(self, dataset, transform=None): self.dataset = dataset self.transform = transform def __len__(self): return len(self.dataset) def __getitem__(self, idx): image = Image.fromarray(self.dataset[idx]["image"]).convert("RGB") label = label_mapping[self.dataset[idx]["emotion"]] if self.transform: image = self.transform(image) return image, label # 데이터셋 로드 ds = load_dataset("xodhks/EmoSet118K_MonetStyle") # 데이터셋 및 데이터로더 생성 train_dataset = EmoSetDataset(ds["train"], transform=transform) train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) # 모델 정의 (ResNet-18 사용) def create_resnet_model(num_classes): model = models.resnet18(pretrained=True) model.fc = nn.Linear(model.fc.in_features, num_classes) # 마지막 레이어 수정 return model # 모델, 손실 함수, 최적화 설정 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = create_resnet_model(num_classes=len(emotion_classes)).to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 학습 및 평가 함수 정의 def train_model(model, dataloader, criterion, optimizer, num_epochs=10): model.train() for epoch in range(num_epochs): running_loss = 0.0 for inputs, labels in dataloader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() * inputs.size(0) epoch_loss = running_loss / len(dataloader.dataset) print(f"Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}") # 학습 실행 train_model(model, train_loader, criterion, optimizer, num_epochs=10) # 모델 저장 예시 torch.save(model.state_dict(), "emotion_classification_resnet18.pth")