June is Combung

[KT AIVLE SCHOOL 3기] 시각지능 딥러닝 본문

KT AIVLE SCHOOL 기자단/강의

[KT AIVLE SCHOOL 3기] 시각지능 딥러닝

june__Park 2023. 4. 25. 00:59

1. Computer Vision Deep Learning(시각지능 딥러닝) 

 

시각지능(Computer Vision) 딥러닝은 이미지나 비디오와 같은 시각적 데이터를 분석하고 이를 이용하여 판단하는 분야이다. 시각지능 딥러닝은 이미지 인식, 객체 검출, 분할, 추적 등의 작업을 수행할 수 있다. 시각지능 딥러닝은 이미지 분류, 이미지 생성 및 감지, 객체 추적 및 분할, 세분화 등 다양한 응용 분야에서 사용된다.

시각지능 딥러닝은 대부분의 경우 컨볼루션 신경망(Convolutional Neural Network, CNN)을 기반으로 한다. CNN은 이미지와 같은 시퀀스 데이터를 분석하는 데 매우 효과적이다. CNN은 이미지의 다양한 특징을 추출하는 데 사용되는 컨볼루션(Convolution) 계층과, 추출된 특징을 다음 계층으로 전달하는 풀링(Pooling) 계층 등으로 구성된다.

시각지능 딥러닝에서 자주 사용되는 네트워크 구조에는 다음과 같은 것들이 있다.

- LeNet-5: 손글씨 인식에 사용되는 컨볼루션 신경망
- AlexNet: ILSVRC(Imagenet Large Scale Visual Recognition Challenge)에서 우승한 최초의 딥러닝 모델
- VGGNet: 16-19개의 계층으로 구성된 매우 깊은 네트워크 구조
- Inception-v3: Google에서 개발한 매우 깊은 네트워크 구조
- ResNet: 수백개의 계층으로 구성된 매우 깊은 네트워크 구조

시각지능 딥러닝은 TensorFlow, Keras, PyTorch 등의 라이브러리를 사용하여 구현할 수 있다. 딥러닝 모델을 구현하기 전에 데이터를 전처리하고, 모델을 훈련시키는 과정을 거쳐 최종적으로 모델을 평가하고 배포하는 과정을 거친다.

 

2. CNN

CNN(Convolutional Neural Network)은 이미지 인식과 같은 컴퓨터 비전 분야에서 가장 많이 사용되는 딥러닝 모델이다. CNN은 이미지 내의 패턴을 인식하고 분류하기 위해 일련의 합성곱(Convolution)과 풀링(Pooling) 계층을 거쳐 이미지에서 추출된 특징 맵(feature map)을 기반으로 이미지를 분류한다.

CNN의 구조는 대부분 다음과 같이 구성된다.

1. 입력 이미지
2. Convolution Layer: 입력 이미지에 필터를 적용하여 특징 맵을 추출하는 계층
3. Activation Function: Convolution Layer에서 추출된 특징 맵에 비선형성을 부여하는 계층
4. Pooling Layer: 추출된 특징 맵을 간단한 형태로 압축하여 계산 복잡도를 줄이는 계층
5. Fully Connected Layer: 추출된 특징 맵을 분류하는 계층

CNN은 다양한 응용 분야에서 사용되며, 주요 응용 분야로는 이미지 분류, 객체 검출, 객체 추적, 이미지 생성 등이 있다.

CNN을 구현하기 위해서는 TensorFlow, Keras, PyTorch와 같은 딥러닝 라이브러리를 사용하여 모델을 생성하고 훈련해야 한다. 이 과정에서 하이퍼파라미터 조정과 데이터 전처리 등의 작업이 필요하며, 이를 통해 최적의 모델을 만들어낼 수 있다.

 

TensorFlow와 Keras를 사용한 간단한 CNN 모델의 예시 코드는 다음과 같다.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 모델 생성
model = keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(10, activation='softmax')
])

# 모델 컴파일
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 모델 요약
model.summary()

# 모델 훈련
history = model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels))

# 모델 평가
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

 

각 라인별로 해석하면 다음과 같다.


- `layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))`: Convolutional Layer를 추가한다. 32개의 필터를 사용하며, 필터 크기는 (3, 3)이다. 활성화 함수로 ReLU를 사용하며, 입력 이미지의 크기는 (28, 28, 1)이다.
- `layers.MaxPooling2D((2, 2))`: Pooling Layer를 추가한다. 풀링 윈도우 크기는 (2, 2)이다.
- `layers.Conv2D(64, (3, 3), activation='relu')`: Convolutional Layer를 추가한다. 64개의 필터를 사용하며, 필터 크기는 (3, 3)이다. 활성화 함수로 ReLU를 사용한다.
- `layers.MaxPooling2D((2, 2))`: Pooling Layer를 추가한다. 풀링 윈도우 크기는 (2, 2)이다.
- `layers.Flatten()`: Flatten Layer를 추가한다. 이전 계층에서 출력된 3차원 특징 맵을 1차원으로 펼친다.
- `layers.Dense(10, activation='softmax')`: Fully Connected Layer를 추가한다. 10개의 뉴런을 가지며, 출력값은 softmax 함수를 통해 10개 클래스 중 하나로 분류된다.

이 모델은 MNIST 숫자 데이터셋과 같이 이미지 분류 문제에서 사용할 수 있다. 입력 이미지는 28x28 크기의 흑백 이미지이며, 출력은 0~9까지의 10개 클래스 중 하나가 된다. 이 모델은 Convolutional Layer와 Pooling Layer를 반복적으로 사용하여 입력 이미지에서 추출한 특징을 효과적으로 학습하고, Flatten Layer와 Fully Connected Layer를 사용하여 클래스를 분류한다.

 

3. 활성화 함수, 옵티마이저 함수, 손실 함수

활성화 함수, 옵티마이저 함수, 손실 함수는 딥러닝 모델을 훈련하는 데 매우 중요한 역할을 한다.

활성화 함수(Activation Function)는 딥러닝 모델에서 각 노드에서 출력 값을 결정하는 데 사용된다. 활성화 함수는 선형 함수와 비선형 함수로 구성된다. 비선형 함수를 사용하는 이유는 딥러닝 모델에서 비선형성을 가지는 것이 중요하기 때문이다. 대표적인 활성화 함수로는 ReLU(Rectified Linear Unit), sigmoid, tanh, softmax 등이 있다. ReLU는 음수 값을 0으로 만들어 비선형성을 제공하고, sigmoid와 tanh는 출력 값을 0과 1 또는 -1과 1 사이로 제한하여 확률과 같은 값으로 변환하는 데 사용된다. softmax는 분류 문제에서 다중 클래스를 처리하기 위해 사용된다.

옵티마이저 함수(Optimizer Function)는 딥러닝 모델의 가중치와 편향 값을 조정하는 데 사용된다. 옵티마이저 함수는 훈련 데이터로부터 모델을 최적화하기 위해 가중치와 편향을 업데이트한다. 대표적인 옵티마이저 함수로는 SGD(Stochastic Gradient Descent), Adam, RMSprop 등이 있다. SGD는 가장 기본적인 옵티마이저로, 각 데이터 포인트를 순차적으로 처리하면서 가중치와 편향 값을 업데이트한다. Adam과 RMSprop는 SGD보다 성능이 우수하며, 더 빠른 수렴을 가능하게 한다.

손실 함수(Loss Function)는 딥러닝 모델의 예측 값과 실제 값의 차이를 측정하는 함수이다. 손실 함수를 최소화하는 것이 딥러닝 모델의 목표이다. 손실 함수는 분류 문제와 회귀 문제에 따라 달라진다. 회귀 문제에서는 MSE(Mean Squared Error)가 주로 사용되며, 분류 문제에서는 categorical crossentropy 또는 binary crossentropy가 사용된다.

딥러닝 모델에서는 활성화 함수, 옵티마이저 함수, 손실 함수를 적절히 조합하여 최적의 모델을 만들어낸다. 예를 들어, 분류 문제에서는 ReLU 활성화 함수와 Adam 옵티마이저 함수, categorical crossentropy 손실 함수를 사용하는 것이 일반적이다. 회귀 문제에서는 ReLU 활성화 함수와 Adam 옵티마이저 함수, MSE 손실 함수를 사용하는 것이 일반적이다. 이는 일반적인 경우이며, 모델의 종류나 데이터의 특성에 따라 다른 함수가 더욱 적합할 수 있다. 또한, 하이퍼파라미터의 값에 따라 모델의 성능이 크게 달라질 수 있으므로, 최적의 하이퍼파라미터를 찾는 것이 중요하다. 이를 위해서는 그리드 탐색(Grid Search)이나 랜덤 서치(Random Search)와 같은 방법을 사용하여 하이퍼파라미터를 탐색해볼 수 있다.

 

4. Transfer Learning(전이학습)

전이학습(Transfer Learning)은 딥러닝 모델을 훈련할 때, 이미 학습된 모델의 일부 또는 전체를 가져와 새로운 모델을 훈련하는 방법이다. 전이학습을 사용하면 적은 양의 데이터로도 높은 성능을 얻을 수 있으며, 훈련 시간과 비용을 절약할 수 있다.

전이학습은 대표적으로 두 가지 방법으로 구분된다. 첫 번째 방법은 사전 학습된 모델을 가져와 새로운 데이터셋에 맞게 미세 조정하는 것이다. 이 방법은 대규모 데이터셋에서 학습된 모델을 가져와 적은 양의 데이터셋에서 미세 조정하여 모델을 개선하는 데 사용된다.

두 번째 방법은 사전 학습된 모델에서 일부 계층을 제거하고, 새로운 계층을 추가하여 모델을 재구성하는 것이다. 이 방법은 데이터셋이 다른 문제를 해결하는 데 사용되는 경우에 유용하다.

전이학습은 많은 딥러닝 모델에서 사용되며, 특히 이미지 분류, 객체 검출, 자연어 처리 등의 분야에서 많은 성과를 이뤄내고 있다. 대표적으로 VGG, ResNet, Inception 등의 사전 학습된 모델이 많이 사용된다. 또한, TensorFlow와 Keras에서는 이미 학습된 모델을 가져오는 기능이 내장되어 있어 전이학습을 쉽게 구현할 수 있다.

 

VGG 모델을 전이학습하는 코드는 다음과 같이 구현할 수 있다.

from tensorflow.keras.applications import VGG16
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import SGD

# 미리 학습된 VGG 모델 로드
vgg = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# VGG 모델의 마지막 층 이전까지의 레이어 가져오기
x = vgg.output
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dense(128, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# 새로운 분류 층 추가
predictions = Dense(10, activation='softmax')(x)

# 새로운 모델 정의
model = Model(inputs=vgg.input, outputs=predictions)

# VGG 모델의 가중치는 고정하고, 새로 추가한 분류 층의 가중치만 학습
for layer in vgg.layers:
    layer.trainable = False

# 모델 컴파일
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])

 

위 코드에서는 미리 학습된 VGG 모델을 로드하고, VGG 모델의 마지막 층 이전까지의 레이어를 가져온다. 그리고, 이후에는 새로운 분류 층을 추가하여 새로운 모델을 정의한다. 마지막으로, VGG 모델의 가중치는 고정하고, 새로 추가한 분류 층의 가중치만 학습하도록 설정한다. 이후 모델을 컴파일하고 학습을 진행할 수 있다.

 

5. Object Detection(객체 탐지)

Object Detection(객체 탐지)은 컴퓨터 비전 분야에서 매우 중요한 기술 중 하나이다. 객체 탐지는 이미지나 비디오에서 특정 객체가 있는 위치를 찾는 기술로, 일반적으로 객체의 위치와 종류를 예측하는 데 사용된다. 이를 위해서는 이미지 내에서 객체를 검출하고, 해당 객체가 어떤 클래스에 속하는지 분류하는 단계를 거친다.

객체 탐지는 크게 두 가지 방법으로 나눌 수 있다. 첫 번째 방법은 R-CNN 계열의 방법으로, 이미지 내에서 객체가 존재할 가능성이 높은 영역(Region Proposal)을 먼저 찾은 다음, 해당 영역에서 객체를 분류하는 방식이다. 이 방법은 정확도가 높지만 계산 비용이 매우 높기 때문에 실시간으로 객체 탐지를 수행하기에는 한계가 있다.

두 번째 방법은 YOLO 계열의 방법으로, 이미지 전체를 한 번에 입력으로 받아 객체의 위치와 클래스를 동시에 예측하는 방식이다. 이 방법은 빠른 속도로 객체 탐지를 수행할 수 있지만, 정확도가 R-CNN 계열 방법보다는 낮은 편이다.

최근에는 YOLO, Faster R-CNN 등의 방법이 많이 사용되며, 이러한 방법들을 구현하는 데에는 TensorFlow, Keras, PyTorch 등의 딥러닝 프레임워크가 널리 사용된다. 객체 탐지는 자율주행, 보안, 영상처리 등 다양한 분야에서 활용되고 있으며, 더욱 정확하고 빠른 객체 탐지 기술의 발전이 기대된다.

 

6. YOLO

YOLO(You Only Look Once)는 이미지 내에서 객체 탐지를 수행하는 딥러닝 알고리즘 중 하나이다. YOLO 알고리즘을 사용하여 객체 탐지를 수행하는 코드 예시는 다음과 같다.

import cv2
import numpy as np
from tensorflow.keras.models import load_model

# 학습된 YOLO 모델 로드
model = load_model('yolo.h5')

# YOLO 모델의 입력 이미지 크기 설정
input_size = 416

# 클래스 이름 정의
classes = ['person', 'car', 'truck', 'bus', 'bike']

# 이미지 읽어오기
image = cv2.imread('test.jpg')

# 이미지 크기 조정
resized_image = cv2.resize(image, (input_size, input_size))

# 이미지 전처리
input_data = np.expand_dims(resized_image, axis=0) / 255.0

# YOLO 모델을 사용하여 객체 탐지 수행
output_data = model.predict(input_data)

# 탐지된 객체들의 좌표, 클래스, 확률 추출
boxes, scores, classes = cv2.dnn.NMSBoxes(
    output_data[0], confidence_threshold=0.5, iou_threshold=0.4, score_threshold=0.5)

# 탐지된 객체들을 이미지 상에 표시
for i in range(len(boxes)):
    x1, y1, x2, y2 = boxes[i]
    cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
    cv2.putText(image, classes[i], (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

# 결과 이미지 출력
cv2.imshow('result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

위 코드에서는 YOLO 모델을 로드하고, 입력 이미지의 크기를 설정한다. 그리고 클래스 이름을 정의하고, 입력 이미지를 전처리하여 YOLO 모델을 사용하여 객체 탐지를 수행한다. 탐지된 객체들의 좌표, 클래스, 확률을 추출하여 이미지 상에 표시한다. 마지막으로 결과 이미지를 출력한다. 이 코드는 단일 이미지에 대한 객체 탐지를 수행하는 예시이며, 동영상이나 실시간 카메라 스트림에서 객체 탐지를 수행하는 방법도 유사하게 구현할 수 있다.

 

7. YAML

YAML 파일은 간단한 텍스트 파일이며, 일반적으로 .yaml 또는 .yml 확장자를 사용한다. YAML 파일은 대개 설정 파일이나 데이터 파일 등으로 사용되며, 들여쓰기를 사용하여 데이터를 구조화한다.

YAML 파일은 일반적으로 다음과 같은 형식을 따른다.

key1: value1
key2: value2
key3:
  - item1
  - item2
  - item3
key4:
  subkey1: subvalue1
  subkey2: subvalue2



위 예시에서는 key와 value의 쌍으로 데이터를 표현하며, 리스트를 포함하여 들여쓰기로 데이터를 구조화하였다.

YAML 파일을 만드는 방법은 매우 간단하다. 텍스트 에디터를 사용하여 파일을 만들고, 위와 같은 형식으로 데이터를 입력하면 된다. YAML 파일은 들여쓰기가 매우 중요하므로, 일관된 들여쓰기 규칙을 지켜주는 것이 좋다.

파이썬에서는 PyYAML 라이브러리를 사용하여 YAML 파일을 파싱하고 생성할 수 있다. 다음은 PyYAML 라이브러리를 사용하여 YAML 파일을 생성하는 예시 코드이다.

import yaml

data = {'key1': 'value1', 'key2': 'value2', 'key3': ['item1', 'item2', 'item3'], 'key4': {'subkey1': 'subvalue1', 'subkey2': 'subvalue2'}}

with open('data.yaml', 'w') as file:
    yaml.dump(data, file)



위 코드에서는 PyYAML 라이브러리를 사용하여 딕셔너리 형태의 데이터를 YAML 파일로 생성한다. yaml.dump() 함수를 사용하여 데이터를 파일에 출력한다. 이 코드를 실행하면, data.yaml 파일이 생성되며, 다음과 같은 내용이 포함된다.

key1: value1
key2: value2
key3:
- item1
- item2
- item3
key4:
  subkey1: subvalue1
  subkey2: subvalue2

 

8. Data Augmentation(데이터 증강)

시각지능 딥러닝에서 Data Augmentation은 데이터를 인위적으로 증강시켜서 모델의 성능을 향상시키는 기법이다. Data Augmentation은 다음과 같은 방법으로 수행된다.

1. 이미지 회전: 이미지를 회전시켜서 다양한 각도에서 학습할 수 있도록 한다.
2. 이미지 이동: 이미지를 이동시켜서 다양한 위치에서 학습할 수 있도록 한다.
3. 이미지 확대/축소: 이미지를 확대하거나 축소시켜서 다양한 크기에서 학습할 수 있도록 한다.
4. 이미지 반전: 이미지를 좌우, 상하로 반전시켜서 다양한 방향에서 학습할 수 있도록 한다.
5. 색상 변화: 이미지의 채도, 명도, 대비 등을 변경하여 다양한 색상에서 학습할 수 있도록 한다.

이러한 Data Augmentation 기법은 이미지 분류, 객체 검출, 세그멘테이션 등 다양한 시각지능 딥러닝 모델에서 사용된다. Data Augmentation은 overfitting을 방지하고, 데이터의 다양성을 높여서 모델의 성능을 향상시키는 효과가 있다.

다음은 Keras에서 Data Augmentation을 수행하는 예시 코드이다.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rotation_range=20,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

# 이미지 불러오기
train_generator = datagen.flow_from_directory(
        'train_dir',
        target_size=(224, 224),
        batch_size=32,
        class_mode='categorical')


위 코드에서는 Keras의 ImageDataGenerator를 사용하여 다양한 Data Augmentation 기법을 적용하여 이미지를 증강시키고, flow_from_directory 함수를 사용하여 디렉토리에서 이미지를 불러온다.

Comments