글쓰기

스마트인재개발원/파이썬

(1편)tensorflow, keras 내 맘대로 이미지 딥러닝![스마트인재개발원]

RSpring41 2021. 7. 22. 22:49

현재 교육을 듣고 있는 학원에 프로젝트에 딥러닝을 사용해야 하는 상황이 생겼고 대학교 4학년때 혼자 이상하게 모델을 학습하고 사용했던 기억을 되집어 보며 새로운 마음으로 이미지 딥러닝을 시작해본다!!

 

 

1. 환경 구성

1. tensorflow 설치

이게 제일 화나고 짜증나고 어렵고 힘들었던 기억이 있다. 

라이브러리마다 버전이 있고 서로 버전이 맞아야 하며 우분투 버전도 신경써야한다.

이번에는 새로운 마음으로 우분투20.04를 설치했고 파이썬 3.8환경에서 진행해보려고한다.

4학년 프로젝트때와 동일하게 tensorflow에 keras를 사용하기 위해

tensorflow 2.3버전을 설치했다. (keras는 tensorflow 몇 버전에서 통합된걸로 알고있다.)

 

2. 내컴퓨터는 GPU가 있다구욧!!

모델 학습을 CPU로만 하게 되면 엄청 느리다 ㅡㅡ

예전 4학년 프로젝트때는 라데온 그래픽 카드를 사용하고 있던지라 일단 CPU를 이용해서 학습 해보았는데 속도가 절망적이였다.

하지만 이제 내 컴퓨터에 GTX1070가 들어가 있다!!!!

GPU를 모델 학습에 사용하기 위해서는 CUDA라는 것과 CUnn?? 을 설치해야 한다. 

설치 과정은 인터넷에 검색하면 아주 많이 나온다! 보기 편한 게시물을 참고하면서 설치하면 된다

단!!! 우분투 버전, 파이썬 버전, 작동환경에 따라서 CUDA와 CUnn에 호환 버전이 정해져 있다!! 이것도 검색하면 잘 나온다.

 

소스에서 빌드  |  TensorFlow

소스에서 TensorFlow pip 패키지를 빌드하고 Ubuntu Linux 및 macOS에 설치합니다. 명령어는 다른 시스템에도 적용될 수 있지만, Ubuntu 및 macOS용으로만 테스트되었으며 지원됩니다. 참고: 잘 테스트되고

www.tensorflow.org

(우분투에서 이미지 편집 귀찮아서 웹에서 했더니 사진이 깨진다;;....)

 

 

 

설치가 완료되고 잘 적용된 모습!!

 

3. 일단 이미지 넣어보자!!

내 기억에 영어로 이미지 생성기?함수와 디렉토리 이미지 뭐시기로 불러왔었는데  이번에는 새로 발견한 image_dataset_from_directoy를 사용해보고 싶어졌다! 

자세한건 여기 참고 !! 

 

tf.keras.preprocessing.image_dataset_from_directory

Generates a tf.data.Dataset from image files in a directory.

www.tensorflow.org

 

 

여러가지 검색을 해봤는데 전에 사용했던 이미지 생성기? 함수와 비슷한 부분이 있는거 같아서 더 찾아보고 복붙도 해서 예제 코드를 작성해봤다.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing import image_dataset_from_directory
import matplotlib.pyplot as plt

# 학습 데이터셋 불러오기
train_ds = image_dataset_from_directory(
    directory='/home/ps/ps/data',
    labels='inferred',
    label_mode='categorical',
    batch_size=32,
    image_size=(256, 256))
        
# 라벨들 이름 출력        
class_names = train_ds.class_names
print(class_names)

# 이미지 9개 샘플 출력
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")

 

실행했더니 ...  아무런 일도 일어나지 않았다.... 우우...  내 matplotlib이 어디갔니?

 

코드는 정상적으로 실행 되었다

 

여러가지 검색을 통해서 알게된 사실은 가상환경에서는 (나는virtualenv을 사용한다.)matplotlib를 사용할 수 없다는 게시글과

matplotlib에 백엔드?를  설정 해주면 된다는 글과 적용해도 안된다는 글이 있었다.

 

일단 따라서 해보았다.

import matplotlib 
matplotlib.use('TkAgg')

 

우왕 아주 잘된다!!!

이 사진들은 예전에 4학년때 목소리 높낮이 구분한다고 소리를 이미지화? 시켜놓은것이다. 샘플 9개 모두 잘 불러와진것을 볼 수 있다.

 

4. 난 귀찮으니까 너가 학습, 테스트(검증) 데이터로 나눠줘!!

예전 4학년 프로젝트 때는 학습, 테스트 데이터를 일일이 나눠줘야 했고, 랜덤하게 넣을수가 없어서 학습이 잘 안되었다.

이제는 새로운걸 써보자!

 

아까 전에 찾았다던 image_dataset_from_directory를 사용해보려고 한다. 해당 기능을 살펴보자!

 

tf.keras.preprocessing.image_dataset_from_directory

Generates a tf.data.Dataset from image files in a directory.

www.tensorflow.org

 

잘 살펴보면 validation_split과 subset이라는 매개변수? 설정? 이 있다. 이거이거 너무 좋구만

그리고 참고했던 인터넷 글들을 보면 이거 다음에 이미지들을 변형시켜서 데이터를 늘려준다고 하는데 이번 프로젝트에서는 고정되어 있는 카메라와 물체라서 필요 없다! 안해!

 

찾아보면서 코드를 신나게 작성했는데 오류가 난다...

If using `validation_split` and shuffling the data, you must provide a `seed` argument, to make sure that there is no overlap between the training and validation subset.

 

validation_split을 쓰려면 seed를 써야 한다나 뭐라나 그래서 seed항목에 대해서 찾아봤다.

seed : Optional random seed for shuffling and transformations. 

영어는 어렵다 움....  내가 이해한 내용은 마인크래프트 게임에서 맵 생성시 사용되는 '시드'라는 단어와 동일하게 

학습 데이터와 테스트(검증)데이터를 나눌때 일정한 데이터가 나누어 지도록 사용되는 기초좌표?느낌이다. 

시드가 1이라도 다르다면 학습과 검증 데이터로 나누어진 데이터셋이  달라진다! 고래서 고냥 많이 쓰는 1337을 썼다.

 

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing import image_dataset_from_directory

# 학습 데이터셋 불러오기
train_data = image_dataset_from_directory(
    directory='/home/ps/ps/data',
    labels='inferred',
    label_mode='categorical',
    batch_size=32,
    image_size=(256, 256),
    validation_split=0.2,
    subset="training",
    seed=1337
    )
    
# 검증 데이터셋 불러오기   
train_val = image_dataset_from_directory(
    directory='/home/ps/ps/data',
    labels='inferred',
    label_mode='categorical',
    batch_size=32,
    image_size=(256, 256),
    validation_split=0.2,
    subset="validation",
    seed=1337
    )

 

- 결과

나는 만족했다!

 

 

5. CNN이였던가 뭐였었지?...

대학교시절 배웠던건 "이미지 처리에는 CNN이 좋으니 그걸 써라" 음...

CNN이란 - (Convolutional Neural Network)

Deep Neural Network에서 이미지나 영상과 같은 데이터를 처리할 때 발생하는 문제점들을 보완한 방법

이라고 한다. 직역은 합성곱 신경망

 

입력에 4개가 있다면 각자 X1를 곱해 2개로 묶고 다시 X2를 곱해 출력을 1개로 만들어 주며 X1과 X2를 학습하는 신경망으로 이해하고 있다.

 

음... 이론 싫어............................................................

 

예전에 엉망으로 만들었던 모델을 가져와서 학습이라도 해보자!

 

우쓍.. 자꾸 오류가 난다.  이번에 새로 사용하는 image_dataset_from_directory 하고 예전에 사용한 flow_from_directory하고 조금 다르다. 코드를 맞춰서 수정해주자!

 

 

 

어렵다 !

못한건 다음에 계속!!!!

 

 

 

 

 

 

 

 

 

스마트인재개발원

4차산업혁명시대를 선도하는 빅데이터, 인공지능, 사물인터넷 전문 '0원' 취업연계교육기관

www.smhrd.or.kr