일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- c++
- DP
- 자바스크립트
- 세그먼트 트리
- Overfitting
- object detection
- 플로이드 와샬
- 이분 탐색
- pytorch
- tensorflow
- 너비 우선 탐색
- lazy propagation
- 다익스트라
- dropout
- 조합론
- 미래는_현재와_과거로
- 백트래킹
- 크루스칼
- 2023
- 회고록
- BFS
- 알고리즘
- 가끔은 말로
- dfs
- 분할 정복
- 문자열
- 우선 순위 큐
- 가끔은_말로
- back propagation
- NEXT
- Today
- Total
Doby's Lab
Image Augmentation이란? 본문
Image Augmentation
Image Augmentation(이미지 증강)이란 Overfitting을 막는 방법 중 하나입니다.
더 디테일하게 말하자면 데이터셋의 크기가 작으면 train_set에 대해 모델이 학습할 수 있는 게 적습니다. 그렇기에 모델이 작은 train_set에 대해 최적화되게 학습을 하면서 Overfitting이 나는 현상에 대한 해결책입니다.
즉, Overfitting이 나는 이유가 '데이터셋의 크기가 작아서 그렇구나'라는 의심을 가지고서 Image Augmentation을 사용해야겠다는 판단을 할 수 있는 게 중요하다고 시작하기 전에 앞서 말하고 싶습니다. Overfitting이 일어나는 이유와 이를 대처하는 방법은 항상 여러 가지가 있으니까요. (Regularization, Dropout, Batch Normalization 등)
이미지를 증강시키는 법은 '기존의 이미지에 대해 변형을 주는 것'이 전부입니다.
Cropping, Reverse, Rotation 등 이미지에 여러 변형을 주어 모델이 받아들이기에 새로운 이미지처럼 만드는 것입니다.
이미지에 변형을 줌으로써 모델이 이미지를 처리할 때, Conv Layers에 의해 여러 Convolution을 거치면서 나오는 결괏값이 다를 것입니다. 그러한 결괏값들을 특정 Label임을 학습하여 더 다양한 이미지에 대응할 수 있는 모델을 만드는 것입니다.
보편적으로 ImageDataGenerator를 사용하지만 현재 진행 중인 프로젝트에서는 Numpy와 cv2에서 제공하는 함수를 활용하여 기본적인 Augmentation(좌우반전, +45도 기울이기, -45도 기울이기)만 해주었습니다.
(나중에 프로젝트가 끝난 후에 ImageDataGenerator에 대해 공부한 후, 블로그에 정리하여 이 글에 링크를 걸겠습니다.)
Image Augmentation Code
# Image Augmentation
cX, cY = 112, 112
IMG_SIZE = 224
for i, img in enumerate(train_set):
img_crop = crop_center(img)
# Gray Scaling -> 메모리 줄이기 위한 목적을 사용
img_gray = cv2.cvtColor(img_crop, cv2.COLOR_BGR2GRAY)
train_scaled.append(img_gray)
# reverse left and right
img_crop_rot90 = np.rot90(img_gray, k=2)
img_crop_flip = np.flipud(img_crop_rot90)
train_scaled.append(img_crop_flip)
# right 45 Degree
rot_r_45= cv2.getRotationMatrix2D((cX, cY), 45, 1.0)
img_r_45 = cv2.warpAffine(img_gray, rot_r_45, (IMG_SIZE, IMG_SIZE))
train_scaled.append(img_r_45)
# left 45 Degree
rot_l_45= cv2.getRotationMatrix2D((cX, cY), -45, 1.0)
img_l_45 = cv2.warpAffine(img_gray, rot_l_45, (IMG_SIZE, IMG_SIZE))
train_scaled.append(img_l_45)
즉, Image Augmentation은 Overfitting이 일어나는 이유가 데이터셋의 사이즈가 작아서 그렇다는 판단과 어느 정도까지만 늘려주는 게 적당하겠다는 2가지 판단에 의해 잘 다루어야 하는 기술입니다.
또한, 증강 기법에 대해 극히 일부만 다루었습니다. 이번 글에서는 간략하게 증강이 무엇인지, 어떤 역할을 하는지만 다루려 했기에 ImageDataGenerator를 정리하면서 기회가 된다면 여러 증강에 대해서도 소개해보겠습니다.
Reference
https://ysyblog.tistory.com/152
https://lcyking.tistory.com/m/77
Augmentation using Numpy, cv2 Reference
https://www.kaggle.com/code/ichigoku/image-augmentation-using-numpy
https://yunwoong.tistory.com/125
'AI > Concepts' 카테고리의 다른 글
Dropout에 대하여 (1) | 2022.12.31 |
---|---|
L1, L2 Regularization에 대하여 (0) | 2022.12.31 |
Normalization이 필요한 이유 (0) | 2022.12.28 |
Gradient Descent와 Loss Function의 관계 (0) | 2022.09.03 |
Standardization(표준화)와 Normalization(정규화)의 차이 (0) | 2022.09.03 |