티스토리 뷰

Optimizer 필기한거

201030

 

1. cats_dogs 이미지 분할

파일 구조

# 폴더구조 생성 및 고양이, 멍멍이 이미지 각 폴더로 복사

import os, shutil

original_dataset_dir = './data/cat_dog/train'

base_dir = 'data/cat_dog_full'
os.mkdir(base_dir)

train_dir = os.path.join(base_dir,'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir,'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir,'test')
os.mkdir(test_dir)


train_cats_dir = os.path.join(train_dir,'cats')
os.mkdir(train_cats_dir)
train_dogs_dir = os.path.join(train_dir,'dogs')
os.mkdir(train_dogs_dir)

validation_cats_dir = os.path.join(validation_dir,'cats')
os.mkdir(validation_cats_dir)
validation_dogs_dir = os.path.join(validation_dir,'dogs')
os.mkdir(validation_dogs_dir)

test_cats_dir = os.path.join(test_dir,'cats')
os.mkdir(test_cats_dir)
test_dogs_dir = os.path.join(test_dir,'dogs')
os.mkdir(test_dogs_dir)

## file 복사 ##
## 고양이와 멍멍이가 각각 12,500개
## train : 7,000 
## validation : 3,000
## test : 2,500 

fnames = ['cat.{}.jpg'.format(i) for i in range(7000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(train_cats_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['cat.{}.jpg'.format(i) for i in range(7000,10000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(validation_cats_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['cat.{}.jpg'.format(i) for i in range(10000,12500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(test_cats_dir, fname)
    shutil.copyfile(src,dst)
    
fnames = ['dog.{}.jpg'.format(i) for i in range(7000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(train_dogs_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['dog.{}.jpg'.format(i) for i in range(7000,10000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(validation_dogs_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['dog.{}.jpg'.format(i) for i in range(10000,12500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(test_dogs_dir, fname)
    shutil.copyfile(src,dst)

 

 

2.이미지 파일을 읽는다.

  • 지금까지는 CSV file이 제공되어서 사용했지만 이번에는 실제 이미지 파일들이다.
  • Keras가 제공하는 utility module 사용 => ImageDataGenerator
    • python generator 
    • 1) pillow로 이미지 파일을 읽는다.
    • 2) JPG file을 RGB pixel 값으로 decoding -> ndarry 생성
    • 3) Normalization 과정을 거친다. -> MinMaxScaling

 

  • generator?
    • 사용하는 이미지 파일을 numpy 파일로 바꾸어서 사용해야 하는데, Memory 용량 상 25000개의 파일을 한꺼번에 로드하여 사용할 수는 없다.
    • 그래서 generator를 사용한다.
    • ImageDataGenerator는 폴더로부터 data를 읽어서 numpy array로 만들어 준다.

 

%reset

import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_dir = './data/cat_dog_full/train/'
validation_dir = './data/cat_dog_full/validation/'

# ImageDataGenerator 생성

# 이미지 데이터 값을 1/255로 scaling
train_datagen = ImageDataGenerator(rescale=1/255)
validation_data = ImageDataGenerator(rescale=1/255)

# datagen의 동작 방식을 명시 (flow_from_directory)
# train data를 가져오면 => x_data(독립변수, 픽셀값), t_data (종속변수, label)
train_generator = train_datagen.flow_from_directory(
    train_dir,                 # target directory : 데이터를 어디서 가져올 것인지
    classes=['cats', 'dogs'],  # label 적용을 어떻게 할 것인지
                               # cats : 0, dogs : 1
                               # classes 명시 하지 않을 경우 폴더명 순서대로 label 잡힘
    target_size=(150, 150),    # 이미지 size scaling (크기를 150x150으로 변경해서)
    batch_size=20,             # 한번에 20개의 이미지를 가져온다.
                               # label에 상관 없이 가져온다.
    class_mode='binary'        # 이진분류 => binary
                               # MINST같은 다중분류 => categorical (기본값)
                              
 )

# generator로 부터 출력된 데이터의 shape 확인
for x_data, t_data in train_generator:
    print('x_data의 shape : {}'.format(x_data.shape)) # (20, 150, 150, 3)
    # 이미지 20장, pixel 150 * 150, 컬러 이미지는 channel 3
    # CNN에 입력되는 형태
    print('t_data의 shape: {}'.format(t_data.shape)) # (20, )
    
    # generator는 break 설정하지 않으면 다시 처음으로 돌아가서 읽는다.
    break;

## 이미지 확인
fig = plt.figure(figsize=(10,10))
axs = [] # subplot을 저장하는 리스트

for i in range(20):
    axs.append(fig.add_subplot(4,5,i+1))
    
for x_data, t_data in train_generator:
    
    # x_data shape : (20,150,150,3)
    for idx, img_data in enumerate(x_data):    # idx => 0~19 img_data -> 150,150,3
        axs[idx].imshow(img_data)
  
    
    print(t_data)
    break;
    
fig.tight_layout()
plt.show()

 

Output:

Once deleted, variables cannot be recovered. Proceed (y/[n])? y
Found 14000 images belonging to 2 classes.
x_data의 shape : (20, 150, 150, 3)
t_data의 shape: (20,)
[1. 1. 0. 1. 0. 0. 1. 1. 0. 1. 0. 1. 1. 0. 1. 0. 0. 1. 0. 0.]

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
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
글 보관함