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 그리드 형태로 시각화합니다.
'데이터 다루기 > Vision (Tensorflow)' 카테고리의 다른 글
[Vision] Transfer Learning + Fine Tuning (0) | 2021.04.20 |
---|---|
[Vision] Image Augmentation (0) | 2021.04.06 |
[Vision] CNN을 통한 이미지 분류 (2) | 2021.03.19 |
[Vision] 이미지 분류 (0) | 2021.03.13 |
Tensorflow 2.0 (GPU) 설치하기 (0) | 2021.03.13 |