본문 바로가기

Computer Vision + Python/영상 처리 & 비디오 분석 (엔지니어)

Python으로 영상 분할(Segmentation) 후 객체별 색상 랜더링(Object Coloring)

 

Python으로 영상 분할(Segmentation) 후 객체별 색상 랜더링(Object Coloring)

영상 처리 기술은 최근 몇 년 동안 비약적으로 발전해 왔으며, 특히 영상 분할(Segmentation)은 더 이상 연구실에서만 사용하는 기술이 아니라 실시간 방송, 영화 후반 작업, 자율주행, 감시 시스템까지 다양한 분야에서 핵심 기능으로 자리 잡았다. 이번 글에서는 Python을 활용해 Segmentation 이후 각 객체에 별도의 색상을 입히는 Object Coloring 워크플로우를 다룬다. 단순한 분할을 넘어, 객체를 시각적으로 구분해 분석과 시각화를 동시에 강화하는 기법이다.

본 글은 일반적인 튜토리얼과 달리, 실제 프로젝트에서 얻은 경험과 시행착오를 중심으로 기술되어 있어 실무적인 시사점도 함께 얻을 수 있을 것이다.


1. 왜 객체별 색상 랜더링이 필요한가?

영상 분할은 기본적으로 객체의 위치와 경계를 정확하게 추출하는 과정이다. 하지만 실무에서는 단순히 객체를 구분하는 것만으로는 충분하지 않다. 사람, 자동차, 동물 등 서로 다른 클래스가 존재하고, 심지어 동일 클래스 안에서도 개별 객체를 색으로 구분해야 분석 정확도가 높아진다.

특히 다음과 같은 상황에서 색상 랜더링은 매우 유용하다.

  • CCTV 분석: 여러 사람이 오갈 때 추적 대상별 색상 지정
  • 의료 영상: 조직별 색상 분리로 식별 효율 증가
  • 자율주행: 도로 객체를 시각적으로 명확히 표현
  • AR/VR: 사용자가 인식할 수 있는 경계 강조

개인적으로 여러 영상 검출 프로젝트를 진행하며 경험한 점은 “색으로 객체 정체성을 극적으로 강화할 수 있다”는 것이다. 단순한 바운딩 박스보다 Segmentation + Coloring이 훨씬 직관적이며, 데이터 리뷰 속도도 크게 향상된다.


2. Python 환경에서 Segmentation 수행 전략

Python에서는 다양한 Segmentation 모델이 존재한다. 대표적으로 아래와 같은 분류 방식으로 나눌 수 있다.

  • Semantic Segmentation (예: DeepLab, UNet)
    클래스 단위 분할. 객체별 구분은 어려우나 정교하다.
  • Instance Segmentation (예: Mask R-CNN, YOLACT)
    개별 객체마다 분할 마스크 생성.
  • Video Segmentation (예: XMem, STCN)
    프레임 간 관계를 유지하며 실시간 추적/분할.

필자가 추천하는 전략은 다음과 같다.

  1. 정교한 작업 → Mask R-CNN
  2. 속도가 중요할 때 → YOLACT
  3. 긴 영상의 연속성 보존 → XMem

이후 객체별 색상 랜더링을 위해서는 “Instance 별 Mask”가 반드시 필요하다. 즉 Semantic Segmentation만으로는 Object Coloring 구현이 제한되므로 모델 선택이 매우 중요하다.


3. Segmentation 후 객체 색상 랜더링 핵심 아이디어

객체별 색상을 입히는 과정은 간단해 보이지만 실제 구현에서는 많은 미묘한 난관이 존재한다. 가장 중요한 핵심은 다음 네 가지다.

  1. 객체 ID 유지(Tracking)
  2. 색상 팔레트 생성
  3. 마스크 기반의 색상 오버레이
  4. RGB 조합 시 원본 영상 왜곡 최소화

1) 객체 ID 유지

Segmentation 모델이 매 프레임 객체를 “새로운 ID”로 분류하면 색이 계속 바뀌는 문제 발생.
따라서 SORT, DeepSORT, ByteTrack 같은 추적기를 함께 사용해 ID 안정성을 확보해야 한다.

2) 색상 팔레트

색이 무작위로 선택되면 시인성이 떨어진다.
경험상 HSV 색 공간을 사용해 일정 간격으로 색을 생성하는 방식이 가장 안정적이다.

3) 마스크 오버레이

Mask 영역에 색을 입힌 뒤 원본 영상과 알파 블렌딩을 적용해 자연스럽게 표현하는 것이 중요하다. 너무 강한 색을 적용하면 원본 디테일이 사라지는 문제가 있다.

4) 자연스러운 합성

색상은 강조하되 영상의 텍스처 정보는 남겨두어야 한다.
이를 위해 보통 **0.3~0.5 정도의 투명도(alpha)**가 실무에서 가장 효과적이었다.


4. Python 예시 워크플로우

아래는 Mask R-CNN 기반 객체 분할 후 색상 랜더링을 수행하는 예시 로직이다.

import cv2
import numpy as np

def apply_color_mask(image, mask, color):
    color_layer = np.zeros_like(image)
    color_layer[:] = color
    alpha = 0.4
    blended = cv2.addWeighted(color_layer, alpha, image, 1 - alpha, 0)
    image[mask == 255] = blended[mask == 255]
    return image

# 가상의 객체 마스크 배열 (여러 객체)
masks = [mask1, mask2, mask3]  # 각 mask는 255/0으로 구성된 바이너리 마스크
colors = [(255,0,0), (0,255,0), (0,0,255)]  # 객체별 색상

output = frame.copy()
for mask, color in zip(masks, colors):
    output = apply_color_mask(output, mask, color)

cv2.imshow("Object Coloring", output)

실제 프로젝트에서는 객체 수가 동적이므로 색상 팔레트는 자동으로 생성해야 한다.


5. 실무에서 경험한 주요 문제와 해결법

● 문제 1: 객체 마스크가 덜 깔끔함

경계가 매끄럽지 않아 색 번짐이 발생할 수 있다.
Morphology(Closing, Opening) 또는 Gaussian Blur로 마스크의 자연스러움 증대.

● 문제 2: 객체 ID가 프레임마다 바뀜

ID 재할당 문제로 컬러가 계속 변경됨.
→ 추적기 사용 + IoU 기반 ID 교정 알고리즘 추가.

● 문제 3: 프레임 지연

Segmentation이 GPU 없이 느리게 작동.
→ 분할 해상도 조절(720p → 480p),
→ 경량 모델 사용(YOLACT),
→ 필요 영역만 Cropping.

● 문제 4: 색상 중복

객체가 많을 경우 색상이 비슷하게 보임.
→ HSV 기반 균등 색상 분포로 문제 해결.

개인적으로 실제 모니터링 시스템 개선을 위해 Object Coloring을 적용했을 때, 기존 Bounding Box 기반 모니터링보다 분석 속도가 2배 이상 향상되었다. 특히 사람 수가 많거나 움직임이 많은 장면에서 효과가 극명했다.


6. 활용 가능한 응용 분야

  • 대형 쇼핑몰·지하철 CCTV 분석
    혼잡도 측정 및 동선 분석이 직관적으로 가능해진다.
  • AI 스포츠 분석
    선수별 라벨링 및 움직임 가시화.
  • AR/VR 실시간 객체 강조
    가상 환경과 실제 객체의 경계 명확화.
  • 자율주행 센서 퓨전
    라이다·카메라 데이터의 객체 대응 관계 확인.

7. 마무리: Object Coloring은 시각적 AI 분석의 필수 요소

Segmentation 이후 객체별 색상 랜더링은 단순한 시각적 장식이 아니다.
객체의 정체성을 강화하여 데이터 분석 효율을 높이는 실무 중심 기술이며, 특히 CCTV·자율주행·의료 영상처럼 높은 신뢰도가 필요한 분야에서 그 진가가 드러난다.

Python과 OpenCV는 이러한 워크플로우를 빠르게 구축할 수 있는 훌륭한 도구이며, 적절한 분할 모델과 추적 알고리즘, 색상 팔레트 전략을 사용하면 고품질의 시각화 시스템을 구현할 수 있다.