이미지 데이터 전처리
1. 데이터 전처리와 Augmentation

모델이 적은 이미지에서 최대한 많은 정보를 뽑아내서 학습할 수 있도록 우선 이미지를 augment함

이미지를 사용할 때마다 임의로 변형을 가함으로써 마치 훨씬 더 많은 이미지를 보고 공부하는 것과 같은 학습 효과를 낸다.

이를 통해 과적합(overfitting), 즉 모델이 학습 데이터에만 맞춰지는 것을 방지하고, 새로운 이미지도 잘 분류할 수 있게 됨.

이런 전처리 과정을 돕기 위해 케라스는 ImageDataGenerator 클래스를 제공

  1. 학습 도중에 이미지에 임의 변형 및 정규화 적용
  2. 변형된 이미지를 배치 단위로 불러올 수 있는 generator 생성
    1. generator를 생성할 때 flow(data, labels), flow_from_directory(directory) 두 가지 함수를 사용
    2. fir_generator, evaluate_generator 함수를 이용하여 generator로 이미지를 불러와서 모델을 학습할 수 있음

from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
        rotation_range = 40,        #이미지 회전 범위 (degrees)
        width_shift_range = 0.2,    #그림을 수평 또는 수직으로 랜덤하게 평행 이동시키는 범위 (원본 가로, 세로 길이에 대한 비율 값)
        height_shift_range = 0.2,    
        rescale = 1./255,             #원본 영상은 0-255의 RGB 계수로 구성되는데, 
       이 같은 입력값은 모델을 효과적으로 학습시키기에 너무 높음 (통상적인 learning rate를 사용할 경우). 
       그래서 이를 1/255로 스케일링하여 0-1 범위로 변환. 이는 다른 전처리 과정에 앞서 가장 먼저 적용.
        shear_range = 0.2,           #임의 전단 변환 (shearing transformation) 범위
        zoom_range = 0.2,           #임의 확대/축소 범위
        horizontal_flip = True,       #True로 설정할 경우, 50% 확률로 이미지를 수평으로 뒤집음
        원본 이미지에 수평 비대칭성이 없을 때 효과적. 즉, 뒤집어도 자연스러울 때 사용하면 좋음.
        fill_mode = `nearest`)        #이미지를 회전, 이동하거나 축소할 때 생기는 공간을 채우는 방식




2. ImageDataGenerator 디버깅
Generator를 이용해서 학습하기 전, 먼저 변형된 이미지이상한 점이 없는지 확인해야 함. 케라스는 이를 돕기 위해 flow라는 함수를 제공. 여기서 rescale 인자는 빼고 진행(255배 어두운 이미지는 아무래도 눈으로 확인하기 힘들 테니까)

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
datagen = ImageDataGenerator(
        rotation_range = 40,
        width_shift_range = 0.2,
        height_shift_range = 0.2,
        shear_range = 0.2,
        zoom_range = 0.2,
        horizontal_flip = True,
        fill_mode = `nearest`)




3. Image Load하여 여러 Image 생성
i = 0
img = load_img('로드할 파일경로, 이름')              #PIL 이미지
x = img_to_array(img)                              #(3, 150, 150) 크기의 NumPy 배열
x = x.reshape((1,) + x.shape)                      #(1, 3, 150, 150) 크기의 NumPy 배열

#임의 변환된 이미지를 배치 단위로 생성해서
for batch in datagen.flow(x, batch_size=1, save_to_dir=`저장할위치`, save_prefix=`파일이름`, save_format=`파일포맷`):
    i += 1
    if i > 20:
        break  #이미지 20장을 생성하고 마침




4. Image와 카테고리를 X, Y값으로 나누기

caltech_dir = "train 이미지 경로"

categories = ["road", "water", "noroad" .....]

nb_classes = len(categories)


image_w = 28

image_h = 28


pixels = image_h * image_w + 3


X = []

Y = []


for idx, cat in enumerate(categories):        #카테고리별로 돌면서 0으로 초기화

label = [0 for i in range(nb_classes)]

label[idx] = 1


image_dir = caltech_dir + "/" + cat    #cat 아님 category의 cat임

file = glob.glob(image_dir + "*.jpg")


for i, f in enumerate(files):

img = Image.open(f)

img = img.convert("RGB")

img = img.resize((image_w, image_h))

data = np.asarray(img)


X.append(data)

Y.append(label)



결과물 ---> image_data.npy


결과물을

X_train, X_test, y_train, y_test = np.load("./image_data.npy")

이렇게 load해서 사용하면 된다.

그리고 모델링을 한다음 학습하고 테스트하면 됨.


  Comments,     Trackbacks
최근 작성 글
최근 작성 댓글
최근 작성 트랙백
프로필
공지사항
글 보관함
캘린더
«   2024/04   »
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
TODAY TOTAL