의의
- Data 개수에 비해 model capacity가 큰 경우, 데이터 자체를 암기해 overfitting이 발생할 우려가 있습니다.
- 데이터 증강을 통해 데이터셋을 확장시킬 수 있고, 모델이 학습할 수 있는 패턴이 늘어나게 됩니다.
- 회전, 비틀림, 노이즈 등 현실에서 나타날 수 있는 변형에 대해서도 강인하게 대응할 수 있게 됩니다.
- 사진을 찍을 때, 같은 장소에서도 각기 다른 각도, 조명, 다른 배경 등으로 다양하게 찍을 수 있습니다. 이렇게 다양하게 찍은 사진을 보면서 사물을 인식하는 능력이 향상되는 것처럼, 데이터 증강은 모델이 데이터를 다양한 방법으로 보게 함으로써 모델의 학습 능력을 향상 시킵니다.
유의
- Vision Task 수행에 따라서 유의해야할 점을 알아봐야 한다.
- 예를 들어, classification 같은 경우에는 annotation (정답 라벨)이 augmentation의 영향을 받지 않습니다. 그러나 segmentation 같은 태스크의 경우 annotation이 segmentation map으로 이루어지는데, 이 때는 정답 annotation도 함께 augmentation 해주어야 합니다.
- 보통 vision dataset 같은 경우 (특히 classification dataset) 에는 보통 label에 해당하는 사물이 center에 위치하기 때문에, 너무 이상한 부분을 crop하면(Random Crop) 오히려 성능 하락이 있을 수 있습니다. 그래서 fixed center crop 등을 사용하곤 합니다.
- 도로 위 자동차의 경우, 아무래도 각도가 달라질 일이 없다보니 각도를 건들 경우 성능이 떨어질 수 있습니다.
Implementation
- torchvison.transforms, albumentations, Kornia 등
class QuickDrawDataset(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):
img = self.data[idx]
label = self.labels[idx]
if self.transform:
img = self.transform(img)
return img, label
transform = transforms.Compose([
transforms.RandomAdjustSharpness(sharpness_factor=0),
transforms.RandomVerticalFlip(),
transforms.GaussianBlur(kernel_size=5),
# transforms.RandomCrop(12),
transforms.RandomCrop(120),
transforms.ToTensor(),
transforms.Resize((150,150)),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
# 해당 mean 과 std 값은 ImageNet data의 mean, std 값으로,
# 통상적으로 normalize를 수행할 때 사용하는 값입니다
])
albumentations에 대해 더 알고 싶다면
'DL' 카테고리의 다른 글
model.train() / model.eval() / torch.no_grad() / torch.Tensor.require_grads (0) | 2023.12.04 |
---|---|
Pytorch에서 GPU를 사용 (0) | 2023.12.04 |
[VIT] Vision Transformer (2021) (0) | 2023.07.27 |
U-Net 실습4 - 모델 테스트 (0) | 2023.07.07 |
U-Net 실습3 - 모델 학습 및 Tensorboard (0) | 2023.07.06 |