< Data Augmentation >
- 갖고 있는 데이터셋을 여러가지 방법으로 증강시켜(augment) 실질적인 학습 데이터셋의 규모를 키울 수 있는 방법이다
- 일반적으로 하드디스크에 저장된 이미지 데이터를 메모리에 로드한 후, 학습시킬 때 변형을 가하는 방법을 사용한다
- 이를 통해 1장의 이미지를 더 다양하게 쓸 수 있게 된다
- 데이터가 많아진다는 것은 과적합(overfiting)을 줄일 수 있다는 것을 의미한다
- 가지고 있는 데이터셋이 실제 상황에서의 입력값과 다를 경우, augmentation을 통해서 실제 입력값과 비슷하 데이터 분포를 만들어 낼 수 있다
- data augmentation은 데이터를 늘릴 뿐만 아니라 모델이 실제 테스트 환경에서 잘 동작할 수 있도록 도와주기도 한다.
- 이미지 데이터의 augmentation은 밑에 사진처럼 이미지 데이터를 회전시키고, 확대하거나 축소하고, 변형시켜서 새로운 데이터를 얻는 과정이다.
1. Image Augmentation 방법
(1) Flipping
- Flip은 이미지를 대칭하는 기능
- 좌우 또는 상하로 이미지를 반전시키는 방법
- 분류 문제에서는 문제가 없을 수 있지만 물체 탐지(detection), 세그멘테이션(segmentation) 문제 등 정확한 정답 영역이 존재하는 문제에 적용할 때에는 라벨도 같이 좌우 반전을 해주어야 한다.
- 만약 숫자나 알파벳 문자를 인식(recognition)하는 문제에 적용할 때도 주의해야 한다. 상하나 좌우가 반정될 경우 다른 글자가 될 가능성이 있기 때문에.
(2) Gray scale
- Gray scale은 3가지 채널(channel)을 가진 RGB 이미지를 하나의 채널을 가지도록 해준다.
- 아래의 시각화 예제는 흑백 대신 다른 색상으로 이미지를 표현했다.
- RGB 각각의 채널마다 가중치(weight)를 주어 가중합(weighted sum)을 했다. 사용된 가중치의 경우 합이 1이 됨을 알 수 있다.
(3) Saturation
- Saturation은 RGB 이미지를 HSV(Hue(색조), Saturation(채도), Value(명도)의 3가지 성분으로 색을 표현) 이미지로 변경하고 S(saturation) 채널에 오프셋(offset)을 적용, 조금 더 이미지를 선명하게 만들어 준다.
- 이후 다시 우리가 사용하는 RGB 색상 모델로 변경을 해준다.
(4) Brightness
- 밝기를 조절할 수도 있다.
- 우리가 주로 사용하는 RGB에서 (255,255,255)는 흰색을, (0,0,0)은 검은색을 의미한다. 따라서 이미지는 RGB 채널에서 값을 더해주면 밝아지고, 빼주면 어두워진다.
(5) Rotation
- Rotation은 이미지의 각도를 변환해 준다
- 90도의 경우 직사각형 형태가 유지되기 때문에 이미지의 크기만 조절해 주면 바로 사용할 수 있다.
- 하지만 90도 단위로 돌리지 않는 경우 직사각형 형태에서 기존 이미지로 채우지 못하는 영역을 어떻게 처리해야 할지 유의해야 한다.
(6) Center Crop
- Center crop은 이미지의 중앙을 기준으로 확대하는 방법이다.
- 너무 작게 center crop을 할 경우 본래 가진 라벨과 맞지 않게 되는 상황이 발생할 수 있으니 주의가 필요하다.
- 예를 들어 고양이 라벨의 이미지를 확대해 한 장 더 만들어내려면, 이미지 내에 고양이의 형상을 유지해야 하고 털만 보이는 이미지를 만들어서는 안된다.
(7) 그외
- Gaussian noise
- Contrast change
- Sharpen
- Affine transformation
- Padding
- Blurring
2. 텐서플로우를 사용한 Image Augmentation
(1) Flip
- filp_left_right 와 filp_up_down 두 가지로 좌우와 상하 반전으로 구분
(2) Center Crop
- tf.image.central_crop()
- 매개변수를 통해 얼마나 확대를 할지 조절
- 1.0 인 경우 원본 이미지와 같다.
- tf.image.random_crop()
- https://www.tensorflow.org/api_docs/python/tf/image/random_crop
tf.image.random_crop | TensorFlow Core v2.8.0
Randomly crops a tensor to a given size.
www.tensorflow.org
(3) Brightness
- tf.image.random_brightness()
- https://www.tensorflow.org/api_docs/python/tf/image/random_brightness
tf.image.random_brightness | TensorFlow Core v2.8.0
Adjust the brightness of images by a random factor.
www.tensorflow.org
3. albumentations 라이브러리
- 이미지 증강을 위한 python 라이브버리
- 이미지 증강은 딥러닝 및 컴퓨터 비전 작업에서 훈련된 모델의 품질을 높이는 데 사용된다
https://github.com/albumentations-team/albumentations
GitHub - albumentations-team/albumentations: Fast image augmentation library and an easy-to-use wrapper around other libraries.
Fast image augmentation library and an easy-to-use wrapper around other libraries. Documentation: https://albumentations.ai/docs/ Paper about the library: https://www.mdpi.com/2078-2489/11/2/125 -...
github.com
transforms.Affine()
- `transforms.Affine()`의 `Affine()`은 아핀 변환(Affine transform)을 이미지에 적용한다.
- 2D 변환의 일종인 아핀 변환은 이미지의 스케일(scale)을 조절하거나 평행이동, 또는 회전 등의 변환을 줄 수 있다
[이미지 회전]
import albumentations as A
for i in range(5):
transform = A.Compose([
A.Affine(rotate=(-45, 45),scale=(0.5,0.9),p=0.5)
])
transformed = transform(image=image_arr)
plt.figure(figsize=(12,12))
plt.imshow((transformed['image']))
plt.show()
[이미지 크롭]
for i in range(5):
transform = A.Compose(
[A.RandomCrop(width=256, height=256)]
)
transformed = transform(image=image_arr)
visualize(transformed['image'])
[MedianBlur() - 블러처리]
transform = A.Compose(
[
A.MedianBlur (blur_limit=7, always_apply=False, p=0.5)]
)
transformed = transform(image=image_arr)
visualize(transformed['image'])
[ToGray(),MultiplicativeNoise()]
- augmentation 기법들을 한 번에 조합하여 사용
transform = A.Compose(
[A.ToGray(p=1),
A.MultiplicativeNoise(multiplier=[0.5, 1.5], elementwise=True, per_channel=True, p=1)]
)
transformed = transform(image=image_arr)
visualize(transformed['image'])
* 코드 예시는
https://github.com/Journey99/AIFFEL_GOINGDEEPER/blob/main/GD3.ipynb
GitHub - Journey99/AIFFEL_GOINGDEEPER
Contribute to Journey99/AIFFEL_GOINGDEEPER development by creating an account on GitHub.
github.com
'AIFFEL > GoingDeeper-CV' 카테고리의 다른 글
[AIFFEL/GoingDeeper] OCR - Text recognition (0) | 2022.04.13 |
---|---|
[AIFFEL/GoingDeeper] OCR - Text detection (0) | 2022.04.13 |
[AIFFEL/GoingDeeper] Cutmix & Mixup Augmentation (0) | 2022.03.29 |
[AIFFEL/GoingDeeper] ResNet-34와 ResNet-50 Tensorflow 구현하기 (0) | 2022.03.25 |
[AIFFEL/GoingDeeper] VGG-16/VGG-19 Tensorflow 구현하기 (0) | 2022.03.22 |