본문 바로가기

5.인공지능

[tensorflow] 텐서플로를 사용한 CNN 이미지 식별

들어가기

텐서플로는 구글에서 개발한 C++기반은 머신러닝 오픈소스 라이브러리이다. 파이썬, C++, Go, Java, R 언어도 지원하기에 좀 더 쉬운 파이썬을 많이 활용하고 있다. 텐서 플로 활용해서 이미지 식별위한 신경망을 구성하여 기본적인 사용법을 살펴볼려고 한다.

기본환경

로컬환경

자신 시스템에 구성하기에는 해야할 일이 조금 있고 시간도 걸린다. 작업 순서는 파이썬을 설치하고 노트북을 설치하고 텐서플로를 설치해야 한다.

먼저 파이썬을 설치한다.

https://www.python.org/downloads/release/python-364/

Pip로 jupyter notebook을 설치한다.

$ pip install jupyter
$ jupyter notebook

노트북이 실행되면서 노트북화면이 실행된다. 노트북이 파이썬을 실행하고 테스트하는데 적합하다. 이제부터 노트북에서 실행하자. 노트북에서 텐서플로 설치하고 간단한 테스트를 해보자.

!pip install tensorflow

GPU용 텐서플로 설치는 아래와 같다.

!pip install tensorflow-gpu

텐서플로 설치가 끝났으면 테스트를 해보자.

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a + b))

colab

매번 환경을 구성하기가 쉽지 않다. 가장 쉬운 방법으로 구글의 colab으로 사용한다.

colab은 인터넷 환경에서 아무 곳에서 사용할 수 있고 GPU 자원도 제한적으로 무료로 사용할 수 있다.

수기로 작성된 숫자 학습

MNIST는 수기로 작성된 숫자 이미지를 데이터셋을 제공한다.

현재(2024.03.12) 시점에 공식 사이트는 로그인 창이 표시되면서 접근이 안되고 있다. 대신에 github의 MNIST 에서 확인할 수 있다. 제공되는 이미지는 28x28 픽셀 크기의 흑백 이미지로 60,000 개 이미지가 제공된다.

텐서플로를 사용해서 신경망을 구성하고 학습하고 실제로 이미지를 식별해보자. 엄밀하게 말하면 여기서 사용한 예제는 텐서플로이기보다 텐서플로의 keras를 사용한 방법이다.

신경망 구성

CNN 형태 머신러닝 알고리즘 사용해보자. 먼저 신경망을 구성하자. 구성할 신경망은 아래와 같다.

1개 입력 층, 2개 컨볼루션 층(convolution layer), 1개 밀집(dense) 층, 1개 로짓(logits) 층으로 구성한다.

import tensorflow as tf

model = tf.keras.models.Sequential([
  tf.keras.layers.Reshape(input_shape=(28, 28, 1), target_shape=(28, 28, 1)),
  tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
  tf.keras.layers.MaxPooling2D((2, 2)),
  tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
  tf.keras.layers.MaxPooling2D((2, 2)),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

컨볼루션 층은 공간 특징을 추출한다. 그리고 컨볼루션 층이 끝나고 맥스풀링이 추가된다. 맥스 풀링은 입력 범위 내에서 최대값을 선택한다. 이렇게 해서 컨볼루션 층이 2개가 추가된다. 밀집 층은 완전연결층(fully connected layer)으로 출력 층에 연결되어 학습된 결과를 조정한다. 마지막으로 손실함수를 SparseCategoricalCrossentropy를 사용했다. 기본적인 CNN 신경밍 구성을 했다.

데이터셋 로딩

다음으로 MNIST 데이터셋을 로딩해보자.

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

테이터셋은 학습용과 테스트용으로 나눠서 구성한다. 그리고 모든 데이터는 픽셀 값을 실수형 값으로 변경한다.

학습과 테스트

모델에 학습용 데이터셋을 입력해서 학습해보자. 그리고 학습된 모델에 대해서 테스트용 데이터셋으로 테스트를 진행해보자.

# 학습
model.fit(x_train, y_train, epochs=5)
# 테스트
model.evaluate(x_test, y_test)  

학습은 5회 반복(epochs)으로 진행했다. 반복할 수록 정확성은 좋아진다. 물론 어느정도 이상 반복되면 더이상 정확성이 크게 좋아지지 않는다.

검증

이렇게 해서는 숫자만 표시되기에 잘 작동하는지 확인하기 어렵다. 테스트셋에서 이미지 하나를 랜덤 추출해서 실제로 잘 식별하는지 확인해보자.

import matplotlib.pyplot as plt
import numpy as np

index = np.random.randint(0, len(x_test))
image = x_test[index]
plt.imshow(image, cmap='gray')
plt.show()

print("Predicted label:", np.argmax(prediction))
print("Actual label:", y_test[index])

Predicted label: 9
Actual label: 9

예측한 값과 실제 값이 잘 일치되는 것을 확인할 수 있다.

TensorBoard 사용

TensorBoard는 텐서플로에 기록된 로그를 그래프로 시각화하는 도구이다. TensorBoard를 위해서 로그를 기록해야한다. 훈련 전에 로그 기록에 대한 설정을 해줘야 한다.

tensorboard_callback = tf.keras.callbacks.TensorBoard("./logs", histogram_freq=1)
model.fit(x_train, y_train, epochs=5, callbacks=[tensorboard_callback])

다시 훈련을 진행한다.

로컬환경

로컬에 구성되었다면 pip로 설치가 필요하다.

!pip install tensorboard
tensorboard --logdir=/tmp/mnist_convet_model

colab

colab은 별도로 설치할 필요없이 바로 실행가능하다.

%load_ext tensorboard
%tensorboard --logdir "./logs"

Tensorflow을 사용해서 신경망 구성을 이미지로 확인할 수 있다.

Colab

https://colab.research.google.com/drive/1YzoF9_2H8OeEaL_ZLHTkCUzqGARSbFyy

마무리

심층신경망을 간단하게 구성해서 실행해보았다. 정말 별거 없는 것 같은데 이미지 식별하는 알고리즘이 구성되고 정확도도 무려 99%이상이 된다. 두서없이 정리해서 너무 부족한 글이네요. 여러분에게 도움이 되었으면 합니다. 즐거운 코딩생활되세요. ospace.

참고

[1] TensorFlow Getting Started, https://www.tensorflow.org/get_started/

[2] colab, https://colab.research.google.com/

반응형