MediaPipe Image Segmenter의 주요 기능과 실행 모드를 중심으로 이미지 세그멘테이션의 개념과 활용법을 소개합니다.
SelfieSegmenter, HairSegmenter, SelfieMulticlass, DeepLab-v3 등 다양한 모델 비교와 Python 코드 예제까지 함께 제공합니다.
MediaPipe Image Segmentation 사용하기 : 이미지 분할
목차2. MediaPipe Image Segmenter 주요 기능과 옵션
3. ImageSegmenter 실행모드: IMAGE, VIDEO, LIVE_STREAM
1. Image Segmentation 이란?
이미지 세그멘테이션(Image Segmentation)은 이미지의 각 픽셀을 분석하여 객체의 경계를 정밀하게 나누는 기술입니다.
객체 탐지(Object Detection)보다 더 정교하게 이미지 속 구성 요소를 파악할 수 있으며, 다양한 비전 AI 응용에 필수적입니다.
- Object Detection: 바운딩 박스로 객체 위치 파악
- Image Segmentation: 픽셀 단위로 정밀하게 분할
활용 예:
- 배경을 지우거나 바꾸고 싶을 때: 인물은 그대로 두고 뒤 배경만 흰색, 블러 처리, 혹은 다른 이미지로 교체할 수 있습니다.
- 가상 옷 입히기나 머리 스타일 바꾸기: 얼굴, 옷, 머리카락을 구분해서 각각 다른 효과나 스타일을 적용할 수 있습니다.
- 카메라 앱 필터나 증강현실 효과: 사용자의 위치나 신체 부위를 기반으로 스티커, 이모지, 이펙트를 추가할 수 있습니다.
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)로 구분하는 가장 기본적인 세그멘테이션 모델입니다.
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는 이미지에서 사람의 머리카락 부분만 정확하게 분리하는 세그멘테이션 모델입니다.
0 - background
1 - hair
Model name | Input shape | Quantization type |
HairSegmenter | 512 x 512 | None (float32) |
☞ 특징
- 입력 해상도: 512x512 (다른 모델보다 크고 정밀)
- 비양자화(float32) → 정확도 우선
- 머리카락 경계선 인식이 매우 뛰어남
☞ 사용 예시
- 헤어 컬러링 / 스타일링 시뮬레이션
- 뷰티 앱에서 가상 염색 효과 구현
- 미용 시술 전후 비교 기능
◆ Multi-class selfie segmentation 모델 : SelfieMulticlass
SelfieMulticlass는 사람(상반신)의 이미지를 가져와 머리카락, 피부, 의류와 같은 다양한 영역의 영역을 찾고 이러한 항목의 이미지 세분화 맵을 출력합니다. 이 모델을 사용하여 이미지 또는 동영상의 인물에 다양한 효과를 적용할 수 있습니다. 모델은 다음과 같은 세분화 카테고리를 출력합니다.
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이 만든 범용 세그멘테이션 모델입니다.
사람뿐만 아니라 고양이, 강아지, 식물, 의자 등 다양한 객체를 인식할 수 있습니다.
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)
◆ 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: 흰색 (배경) | 렌더링용 |
◆ 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
◆ 배경 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)
관련 글 링크
[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
'2.인공지능 > MediaPipe' 카테고리의 다른 글
6.MediaPipe Interactive Image Segmenter 사용 : 코드 예시 (0) | 2025.05.13 |
---|---|
5.MediaPipe Hair Segmenter로 머리카락 염색 효과 테스트 (0) | 2025.05.08 |
3.MediaPipe Image Classification 사용하기 : 이미지 분류 (0) | 2025.04.24 |
2.MediaPipe Object Detector 사용하기: 객체탐지 (0) | 2025.04.22 |
1.Google MediaPipe 솔루션 이해하기 (0) | 2025.04.15 |