본문 바로가기

데이터 다루기/Vision (Tensorflow)

[Vision] 이미지 불러오기

728x90
반응형

1. 사용할 패키지 불러오기.

import numpy as np
import os
import PIL
import PIL.Image
import tensorflow as tf
import tensorflow_datasets as tfds
import pathlib
import matplotlib.pyplot as plt

import를 활용하여 사용할 패키지를 불어왔습니다.

 

2. 데이터 불러오기.

dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file(origin=dataset_url, 
                                   fname='flower_photos', 
                                   untar=True)
data_dir = pathlib.Path(data_dir)

저희는 이번 실습에서 Open dataset 중에 하나인 꽃 이미지를 활용하도록 하겠습니다.

tensorflow의 keras.utils에서 제공하는 get_file함수로 특정 url에 있는 데이터를 불러올 수 있습니다.

다운로드가 완료되시면 문제없이 진행된 것입니다.

image_count = len(list(data_dir.glob('*/*.jpg')))
print(image_count)

실제로 다운받아진 데이터에 이미지가 몇장있는지를 살펴보시면 총 3,670장의 꽃 이미지 파일이 존재합니다.

roses = list(data_dir.glob('roses/*'))
PIL.Image.open(str(roses[0]))

위의 코드는 roses (장미) 폴더에 있는 첫 번째 사진을 그려줍니다.

정말 이쁜 장미 사진이 저장되어 있었네요.

3. Keras.proprecessing

위 같은 방법도 있지만 최근에는 이미지 load에서 Keras.proprecessing 함수가 많이 사용되고 있습니다.

해당 함수는 이미지 로드에 있어서 다양한 기능을 제공합니다.

많이 사용되는 기능은 Batch size, image size, dataset partition 입니다.

batch_size = 32
img_height = 180
img_width = 180

우선 기능을 사용하기 위에 미리 정해줘야 하는 파라미터를 정의하였습니다.

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

앞에서 정의했던 데이터의 directory를 입력인자에 넣어줍니다.

그리고 데이터를 Training과 Validation으로 분할합니다. (8:2)

지금 불러올 데이터는 training 서브셋입니다.

seed 값은 데이터 분할에 있어서 같은 결과를 만들기 위한 역할입니다.

image_size와 batch_size는 미리 정해둔 파라미터를 받도록 하였습니다.

Found 3670 files belonging to 5 classes.
Using 2936 files for training.

결과 위와 같이 실행이 됩니다.

3,670개의 이미지중에서 80%에 해당하는 2,936개의 이미지가 training 데이터셋으로 불러와졌습니다.

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
Found 3670 files belonging to 5 classes.
Using 734 files for validation.

마찬가지로 Validation 데이터셋도 불러들일 수 있습니다.

class_names = train_ds.class_names
print(class_names)

['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']

데이터에는 총 5개의 category (Daisy, Dandelion, Roses, Sunflowers, Tulips)가 존재합니다.

4. 이미지 시각화

이미지 데이터를 불러왔으니 이제 시각화를 해보도록 하겠습니다.

plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
  for i in range(9):
    ax = plt.subplot(3, 3, i + 1)
    plt.imshow(images[i].numpy().astype("uint8"))
    plt.title(class_names[labels[i]])
    plt.axis("off")

코드 한 줄씩 설명해볼까요?

plt.figure(figsize=(10, 10))

우선 이미지의 사이즈를 정해줍니다.

for images, labels in train_ds.take(1):

train_ds에서 하나의 배치를 가져옵니다.

for i in range(9):
    ax = plt.subplot(3, 3, i + 1)
    plt.imshow(images[i].numpy().astype("uint8"))
    plt.title(class_names[labels[i]])
    plt.axis("off")

총 9장의 이미지를 3*3 그리드 형태로 시각화합니다.

반응형