
실무나 프로젝트를 진행할때 일단 데이터가 있어야하는데..
그렇다면 이미지를 어떻게 모을까? 크롤링을 진행한다.
그렇다면 다음은? 전처리가 필요하다.
전처리때 무엇을?
만약 동물들의 이미지라면 고양이와 강아지의 사진을 100개씩 모은다고 가정하자.
그렇다면 고양이는 0번, 강아지는 1번과 같이 라벨링을 달아주는 작업이 필요하다.
또 이미지의 밝기 조절, 크기 늘리기, 돌리기 등의 작업 등 다양한 방법으로 학습시켜야한다.
이게 바로 이미지 증강(Image Augmentation)이다.
그리고 keras에서 제공하는 도구 중 이런 이미지 데이터를 증강(생성)하는 ImageDataGenerator라는 것이 있다.
이는 앞서 말한 것과 같이 동일한 데이터로 학습하면 특정 패턴에 과적합 될 수 있기 때문에 밝기를 조절하거나, 확대, 회전 등의 변환과정인 데이터 증강(Augmentation)으로 다양한 데이터로 학습할 수 있게 한다.
그리고 데이터 정규화(Normalization) 기능이 있으며,
배치 단위로 데이터를 제공하여, 대용량 데이터를 한 번에 가져오지 않고, 배치 단위로 불러오며 변환을 수행 할 수 있다.
또한 이를 사용하면 자동으로 라벨링까지 달아준다.
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rc("font", family="Malgun Gothic")
plt.rcParams["axes.unicode_minus"] = False
import matplotlib.image as mpimg
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import random
cat = mpimg.imread('data/animal/cats/cat.jpg')
dog = mpimg.imread('data/animal/dogs/dog.jpg')
fig, ax=plt.subplots(1,2,figsize=(3,3))
ax[0].imshow(cat)
ax[0].axis('off')
ax[1].imshow(dog)
ax[1].axis('off')
plt.tight_layout()
plt.show()

Random Rotation: 회전
# 데이터 생성
train_data_gen=ImageDataGenerator(rotation_range=60) # 최대 각도 60도 범위 지정
# 학습 생성
path='data/animal'
train_generator=train_data_gen.flow_from_directory(path,
target_size=(300, 300), # 불러오는 각 이미지 크기 조절
batch_size=1) # 한번에 1개의 이미지만 로드
Found 2 images belonging to 2 classes.
print(f"Class Num:", train_generator.num_classes)
print(f"Image Num:", train_generator.samples)
print(f"Class Name and Label:", train_generator.class_indices)
Class Num: 2
Image Num: 2
Class Name and Label: {'cats': 0, 'dogs': 1}
def plot_images(train_generator):
fig, ax=plt.subplots(2, 5, figsize=(18,6))
for row in range(2):
for col in range(5):
image, label=next(train_generator)
ax[row][col].imshow(image[0].astype('uint8'))
ax[row][col].axis('off')
plt.tight_layout()
plt.show()
plot_images(train_generator)

Random shift: 이동
# 데이터 생성
train_data_gen=ImageDataGenerator(width_shift_range=0.2, height_shift_range=0.2) # 0.2 이동 범위 지정
# 학습 생성
train_generator=train_data_gen.flow_from_directory(path,
target_size=(300, 300), # 불러오는 각 이미지 크기 조절
batch_size=1) # 한번에 1개의 이미지만 로드
plot_images(train_generator)
Found 2 images belonging to 2 classes.

딥러닝에서는 결국에 train_generator가 들어가는데, epoch마다 전부 다른 이미지가 생성된다.
따라서 정확도가 더 높아진다.
지금은 눈으로 보기 위해서 이렇게 for문을 이용해서 찍었지만 실제로 넣을때는 눈으로 볼 수는 없다.
Random Flip: 뒤집기
train_data_gen=ImageDataGenerator(horizontal_flip=True, vertical_flip=True)
train_generator=train_data_gen.flow_from_directory(path, target_size=(300,300), batch_size=1)
plot_images(train_generator)
Found 2 images belonging to 2 classes.

Random Zoom: 확대 및 축소
train_data_gen=ImageDataGenerator(zoom_range=0.5)
train_generator=train_data_gen.flow_from_directory(path, target_size=(300,300), batch_size=1)
plot_images(train_generator)
Found 2 images belonging to 2 classes.

Random Brightness: 밝기
- 숫자 클수록 더 밝음
train_data_gen=ImageDataGenerator(brightness_range=[0.3, 1])
train_generator=train_data_gen.flow_from_directory(path, target_size=(300,300), batch_size=1)
plot_images(train_generator)
Found 2 images belonging to 2 classes.

Random Channel Shift: RGB
- RGB 채널값 조정
train_data_gen=ImageDataGenerator(channel_shift_range=100)
train_generator=train_data_gen.flow_from_directory(path, target_size=(300,300), batch_size=1)
plot_images(train_generator)
Found 2 images belonging to 2 classes.

Random Seer: 이미지 관점 변경
- 펴지거나 늘어나거나, 사다리꼴 등
train_data_gen=ImageDataGenerator(shear_range=25) # 최대 25도까지 기울이기
train_generator=train_data_gen.flow_from_directory(path, target_size=(300,300), batch_size=1)
plot_images(train_generator)
Found 2 images belonging to 2 classes.

정리
이렇게 다양한 옵션이 있으며, 보통 회전이나 이동같은 것들을 적절하게 상황을 보고 사용해야한다.
다쓰면 에폭마다 다 만들어버리게 되니까 결국 메모리가 터질 것이다.