logo

[computer-vision]

데이터 증강

 

데이터 증강 data augmentation

  • 데이터 생성의 어려움: 모델은 복사가 가능하지만, 데이터는 직접 만들어야 하므로 비용이 발생함.
  • 해결책으로서의 데이터 증강: 기존 데이터를 변형하여 데이터 양을 늘리는 기법.
  • 증강 방법 예시: 이미지 회전, 좌우 반전, 색상 변경 등을 통해 하나의 데이터를 여러 개로 불림.
  • 장점: 데이터 수집의 수고 없이 무료로 데이터 양을 늘릴 수 있음.
 

데이터 증강의 한계

  • 한계와 주의점: 데이터의 본질적인 의미를 변화시키지 않는 범위에서만 제한적으로 사용해야 함.
  • 부적절한 증강 예시:
    • 나비 종류 분류: 색상이 중요한 특징이므로 임의로 색을 바꾸면 안 됨.
    • 자율 주행: 주행 차선의 좌우 정보가 중요하므로 이미지를 좌우로 뒤집으면 안 됨. 신호등 색상 변경 또한 불가.
 

실습 준비

  • 예제 파일 열기
    from PIL import Image
    img = Image.open('pump_horse.jpg')
    
  • 여러 이미지 보기
    def concat_images(images):
        n = len(images)
        width, height = 128, 128
        total_width = n * width
        new_im = Image.new('RGB', (total_width, height), color='white')
        for i, im in enumerate(images):
            new_im.paste(im.resize((width, height)), (width * i, 0))
        return new_im
    
 

RandomPerspective

  • 무작위로 perspective를 바꿈
    transform = transforms.RandomPerspective(distortion_scale=0.6, p=1.0)
    concat_images([transform(img) for _ in range(4)])
    
 

RandomRotation

  • 무작위로 회전
    transform = transforms.RandomRotation(degrees=(0, 180))
    concat_images([transform(img) for _ in range(4)])
    
 

RandomAffine

  • 무작위 아핀 변환
    transform = transforms.RandomAffine(
        degrees=(30, 70), translate=(0.1, 0.3), scale=(0.5, 0.75), shear=(10, 30))
    concat_images([transform(img) for _ in range(4)])
    
 

RandomCrop

  • 무작위로 주어진 크기의 일부 영역을 잘라냄
    transform = transforms.RandomCrop(size=(128, 128))
    concat_images([transform(img) for _ in range(4)])
    
 

RandomResizedCrop

  • 무작위로 잘라낸 후, 정해진 크기로 변경
    transform = transforms.RandomResizedCrop(size=(512, 512))
    concat_images([transform(img) for _ in range(4)])
    
 

ColorJitter

  • 무작위로 색을 변경
  • brightness(밝기), contrast(대조), 채도(saturation), hue(색상)
    transform = transforms.ColorJitter(brightness=.5, hue=.3)
    concat_images([transform(img) for _ in range(4)])
    
 

RandomInvert

  • 무작위로 색 반전
    transform = transforms.RandomInvert()
    concat_images([transform(img) for _ in range(4)])
    
 

RandomPosterize

  • 무작위로 포스터화(색의 비트 수를 낮춤)
    transform = transforms.RandomPosterize(bits=2)
    concat_images([transform(img) for _ in range(4)])
    
 

RandomChoice

  • 무작위로 고르기
    transform = transforms.RandomChoice([
        transforms.RandomHorizontalFlip(),
        transforms.RandomVerticalFlip(),
        transforms.RandomRotation(180),
    ])
    concat_images([transform(img) for _ in range(4)])
    
 

RandomApply

  • 각각의 변환을 확률 p에 따라 무작위로 적용
    transform = transforms.RandomApply([
        transforms.RandomHorizontalFlip(),
        transforms.RandomVerticalFlip(),
        transforms.RandomRotation(180),
    ], p=0.9)
    concat_images([transform(img) for _ in range(4)])
    
 

RandomOrder

  • 무작위 순서로 적용
    transform = transforms.RandomOrder([
        transforms.RandomRotation(180),
        transforms.RandomCrop((256, 256)),
    ])
    concat_images([transform(img) for _ in range(4)])
    
 

증강의 경우 transform 예시

transform = transforms.Compose([
    transforms.RandomChoice([  # 증강
        transforms.RandomHorizontalFlip(),
        transforms.RandomVerticalFlip(),
    ]),
    transforms.Resize((256, 256)),  # 이미지마다 크기가 다르므로 통일
    transforms.CenterCrop((IMAGE_SIZE, IMAGE_SIZE)),  # 가운데만 잘라냄
    transforms.ToTensor(),
    transforms.Lambda(lambda x: (x / 127.5) - 1)
])
Previous
이미지 로딩