본문 바로가기
Deep Learning with Python

Data Augmentation

by Hot김치 2023. 4. 15.
데이터 증강(Data Augmentation)은 학습 데이터를 인위적으로 다양하게 만들어서
모델의 일반화 성능을 향상시키는 방법입니다.

 

데이터증강은 딥러닝모델에서 매우 중요한역할을 하며, 주어진 데이터에서 다양한 패턴을 학습할수 있도록 도와줍니다.
일반적으로 이미지 분류 및 객체 감지 문제에서 많이 사용되는 증강 기법은 다음과 같습니다.
  1. 좌우 반전: 이미지를 좌우로 반전하여 새로운 이미지를 만듭니다.
  2. 회전: 이미지를 일정 각도만큼 회전시켜 새로운 이미지를 만듭니다.
  3. 이동: 이미지를 상하좌우로 이동시켜 새로운 이미지를 만듭니다.
  4. 확대/축소: 이미지를 확대하거나 축소하여 새로운 이미지를 만듭니다.
  5. 가우시안 노이즈 추가: 이미지에 가우시안 노이즈를 추가하여 새로운 이미지를 만듭니다.
  6. 밝기 조절: 이미지의 밝기를 조절하여 새로운 이미지를 만듭니다.
  7. 컬러 증강: 이미지의 색조, 채도, 명도 등을 조절하여 새로운 이미지를 만듭니다.
이 외에도 다양한 증강 기법이 있으며, 문제에 따라 적합한 증강 기법을 선택하는 것이 중요합니다.
증강 기법은 모델이 학습하는 동안 이미지가 다양한 변형을 겪게 하므로, 모델의 일반화 성능을 향상시킬 수 있습니다.
그러나 증강 기법을 지나치게 사용하면 모델이 오버피팅(Overfitting)되기 쉬우므로 적절한 비율로 사용해야 합니다.

 

 

[Code]: random_crop
    lowres_crop_size = hr_crop_size // scale            # 96 //4 =24
    lowres_img_shape = tf.shape(lowres_img)[:2]         # height, width
   
    lowres_width = tf.random.uniform(
        shape=(), maxval=lowres_img_shape[1] - lowres_crop_size + 1, dtype=tf.int32
        )
    lowres_height = tf.random.uniform(
        shape=(), malval=lowres_img_shape[0] - lowres_crop_size + 1, dtype=tf.int32
        )

위 코드는 TensorFlow를 사용하여 저해상도 이미지(lowres_img)에서 무작위로 잘라낸 작은 이미지(lowres_crop)를 만드는 코드입니다. 이를 통해 딥러닝 모델을 학습할 때 입력 이미지와 출력 이미지 사이의 차이를 학습시킬 수 있습니다.

먼저, hr_crop_size는 고해상도 이미지(highres_img)에서 잘라내려는 크기입니다. // 연산자는 나누기 후 소수점 이하를 버리는 정수 나누기를 수행합니다. 따라서 lowres_crop_size는 hr_crop_size를 scale로 나눈 후 버림한 값입니다. 예를 들어, hr_crop_size가 96이고 scale이 4이면, lowres_crop_size는 24가 됩니다.

그 다음, lowres_img_shape는 lowres_img의 높이와 너비를 포함하는 1D Tensor입니다. tf.shape(lowres_img)는 lowres_img의 형상(shape)을 반환하는 TensorFlow 연산입니다. [:2]는 높이와 너비만 선택하라는 의미입니다.

그 후, lowres_width와 lowres_height는 lowres_img에서 무작위로 선택한 x, y 좌표입니다. tf.random.uniform() 함수를 사용하여 무작위 값을 생성합니다. 이 함수는 지정된 형태(shape)로 균등 분포의 무작위 값을 생성합니다. shape 인수는 생성할 텐서의 형태를 지정합니다. maxval은 생성 가능한 값 중 최대값을 지정합니다. 여기서 maxval은 lowres_img_shape에서 lowres_crop_size를 뺀 값입니다. 이렇게 하면 lowres_crop이 이미지 바깥으로 나가지 않도록 보장할 수 있습니다. 마지막으로 dtype은 생성할 값의 데이터 유형을 지정합니다. 이 경우 tf.int32로 지정합니다.

따라서 lowres_width와 lowres_height는 lowres_crop_size보다 작거나 같은 값으로 생성됩니다. 이 값은 lowres_img에서 임의로 선택한 작은 이미지를 나타내는 왼쪽 상단 모서리의 좌표입니다. 이 좌표와 lowres_crop_size를 사용하여 lowres_img에서 lowres_crop을 자르면 됩니다.