2.인공지능/MediaPipe

4.MediaPipe Image Segmentation 사용하기 : 이미지 분할

쿼드큐브 2025. 4. 28. 16:41
728x90

MediaPipe Image Segmenter의 주요 기능과 실행 모드를 중심으로 이미지 세그멘테이션의 개념과 활용법을 소개합니다.
SelfieSegmenter, HairSegmenter, SelfieMulticlass, DeepLab-v3 등 다양한 모델 비교와 Python 코드 예제까지 함께 제공합니다.

 

MediaPipe Image Segmentation 사용하기 : 이미지 분할

 

목차

1. Image Segmentation이란?

2. MediaPipe Image Segmenter 주요 기능과 옵션

3. ImageSegmenter 실행모드: IMAGE, VIDEO, LIVE_STREAM

4. 기본 제공 모델 종류 및 성능 비교

5. Image Segmentation 사용 예시:Selfie Segmenter

관련 글 링크

 

 

1. Image Segmentation 이란?

이미지 세그멘테이션(Image Segmentation)은 이미지의 각 픽셀을 분석하여 객체의 경계를 정밀하게 나누는 기술입니다.
객체 탐지(Object Detection)보다 더 정교하게 이미지 속 구성 요소를 파악할 수 있으며, 다양한 비전 AI 응용에 필수적입니다.

  • Object Detection: 바운딩 박스로 객체 위치 파악
  • Image Segmentation: 픽셀 단위로 정밀하게 분할

활용 예:

  • 배경을 지우거나 바꾸고 싶을 때: 인물은 그대로 두고 뒤 배경만 흰색, 블러 처리, 혹은 다른 이미지로 교체할 수 있습니다.
  • 가상 옷 입히기나 머리 스타일 바꾸기: 얼굴, 옷, 머리카락을 구분해서 각각 다른 효과나 스타일을 적용할 수 있습니다.
  • 카메라 앱 필터나 증강현실 효과: 사용자의 위치나 신체 부위를 기반으로 스티커, 이모지, 이펙트를 추가할 수 있습니다.

MediaPipe Image Segmentation
출처:https://ai.google.dev/edge/mediapipe/solutions/vision/image_segmenter

 

2. MediaPipe Image Segmenter 주요 기능과 옵션

MediaPipe Image Segmenter는 Google에서 제공하는 실시간 세그멘테이션 라이브러리입니다.

◆ 주요 기능 요약 :

  • 다양한 세그멘테이션 모델 사용 가능 (사람, 머리, 의복 등)
  • 입력: 이미지, 비디오 프레임, 실시간 스트림 지원
  • 출력: CATEGORY_MASK (uint8), CONFIDENCE_MASK (float32)
  • 경량화된 TFLite 모델 사용

CATEGORY_MASK vs CONFIDENCE_MASKS :

  • CATEGORY_MASK  : “이 픽셀은 무엇인가요?”에 대한 정답 하나만 표시
  • CONFIDENCE_MASKS : “이 픽셀이 각 클래스에 속할 확률은?”에 대한 모든 확률값 제공

값 예시: 

픽셀 위치 CONFIDENCE_MASKS (배경, 사람, 머리카락) CATEGORY_MASK 값
(100, 200) [0.10, 0.85, 0.05] → 사람 확률이 제일 높음 1 (사람), 모델에 따라 상이함
(50, 50) [0.70, 0.20, 0.10] → 배경 확률이 높음 0 (배경), 모델에 따라 상이함

 

활용 예시:

작업 목적 추천 값 이유
전경만 남기고 배경 지우기 CATEGORY_MASK 빠르고 간단하게 이진 분할 가능
경계선 부드럽게 처리 CONFIDENCE_MASKS 확률 기반 투명도 조정 가능
불확실한 영역 제외 처리 CONFIDENCE_MASKS + threshold 확률 낮은 픽셀 무시 가능
AR 효과나 필터 둘 다 조합 가능 카테고리 + 투명도 혼합 처리 가능

 

 

◆ ImageSegmenterOptions

옵션 설명 예시 기본값
running_mode 실행 모드 선택
• IMAGE: 단일 이미지 입력
• VIDEO: 동영상 프레임 입력
• LIVE_STREAM: 실시간 스트림 입력 (결과 콜백 필요)
IMAGE, VIDEO,
LIVE_STREAM
IMAGE
output_category_mask 카테고리 마스크 출력 여부 True/False False
output_confidence_masks 픽셀별 확률 마스크 출력 여부 True/False True
display_names_locale 라벨 언어 설정 'en', 'ko' 등 'en'
result_callback 실행 모드가 LIVE_STREAM일 경우,
결과 리스너 함수(콜백) 설정
함수 객체 -

 

 

3. ImageSegmenter 실행모드: IMAGE, VIDEO, LIVE_STREAM

MediaPipe Image Classifier는 실행 환경에 따라 다음 세 가지 모드를 제공합니다.
각 모드는 입력 방식, 함수 호출, 결과 전달 방식이 다르며, 상황에 맞는 선택이 중요합니다.

모드 설명 함수 이름
IMAGE 정지 이미지 1장을
한 번에 처리
segment(image, image_processing_options=None)
VIDEO 영상 프레임 단위로
순차 처리
segment_for_video(image, timestamp_ms, image_processing_options=None)
LIVE_STREAM 실시간 스트림 입력 처리
(웹캠 등)
segment_async(image, timestamp_ms, image_processing_options=None)

 - VIDEO와 LIVE_STREAM은 timestamp_ms 필요

 - LIVE_STREAM은 result_callback 함수 등록 필수

 

◆ ImageProcessingOptions 활용

Image Classifier에서도 회전 보정 ROI 지정을 통해 정확도를 높일 수 있습니다.
이 옵션은 모든 실행 모드에서 image_processing_options 파라미터로 사용됩니다.

 

예시 1: 회전 각도 지정 (시계방향 90도)

  - 세로 촬영 이미지나 회전된 카메라 입력을 정확히 감지하려면 rotation_degrees를 반드시 설정해야 합니다.

from mediapipe.tasks.python.vision.core.image_processing_options import ImageProcessingOptions

image_processing_options = ImageProcessingOptions(rotation_degrees=90)

예시 2: ROI (관심 영역) 지정

  - 전체 이미지가 아닌 일부 영역(예: 화면 중앙 50%)만 분류 대상으로 지정하고 싶을 때 유용합니다.

from mediapipe.tasks.python.components.containers.rect import NormalizedRect

roi = NormalizedRect(x_center=0.5, y_center=0.5, width=0.5, height=0.5)
image_processing_options = ImageProcessingOptions(region_of_interest=roi)

 

  result_callback 함수 등록 예시

# ------------------------------------------------------------
def segmentation_result_callback(result, output_image, timestamp_ms):
    category_mask = result.category_mask.numpy_view()
    print(f"Unique values: {np.unique(category_mask)}, dtype: {category_mask.dtype}")


options = vision.ImageSegmenterOptions(
    base_options=base_options,                   # 모델 로딩 설정
    running_mode=vision.RunningMode.LIVE_STREAM,  # 실시간 스트리밍 모드
    output_category_mask=True,                    # Category mask 출력 활성화
    output_confidence_masks=True,                 # Confidence mask 출력 활성화
    result_callback=segmentation_result_callback  # 콜백 함수 등록
)

with vision.ImageSegmenter.create_from_options(options) as segmenter:
    segmenter.segment_async(mp_image, timestamp_ms=elapsed_time_ms)

 

 

4. 기본 제공 모델 종류 및 성능 비교

MediaPipe Image Segmenter는 총 4가지 모델을 제공합니다.

대부분은 사람 중심의 세그멘테이션에 최적화되어 있으며, 각각 용도와 정밀도가 다릅니다. 아래는 모델별 특징입니다:

 

◆ Selfie Segmentation 모델 : SelfieSegmenter(square / landscape)

SelfieSegmenter는 사람(인물, 상반신)의 전경과 배경을 2가지 카테고리(배경 = 0, 사람 = 1)로 구분하는 가장 기본적인 세그멘테이션 모델입니다.

MediaPipe Selfie Segmentation
출처:https://ai.google.dev/edge/mediapipe/solutions/vision/image_segmenter

0 - background
1 - person


모델은 입력 이미지의 비율에 따라 두 가지 버전으로 제공됩니다.

버전 입력 크기 설명
SelfieSegmenter(square) 256x256 1:1 (예: 256x256)
정사각형 이미지 또는 인스타 셀피
상대적으로 느림 (픽셀 수 많음)
얼굴/상체 중심 이미지에서 정확함
SelfieSegmenter(landscape) 144x256 16:9 또는 4:3 비율 (예: 256x144)
상대적으로 빠름 (픽셀 수 적음)
영상 스트리밍, 웹캠, 화상회의 등
상반신 이상이 가로로 넓게 잡힌 영상에서 최적
  • Square 모델은 사람 얼굴 중심의 중앙 정렬 이미지에 강점이 있습니다. 하지만 가로로 넓은 프레임에서는 머리카락 또는 어깨 인식 누락이 생길 수 있습니다.
  • Landscape 모델은 카메라 프레임이 고정된 환경(예: 화상회의, 영상 통화)에서 효율적이며, 사람의 어깨 및 머리까지 안정적으로 인식합니다.
  • 실시간 스트리밍에서는 landscape 버전이 성능(프레임율) 유지에 더 유리합니다.

☞ 사용 예시

  • 영상 회의 배경 제거/교체
  • 실시간 AR 필터 효과
  • 전신 사진에서 배경만 흐리게 처리

◆ Hair Segmentation 모델 : HairSegmenter

Hair Segmenter는 이미지에서 사람의 머리카락 부분만 정확하게 분리하는 세그멘테이션 모델입니다.

Mediapipe Hair Segmentation
출처:https://ai.google.dev/edge/mediapipe/solutions/vision/image_segmenter

0 - background
1 - hair
Model name Input shape Quantization type
HairSegmenter 512 x 512 None (float32)

☞ 특징

  • 입력 해상도: 512x512 (다른 모델보다 크고 정밀)
  • 비양자화(float32) → 정확도 우선
  • 머리카락 경계선 인식이 매우 뛰어남

☞ 사용 예시

  • 헤어 컬러링 / 스타일링 시뮬레이션
  • 뷰티 앱에서 가상 염색 효과 구현
  • 미용 시술 전후 비교 기능

◆ Multi-class selfie segmentation 모델 : SelfieMulticlass

SelfieMulticlass는 사람(상반신)의 이미지를 가져와 머리카락, 피부, 의류와 같은 다양한 영역의 영역을 찾고 이러한 항목의 이미지 세분화 맵을 출력합니다. 이 모델을 사용하여 이미지 또는 동영상의 인물에 다양한 효과를 적용할 수 있습니다. 모델은 다음과 같은 세분화 카테고리를 출력합니다.

Mediapipe SelfieMulticlass
출처:https://ai.google.dev/edge/mediapipe/solutions/vision/image_segmenter

0 - background
1 - hair
2 - body-skin
3 - face-skin
4 - clothes
5 - others (accessories)

 

Model name Input Shape Quantization type
SelfieMulticlass (256 x 256) 256x256 None (float32)

 

DeepLab-v3 model

DeepLab-v3는 Google이 만든 범용 세그멘테이션 모델입니다.
사람뿐만 아니라 고양이, 강아지, 식물, 의자 등 다양한 객체를 인식할 수 있습니다.

Mediapipe Image Segmentation
출처:https://sthalles.github.io/deep_segmentation_network/

Model name Input Shape Quantization
DeepLab-V3 257 x 257 None (float32)

☞ 특징

  • 입력 크기: 257x257
  • 다중 객체 분할이 가능
  • ASPP(Atrous Spatial Pyramid Pooling) 구조를 활용하여 넓은 문맥 정보를 포착
  • 상대적으로 모델 크기 크고 연산량 많음

☞ 분류

  • 사람(Person)
  • 동물(Animal): bird, cat, cow, dog, horse, sheep
  • 탈것(Vehicle): aeroplane, bicycle, boat, bus, car, motorbike, train
  • 가전/가구(Indoor): bottle, chair, dining table, potted plant, sofa, tv/monitor

☞ 사용 예시

  • 일반 이미지 분석 (사람 외 포함)
  • 복합 객체가 있는 이미지 분할
  • 자연 이미지 기반 학습, 장면 이해

  모델 비교

모델 대상 주요용도 CPU지연 GPU지연
SelfieSegmenter 배경 / 사람(상반신) 실시간 배경 제거 33.46ms
34.19ms
35.15ms
33.55ms
HairSegmenter 배경 / 머리카락 헤어 필터, 컬러링 57.90ms 52.14ms
SelfieMulticlass 배경, 머리, 피부, 얼굴,의복 등(상반신) AR/패션 분석 217.76ms 71.24ms
DeepLab-v3 사람 + 일반 객체 범용 세그멘테이션 123.93ms 103.30ms

 

5. Image Segmentation 사용 예시 : Selfie Segmenter

# 모델 파일 경로를 설정합니다.
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
model_path = os.path.join(BASE_DIR, './models/selfie_segmenter_square.tflite')

# Image Segmenter의 기본 옵션을 설정합니다.
# NotImplementedError: GPU Delegate is not yet supported for Windows
base_options = python.BaseOptions(model_asset_path=model_path, 
                                  delegate=python.BaseOptions.Delegate.CPU)

# Image Segmenter 옵션을 설정합니다.
options = vision.ImageSegmenterOptions(
    base_options=base_options,  # 기본 옵션
    running_mode=vision.RunningMode.IMAGE,  # 실행 모드: 이미지 처리
    output_category_mask=True,  # category_mask 출력
    output_confidence_masks=True  # confidence_masks출력
)

try:
    # Image Segmenter를 생성하고 사용합니다.
    with vision.ImageSegmenter.create_from_options(options) as segmenter:
        # 입력 이미지 파일 경로를 설정합니다.
        image_path = os.path.join(BASE_DIR, './images/ssa5.jpg')
        mp_image = mp.Image.create_from_file(image_path)

        # 원본 이미지를 OpenCV로 출력합니다.
        show_original_image(mp_image)
        cv2.waitKey(0)   

        # 세그멘테이션(분할)을 수행합니다.
        segmentation_result = segmenter.segment(mp_image)
        # 결과를 read onnly NumPy 배열로 변환합니다.
        category_mask = segmentation_result.category_mask.numpy_view()
        confidence_mask = segmentation_result.confidence_masks[0].numpy_view()  

        # category_mask 시각화
        show_category_mask(category_mask)
        cv2.waitKey(0)

        # confidence_masks
        show_confidence_masks(confidence_mask)
        cv2.waitKey(0)
       
        # 백 그라운드 blur 처리
        apply_blur_background(mp_image, category_mask)
        cv2.waitKey(0)
finally:
    # OpenCV 창을 닫습니다.
    cv2.destroyAllWindows()

 

  원본 이미지 시각화: show_original_image()

def show_original_image(mp_image):
    # MediaPipe 이미지를 NumPy 배열로 변환하고 BGR 형식으로 변환합니다.
    mp_image_bgr = cv2.cvtColor(mp_image.numpy_view().copy(), cv2.COLOR_RGB2BGR)
    # OpenCV 창에 이미지를 출력합니다.
    cv2.imshow('Original Image', mp_image_bgr)

Mediapipe Selfie Segmenter

 

  category_mask 시각화: show_category_mask()

def show_category_mask(category_mask):
    print(f"Category mask...............................")    
    print(f"Unique values: {np.unique(category_mask)}, dtype: {category_mask.dtype}")
    cv2.imshow("Category Mask", category_mask)

SelfieSegmenter는 사람=1, 배경=0으로 분류하지만,
MediaPipe category_mask 출력에서는 사람=0(검정색), 배경=255(흰색) 으로 표시됩니다.
이는 사용자에게 보기 쉽게 렌더링하기 위한 후처리 때문이라고 추측하고 있습니다.

255 - background
0 - person
################################################################
Category mask...............................
Unique values: [  0 255], dtype: uint8

구분클래스category_mask 출력 값의미

구분 클래스 category_mask 값 의미
모델 내부 (SelfieSegmenter) 사람 = 1, 배경 = 0 - 분류용
MediaPipe category_mask 출력 사람 = 0, 배경 = 255 0: 검정색 (사람), 255: 흰색 (배경) 렌더링용

Mediapipe Selfie Segmenter

 

  confidence_mask 시각화 : show_confidencec_mask()

confidence mask는 각 픽셀마다 사람이 있을 확률(0.0~1.0)을 나타내는 부드러운 마스크 정보 입니다.

0.0 ~ 1.0 사이의 부동소수(float32) 값을 가집니다.

사람/배경 경계가 부드러운 마스크를 만들거나, soft blending, matting 등에 사용 합니다.

def show_confidence_masks(confidence_mask):
    print(f"Confidence mask...............................")    
    print(f"Unique values: {np.unique(confidence_mask)}, dtype: {confidence_mask.dtype}")

    # 값이 0~1 사이일 경우 255로 스케일링
    confidence_masks_visual = (confidence_mask * 255).astype(np.uint8)  
    cv2.imshow("Confidence Masks", confidence_masks_visual)
Confidence mask...............................
Unique values: [0.0000000e+00 4.2557434e-42 4.3916694e-42 ... 9.9999988e-01 9.9999994e-01
1.0000000e+00], dtype: float32

Mediapipe Selfie Segmenter

 

  배경  blure 처리 예제 : apply_blur_background()

def apply_blur_background(mp_image, category_mask):
    # MediaPipe 이미지를 NumPy 배열로 변환하고 BGR 형식으로 변환합니다.
    mp_image_bgr = cv2.cvtColor(mp_image.numpy_view().copy(), cv2.COLOR_RGB2BGR)
    
    # 배경 영역(255)을 1(True)로, 사람 영역(0) 0(False)으로 변환한 이진 마스크 생성
    binary_mask = (category_mask == 255).astype(np.uint8)

   # 배경을 블러 처리합니다.
    blurred_background = cv2.GaussianBlur(mp_image_bgr, (51, 51), 0) 
    # 마스크를 사용하여 원본 이미지와 블러 처리된 배경을 합성합니다.
    # np.where(조건, 참일 때 값, 거짓일 때 값)
    result_image = np.where(binary_mask[:, :, None] == 1, blurred_background, mp_image_bgr)

    # 결과 이미지를 출력합니다.
    cv2.imshow("Blurred Background", result_image)

Mediapipe Selfie Segmenter test

 

 


 

 

 

관련 글 링크

[2.인공지능/개념&이론] - 3. 이미지 분석 기술: Classification, Object Detection, Segmentation

 

3. 이미지 분석 기술: Classification, Object Detection, Segmentation

컴퓨터가 이미지를 '이해'하도록 만드는 기술을 컴퓨터 비전(Computer Vision)이라고 합니다.이미지를 이해하는 데 가장 많이 사용되는 기술은 분류(Classification), 객체 탐지(Object Detection), 세그멘테이

quadcube.tistory.com

https://ai.google.dev/edge/mediapipe/solutions/vision/image_segmenter?hl=ko

 

이미지 분할 가이드  |  Google AI Edge  |  Google AI for Developers

LiteRT 소개: 온디바이스 AI를 위한 Google의 고성능 런타임(이전 명칭: TensorFlow Lite)입니다. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 이미지 분할 가이드 MediaPipe Image Segmente

ai.google.dev

https://pytorch.org/hub/pytorch_vision_deeplabv3_resnet101/

 

Deeplabv3

import torch model = torch.hub.load('pytorch/vision:v0.10.0', 'deeplabv3_resnet50', pretrained=True) # or any of these variants # model = torch.hub.load('pytorch/vision:v0.10.0', 'deeplabv3_resnet101', pretrained=True) # model = torch.hub.load('pytorch/vis

pytorch.org

t1_selfie_segmenter_square_image.py
0.01MB

728x90