[파이썬] 객체 검출 및 분할 딥러닝 모델 활용

딥러닝 기술은 최근 객체 검출 및 분할 작업에 있어서 많은 업계에서 활용되고 있습니다. 객체 검출 개념은 이미지에서 특정 객체를 찾아내는 작업을 의미하며, 객체 분할은 이미지에서 객체의 경계를 세분화하는 작업을 의미합니다. 이러한 작업을 효과적으로 수행하기 위해 딥러닝 모델을 활용할 수 있습니다.

이번 포스트에서는 Python을 사용하여 객체 검출 및 분할 딥러닝 모델을 활용하는 방법을 알아보겠습니다.

객체 검출과 분할 모델 선택

객체 검출과 분할을 위해 다양한 딥러닝 모델이 개발되어 있습니다. 객체 검출에는 Faster R-CNN, SSD, YOLO 등의 모델이 널리 사용되고 있으며, 객체 분할에는 Mask R-CNN, DeepLab 등의 모델이 주로 사용됩니다. 이 중에서 사용할 모델을 선택하고 준비해야 합니다.

# 예시에서는 객체 검출을 위해 SSD 모델을 사용하고 객체 분할을 위해 Mask R-CNN 모델을 사용한다고 가정합니다.
from tensorflow.keras.applications import VGG16, ResNet50
from tensorflow.keras.layers import Conv2D, Dense
from tensorflow.keras.models import Model

def build_ssd_model():
    base_model = VGG16(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
    x = base_model.output
    x = Conv2D(256, (1, 1), activation='relu')(x)
    x = Dense(256, activation='relu')(x)
    predictions = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=base_model.input, outputs=predictions)
    return model

def build_mask_rcnn_model():
    base_model = ResNet50(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
    x = base_model.output
    x = Conv2D(256, (1, 1), activation='relu')(x)
    x = Dense(256, activation='relu')(x)
    predictions = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=base_model.input, outputs=predictions)
    return model

데이터셋 준비

딥러닝 모델을 학습시키기 위해서는 대량의 레이블된 데이터셋이 필요합니다. 객체 검출 및 분할을 위한 데이터셋을 준비하기 위해서는 주어진 이미지에 대해 객체의 위치 및 클래스에 대한 정보를 가지는 바운딩 박스 레이블과 마스크 레이블을 생성해야 합니다.

# 예시에서는 COCO 데이터셋을 사용하여 객체 검출과 분할을 위한 레이블을 생성한다고 가정합니다.
from pycocotools.coco import COCO
import numpy as np

def generate_bounding_box_labels(coco, image_id):
    target = coco.loadAnns(coco.getAnnIds(imgIds=image_id))
    bounding_boxes = []
    labels = []
    for obj in target:
        bounding_boxes.append(obj['bbox'])
        labels.append(obj['category_id'])
    return np.array(bounding_boxes), np.array(labels)

def generate_mask_labels(coco, image_id):
    target = coco.loadAnns(coco.getAnnIds(imgIds=image_id))
    mask = np.zeros((image_height, image_width), dtype=np.uint8)
    for obj in target:
        mask = coco.annToMask(obj)[:,:,np.newaxis]
    return mask

모델 학습 및 평가

데이터셋과 모델이 준비되었다면, 이제 모델을 학습시키고 평가해볼 차례입니다. 이를 위해 데이터셋을 학습용과 검증용으로 분할하고, 모델을 컴파일하고 학습시킵니다. 학습이 완료된 모델을 검증용 데이터셋에 적용하여 성능을 평가합니다.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

def train_and_evaluate_model(model, train_data, val_data):
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=20, width_shift_range=0.2,
                                       height_shift_range=0.2, shear_range=0.2, zoom_range=0.2,
                                       horizontal_flip=True, fill_mode='nearest')
    val_datagen = ImageDataGenerator(rescale=1./255)
    
    train_generator = train_datagen.flow_from_directory(train_data, target_size=(224, 224), batch_size=32, class_mode='categorical')
    val_generator = val_datagen.flow_from_directory(val_data, target_size=(224, 224), batch_size=32, class_mode='categorical')
    
    model.fit_generator(train_generator, steps_per_epoch=len(train_generator), epochs=10,
                        validation_data=val_generator, validation_steps=len(val_generator))
    
    # 모델 평가 코드

객체 검출과 분할 적용

학습된 모델을 적용하여 실제 이미지에서 객체 검출과 분할을 수행할 수 있습니다. 이를 위해서는 입력 이미지에 대한 전처리가 필요하며, 모델의 출력을 후 처리하여 결과를 시각화할 수 있습니다.

from tensorflow.keras.preprocessing.image import img_to_array, load_img

def preprocess_image(image_path):
    image = load_img(image_path, target_size=(224, 224))
    image = img_to_array(image)
    image = np.expand_dims(image, axis=0)
    image /= 255.0
    return image

def apply_object_detection(model, image_path):
    image = preprocess_image(image_path)
    predictions = model.predict(image)
    # 후 처리 및 시각화 코드

위와 같은 방법으로 객체 검출 및 분할 딥러닝 모델을 활용할 수 있습니다. 다양한 데이터셋과 모델을 실험해보면서 원하는 결과를 얻을 수 있는 최적의 조합을 찾아보세요.