컴퓨터 비전 분야에서 Semantic Segmentation과 Instance Segmentation은 객체를 이해하고 분리하는 데 중요한 기술입니다. 이 글에서는 두 가지 방법에 대해 자세히 설명하고, OpenCV와 Python을 사용하여 이를 구현할 수 있는 예제 코드를 제공합니다.
1. Semantic Segmentation이란?
Semantic Segmentation은 이미지 내의 각 픽셀을 특정 클래스에 할당하는 작업입니다. 예를 들어, 자동차, 보행자, 자전거 등 다양한 클래스가 있는 이미지에서, 각 픽셀은 그가 속하는 클래스를 나타내게 됩니다. 이 작업은 객체를 구분하는 것뿐만 아니라, 각 객체의 형태를 이해하는 데 중요한 역할을 합니다.
1.1 사용 예
Semantic Segmentation은 자율 주행 자동차, 의료 이미지 분석, 로봇 비전 등 다양한 분야에서 사용됩니다. 이미지의 각 픽셀이 어떤 객체에 속하는지를 아는 것은 그 객체의 위치와 형태를 이해하는 데 매우 중요합니다.
1.2 Semantic Segmentation 모델
가장 널리 사용되는 Semantic Segmentation 모델 중 하나는 U-Net입니다. U-Net 구조는 인코더-디코더 구조로, 저차원 표현과 고차원 세부정보를 결합하여 픽셀 수준의 세분화를 제공합니다. 다른 대표적인 모델로는 DeepLab, FCN(Fully Convolutional Networks) 등이 있습니다.
2. Instance Segmentation이란?
Instance Segmentation은 이미지 내의 각각의 객체 인스턴스를 분리하여 식별하는 작업입니다. 동일한 클래스에 속하는 객체라도 서로 다른 인스턴스로 간주되므로, 각 객체의 경계를 분리합니다. 예를 들어, 두 대의 자동차가 있는 이미지에서, 각각의 자동차를 별개의 객체로 인식하는 것입니다.
2.1 사용 예
Instance Segmentation은 사람, 동물, 여러 객체가 혼재된 장면에서 유용합니다. 이 기술은 동영상 분석, 상호작용하는 로봇 시스템, 증강 현실 등 다양한 응용 분야에서 활용됩니다.
2.2 Instance Segmentation 모델
대표적인 Instance Segmentation 모델에는 Mask R-CNN이 있습니다. Mask R-CNN은 Faster R-CNN을 기반으로 하며, 객체 탐지 외에도 각 객체에 대한 마스크를 생성하여 객체의 형태를 크지 않은 영역으로 잘라냅니다.
3. OpenCV와 Python으로 구현하기
OpenCV는 이미지와 비디오를 처리하고 컴퓨터 비전 작업을 수행할 수 있는 강력한 라이브러리입니다. 본 문서에서는 OpenCV와 함께 사전 훈련된 딥러닝 모델을 사용하여 Semantic Segmentation과 Instance Segmentation을 구현하는 방법을 살펴보겠습니다.
3.1 Semantic Segmentation 예제
이 예제에서는 OpenCV와 TensorFlow를 사용하여 Semantic Segmentation을 구현합니다. 미리 훈련된 DeepLab v3 모델을 사용할 것입니다. 먼저, 필요한 라이브러리를 가져오고 이미지를 로드합니다.
import cv2
import numpy as np
import tensorflow as tf
# 사전 훈련된 모델 로드
model = tf.keras.applications.DenseNet121(weights='imagenet', include_top=False)
# 이미지 로드 및 전처리
image = cv2.imread('image.jpg')
image_resized = cv2.resize(image, (512, 512))
input_image = np.expand_dims(image_resized, axis=0)
input_image = tf.keras.applications.densenet.preprocess_input(input_image)
# 예측
predictions = model.predict(input_image)
# 결과 후처리
predicted_mask = np.argmax(predictions[0], axis=-1)
predicted_mask = np.expand_dims(predicted_mask, axis=-1)
segmented_image = np.concatenate([image_resized, np.uint8(predicted_mask)], axis=-1)
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2 Instance Segmentation 예제
이번에는 Mask R-CNN을 사용하여 Instance Segmentation을 수행합니다. Mask R-CNN은 Keras와 TensorFlow로 구현할 수 있으며, 다양한 딥러닝 프레임워크에서 사용할 수 있는 사전 훈련된 모델도 있습니다.
import cv2
import numpy as np
from mrcnn import utils, model as mask_rcnn, visualize
from mrcnn.config import Config
class CustomConfig(Config):
NAME = "custom_cfg"
NUM_CLASSES = 1 + 80 # 80개 클래스와 배경
# Mask R-CNN 모델 로드
model = mask_rcnn.MaskRCNN(mode="inference", model_dir='./', config=CustomConfig())
model.load_weights('mask_rcnn_coco.h5', by_name=True)
# 이미지 로드
image = cv2.imread('image.jpg')
# 예측
results = model.detect([image], verbose=1)
r = results[0]
# Mask 시각화
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
class_names, r['scores'])
4. 결론
Semantic Segmentation과 Instance Segmentation은 컴퓨터 비전에서 중요한 역할을 합니다. 이 기술들을 사용하면 이미지 내의 객체를 보다 정교하게 분석하고 이해할 수 있습니다. OpenCV와 Python을 통해 이러한 기술들을 구현하는 방법을 소개하였으며, 실제 예제를 통해 사용법을 보여주었습니다. 앞으로 더 많은 다양한 딥러닝 모델을 통해 발전되는 이러한 기술들을 탐구해 보시기 바랍니다.