본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 9. · 15 Views
Mask R-CNN 완벽 가이드
Instance Segmentation의 핵심 모델인 Mask R-CNN을 실무 중심으로 학습합니다. 픽셀 단위 객체 분할부터 Detectron2 프레임워크 활용까지, 초급 개발자도 쉽게 따라할 수 있도록 구성했습니다.
목차
- Instance Segmentation 개념
- Mask R-CNN 구조
- RoIAlign vs RoIPooling
- Mask Head 이해
- Detectron2 프레임워크
- 커스텀 학습 실습
1. Instance Segmentation 개념
어느 날 김개발 씨가 자율주행 프로젝트에 투입되었습니다. 팀장님이 말했습니다.
"도로 위의 사람과 차량을 픽셀 단위로 구분해야 해요." 김개발 씨는 고개를 갸우뚱했습니다. Object Detection으로는 안 되는 걸까요?
Instance Segmentation은 이미지 속 객체들을 픽셀 단위로 정확히 분할하는 기술입니다. 마치 색칠공부 책에서 각 영역을 서로 다른 색으로 칠하는 것처럼, 각각의 객체를 개별적으로 구분합니다.
Object Detection이 바운딩 박스로 대략적인 위치만 알려준다면, Instance Segmentation은 객체의 정확한 윤곽선을 그려줍니다.
다음 코드를 살펴봅시다.
import numpy as np
import cv2
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
# Instance Segmentation 추론 설정
cfg = get_cfg()
cfg.MODEL.WEIGHTS = "model_final.pth"
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # 신뢰도 임계값
predictor = DefaultPredictor(cfg)
# 이미지 읽기 및 추론
image = cv2.imread("street.jpg")
outputs = predictor(image) # 픽셀 단위 마스크 출력
# 결과에서 마스크 추출
masks = outputs["instances"].pred_masks # 각 객체의 픽셀 마스크
classes = outputs["instances"].pred_classes # 클래스 정보
김개발 씨는 컴퓨터 비전 팀에 배치된 지 일주일이 되었습니다. 오늘 아침, 팀장님이 새로운 프로젝트를 설명했습니다.
"자율주행 차량이 도로 위의 사람과 차량을 정확히 인식해야 합니다. 특히 겹쳐진 객체들도 개별적으로 구분해야 해요." 김개발 씨는 예전에 배웠던 Object Detection을 떠올렸습니다.
"바운딩 박스로 찾으면 되지 않나요?" 하지만 팀장님은 고개를 저었습니다. "그것만으로는 부족합니다.
픽셀 단위로 정확히 분할해야 해요." Instance Segmentation이란 무엇일까요? 쉽게 비유하자면, Instance Segmentation은 마치 색칠공부 책과 같습니다. 색칠공부 책을 보면 각 영역이 명확한 선으로 구분되어 있고, 우리는 각 영역을 서로 다른 색으로 칠합니다.
Instance Segmentation도 이와 똑같이 이미지 속 각 객체를 픽셀 단위로 정확히 구분합니다. 왜 필요한가? Object Detection만 사용하던 시절에는 어땠을까요?
바운딩 박스는 객체의 대략적인 위치만 알려줍니다. 사각형 안에 객체가 있다는 정보만 제공하죠.
문제는 객체의 정확한 형태를 알 수 없다는 점입니다. 자율주행 차량이 보행자와 정확히 얼마나 떨어져 있는지, 차량의 실제 크기가 얼마나 되는지 판단하기 어렵습니다.
더 큰 문제는 겹쳐진 객체들입니다. 두 사람이 나란히 걸어가면, 바운딩 박스만으로는 이들이 하나의 큰 객체인지 두 개의 분리된 객체인지 구분하기 힘듭니다.
의료 영상에서 종양의 정확한 크기를 측정하거나, 위성 사진에서 건물의 면적을 계산할 때도 마찬가지입니다. 해결책의 등장 바로 이런 문제를 해결하기 위해 Instance Segmentation이 등장했습니다.
Instance Segmentation을 사용하면 각 객체의 정확한 윤곽선을 얻을 수 있습니다. 픽셀 단위로 "이 픽셀은 사람1에 속하고, 저 픽셀은 사람2에 속한다"고 명확히 구분합니다.
또한 겹쳐진 객체들도 개별적으로 분리할 수 있습니다. 무엇보다 객체의 실제 면적과 형태를 정확히 측정할 수 있다는 큰 이점이 있습니다.
Semantic Segmentation과의 차이 선배 개발자 박시니어 씨가 중요한 점을 짚어줍니다. "Semantic Segmentation과 헷갈리면 안 돼요." Semantic Segmentation은 같은 클래스의 모든 픽셀을 하나로 묶습니다.
사진 속에 사람이 세 명 있으면, 세 명 모두 '사람'이라는 하나의 영역으로 칠해집니다. 반면 Instance Segmentation은 같은 클래스라도 개별 객체를 구분합니다.
사람1, 사람2, 사람3을 각각 다른 색으로 칠하는 것이죠. 코드 이해하기 위의 코드를 살펴보겠습니다.
먼저 Detectron2의 DefaultPredictor를 설정합니다. 이것이 실제로 추론을 수행하는 핵심 모듈입니다.
SCORE_THRESH_TEST는 신뢰도 임계값으로, 0.5 이상의 확신이 있는 객체만 결과로 반환합니다. 다음으로 이미지를 읽고 predictor(image)를 호출하면, 결과로 outputs를 받습니다.
여기에는 pred_masks와 pred_classes가 포함되어 있습니다. pred_masks가 바로 각 객체의 픽셀 단위 마스크입니다.
이것은 0과 1로 이루어진 이진 마스크로, 1이 해당 객체에 속하는 픽셀을 의미합니다. 실무 활용 사례 실제 현업에서는 어떻게 활용할까요?
의료 분야에서는 CT나 MRI 이미지에서 종양을 정확히 분할합니다. 종양의 크기와 모양을 픽셀 단위로 측정하여 치료 계획을 수립하는 데 활용됩니다.
자율주행에서는 도로 위의 차량, 보행자, 자전거를 개별적으로 추적하여 안전한 주행 경로를 계산합니다. 로봇 공학에서도 Instance Segmentation은 필수입니다.
로봇이 물건을 집으려면 테이블 위에 놓인 각 물건의 정확한 위치와 형태를 알아야 합니다. 바운딩 박스만으로는 물건의 손잡이가 어디에 있는지 정확히 파악하기 어렵습니다.
주의사항 하지만 주의할 점도 있습니다. Instance Segmentation은 Object Detection보다 계산량이 훨씬 많습니다.
모든 픽셀을 분류해야 하기 때문에 추론 속도가 느립니다. 따라서 실시간 처리가 필요한 경우 GPU 성능을 신중히 고려해야 합니다.
또한 학습 데이터 준비가 까다롭습니다. 바운딩 박스만 그리면 되는 Object Detection과 달리, 각 객체의 윤곽선을 픽셀 단위로 라벨링해야 합니다.
이는 시간과 비용이 많이 드는 작업입니다. 정리 김개발 씨는 팀장님의 설명을 듣고 이해했습니다.
"아, 그래서 바운딩 박스가 아니라 픽셀 마스크가 필요하군요!" Instance Segmentation을 제대로 이해하면 더 정밀한 컴퓨터 비전 시스템을 구축할 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - Instance Segmentation은 계산량이 많으므로 GPU 메모리를 충분히 확보하세요
- 학습 데이터의 마스크 품질이 모델 성능을 크게 좌우합니다
- 실시간 처리가 필요하다면 경량화된 모델(YOLACT 등)을 고려하세요
2. Mask R-CNN 구조
박시니어 씨가 화이트보드에 그림을 그리며 설명하기 시작했습니다. "Instance Segmentation을 하려면 Mask R-CNN을 알아야 해요." 김개발 씨는 노트북을 열고 메모를 시작했습니다.
이 모델의 구조는 어떻게 생겼을까요?
Mask R-CNN은 Faster R-CNN에 마스크 예측 브랜치를 추가한 모델입니다. 기본적으로 두 단계로 동작하는데, 첫 번째 단계에서 **Region Proposal Network(RPN)**이 객체가 있을 만한 영역을 제안하고, 두 번째 단계에서 각 영역에 대해 클래스 분류, 바운딩 박스 조정, 마스크 예측을 동시에 수행합니다.
마치 공장의 조립 라인처럼 각 단계가 유기적으로 연결되어 작동합니다.
다음 코드를 살펴봅시다.
from detectron2.modeling import build_model
from detectron2.config import get_cfg
from detectron2 import model_zoo
# Mask R-CNN 모델 설정
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(
"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
))
# 백본: ResNet-50 + FPN
cfg.MODEL.BACKBONE.NAME = "build_resnet_fpn_backbone"
cfg.MODEL.RESNETS.DEPTH = 50
# RPN 설정
cfg.MODEL.RPN.PRE_NMS_TOPK_TRAIN = 2000 # RPN 제안 개수
cfg.MODEL.RPN.POST_NMS_TOPK_TRAIN = 1000
# ROI Head 설정 (분류 + 박스 + 마스크)
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 80 # COCO 클래스 수
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 512
model = build_model(cfg) # 전체 모델 구축
김개발 씨는 Mask R-CNN 논문을 펼쳐 놓고 구조도를 바라봤습니다. 복잡해 보이지만, 박시니어 씨는 자신감 있게 말했습니다.
"어려워 보이지만, 하나씩 뜯어보면 생각보다 단순해요." Mask R-CNN의 전체 구조 Mask R-CNN을 이해하는 가장 쉬운 방법은 공장의 조립 라인을 떠올리는 것입니다. 원재료(이미지)가 컨베이어 벨트를 타고 들어옵니다.
첫 번째 작업장에서는 "어디에 제품이 있을까?"를 찾습니다. 이것이 **RPN(Region Proposal Network)**입니다.
두 번째 작업장에서는 각 제품을 검사합니다. "이게 뭐지?", "정확한 위치는?", "모양은?"을 동시에 파악합니다.
이것이 ROI Head입니다. 백본 네트워크: 특징 추출 모든 것은 백본(Backbone) 네트워크에서 시작됩니다.
백본은 주로 ResNet-50이나 ResNet-101을 사용합니다. 이것의 역할은 이미지에서 유용한 특징(features)을 추출하는 것입니다.
마치 요리사가 재료를 손질하는 것처럼, 원본 이미지를 컴퓨터가 이해하기 쉬운 특징 맵(feature map)으로 변환합니다. 여기에 **FPN(Feature Pyramid Network)**이 추가됩니다.
FPN은 다양한 크기의 객체를 잘 감지하기 위해 여러 스케일의 특징 맵을 만듭니다. 작은 객체는 고해상도 특징 맵에서, 큰 객체는 저해상도 특징 맵에서 감지됩니다.
RPN: 영역 제안 박시니어 씨가 설명을 이어갑니다. "RPN이 핵심이에요." RPN은 특징 맵을 받아서 "여기에 객체가 있을 것 같다"는 제안(proposal)을 만듭니다.
각 위치마다 여러 크기와 비율의 앵커 박스를 생성하고, 각 앵커가 객체를 포함할 확률을 계산합니다. 예를 들어 이미지에 자동차가 있다면, RPN은 자동차가 있을 만한 영역 주변에 여러 개의 후보 박스를 제안합니다.
이 중에서 확률이 높은 상위 1000개 정도를 다음 단계로 넘깁니다. ROI Head: 분류, 박스, 마스크 이제 진짜 작업이 시작됩니다.
각 제안된 영역(ROI, Region of Interest)에 대해 세 가지 작업을 동시에 수행합니다. 첫째, 분류 브랜치가 "이게 사람인가, 자동차인가, 고양이인가?"를 판단합니다.
둘째, 박스 회귀 브랜치가 바운딩 박스의 정확한 위치를 조정합니다. RPN이 대략적인 위치를 제안했다면, 이 단계에서 미세 조정합니다.
셋째, 그리고 가장 중요한 마스크 브랜치가 픽셀 단위 마스크를 예측합니다. 이것이 Mask R-CNN을 Faster R-CNN과 구분 짓는 핵심 요소입니다.
병렬 처리의 장점 여기서 중요한 점은 세 브랜치가 병렬로 동작한다는 것입니다. 기존 방식은 순차적으로 작업했습니다.
먼저 분류하고, 그 다음 박스를 조정하고, 마지막으로 마스크를 예측했죠. 하지만 Mask R-CNN은 세 작업을 동시에 수행합니다.
이렇게 하면 속도가 빨라질 뿐만 아니라, 각 작업이 서로 영향을 주지 않아 학습이 더 안정적입니다. 코드 분석 위의 코드를 살펴보겠습니다.
먼저 Detectron2에서 제공하는 설정 파일을 불러옵니다. mask_rcnn_R_50_FPN_3x.yaml은 ResNet-50 백본에 FPN을 사용하는 Mask R-CNN 설정입니다.
여기서 3x는 학습 스케줄을 의미합니다. RPN 설정에서 PRE_NMS_TOPK_TRAIN은 Non-Maximum Suppression 전에 고려할 제안 개수입니다.
POST_NMS_TOPK_TRAIN은 NMS 후 최종적으로 넘길 개수입니다. ROI Head 설정의 NUM_CLASSES는 감지할 클래스 수, BATCH_SIZE_PER_IMAGE는 각 이미지당 처리할 ROI 개수를 의미합니다.
실무에서의 활용 실제 프로젝트에서 Mask R-CNN을 사용할 때는 어떻게 할까요? 대부분은 COCO 데이터셋에서 사전 학습된 모델을 가져와서 자신의 데이터로 파인튜닝합니다.
처음부터 학습하는 것은 시간과 자원이 많이 들기 때문입니다. Detectron2 같은 프레임워크를 사용하면 몇 줄의 코드로 이런 작업을 수행할 수 있습니다.
주의사항 초보 개발자들이 흔히 하는 실수가 있습니다. RPN과 ROI Head를 혼동하는 경우입니다.
RPN은 "어디에 객체가 있을까?"만 판단하고, 정확한 클래스 분류는 ROI Head가 담당합니다. 또한 마스크 브랜치는 학습 시에만 사용하고 추론 시에는 끌 수도 있다고 생각하는데, 그렇지 않습니다.
마스크가 필요하다면 항상 마스크 브랜치가 작동해야 합니다. 정리 김개발 씨는 이제 Mask R-CNN의 전체 흐름을 이해했습니다.
"백본으로 특징을 뽑고, RPN이 영역을 제안하고, ROI Head가 분류와 마스크를 예측하는군요!" Mask R-CNN의 구조를 이해하면 더 효과적으로 모델을 튜닝하고 디버깅할 수 있습니다. 각 단계의 역할을 명확히 알고 있어야 문제가 생겼을 때 어디를 살펴봐야 할지 판단할 수 있습니다.
실전 팁
💡 - 백본은 ImageNet 사전 학습 가중치를 사용하면 성능이 크게 향상됩니다
- RPN의 앵커 크기는 데이터셋의 객체 크기 분포에 맞게 조정하세요
- 작은 데이터셋에서는 ROI Head의 배치 크기를 줄여 과적합을 방지하세요
3. RoIAlign vs RoIPooling
김개발 씨가 모델을 학습시키는데 마스크가 지글지글하게 나왔습니다. "왜 이렇게 품질이 안 좋죠?" 박시니어 씨가 설정을 살펴보더니 말했습니다.
"RoIPooling을 쓰고 있네요. RoIAlign으로 바꿔보세요."
RoIAlign은 Mask R-CNN에서 도입된 개선된 특징 추출 방법입니다. 기존 RoIPooling은 좌표를 정수로 반올림하여 픽셀 단위 정렬 오차가 발생했지만, RoIAlign은 bilinear interpolation을 사용하여 소수점 좌표에서도 정확한 특징을 추출합니다.
마치 사진을 확대할 때 계단 현상 없이 부드럽게 보간하는 것처럼, 더 정밀한 마스크를 생성할 수 있습니다.
다음 코드를 살펴봅시다.
from detectron2.layers import ROIAlign
import torch
# RoIPooling (구식, 정렬 오차 발생)
# roi_pool = nn.AdaptiveMaxPool2d((7, 7)) # 정수 좌표로 반올림
# RoIAlign (개선된 방법, bilinear interpolation 사용)
roi_align = ROIAlign(
output_size=(7, 7), # 출력 크기
spatial_scale=1.0/16, # 특징 맵 스케일 (stride 16)
sampling_ratio=2, # 샘플링 포인트 개수
aligned=True # 좌표 정렬 보정
)
# 특징 맵과 ROI 박스
features = torch.randn(1, 256, 50, 50) # (N, C, H, W)
boxes = torch.tensor([[0, 10.5, 15.7, 25.3, 30.8]]) # 소수점 좌표
# RoIAlign 적용 - 소수점 좌표에서도 정확한 특징 추출
aligned_features = roi_align(features, boxes) # (1, 256, 7, 7)
김개발 씨는 당황했습니다. 모델을 학습시켰는데 생성된 마스크가 울퉁불퉁하고 경계가 깔끔하지 않았습니다.
분명히 코드는 논문대로 작성했는데 왜 결과가 좋지 않을까요? 박시니어 씨가 설정 파일을 열어보더니 원인을 찾았습니다.
"여기 봐요. RoIPooling을 사용하고 있네요.
Mask R-CNN은 RoIAlign을 써야 해요." RoIPooling의 문제점 먼저 RoIPooling이 무엇인지 이해해야 합니다. Faster R-CNN에서 사용된 RoIPooling은 제안된 영역(ROI)에서 고정된 크기의 특징을 추출합니다.
예를 들어 ROI의 크기가 다양해도, 모두 7x7 크기로 변환합니다. 문제는 여기서 발생합니다.
원본 이미지의 좌표를 특징 맵으로 매핑할 때, 보통 stride 16이나 32로 나눕니다. 이 과정에서 소수점이 나오면 반올림을 합니다.
예를 들어 원본 좌표 (100.7, 200.3)을 stride 16으로 나누면 (6.29, 12.52)가 나오는데, 이를 (6, 13)으로 반올림합니다. 정렬 오차(Misalignment) 이 반올림이 문제를 일으킵니다.
마치 도화지에 그림을 그리는데 자가 조금씩 어긋나는 것과 같습니다. 1~2픽셀 정도의 오차는 바운딩 박스 예측에는 큰 영향이 없습니다.
하지만 픽셀 단위 마스크를 예측할 때는 치명적입니다. 1픽셀 오차가 누적되면 마스크 경계가 흐릿해지고 지글지글한 품질 저하가 발생합니다.
특히 작은 객체일수록 이 문제가 심각합니다. 10x10 크기의 작은 객체에서 2픽셀 오차는 20퍼센트의 오차입니다.
이렇게 되면 마스크가 엉망이 됩니다. RoIAlign의 등장 바로 이 문제를 해결하기 위해 RoIAlign이 등장했습니다.
RoIAlign은 반올림을 하지 않습니다. 대신 bilinear interpolation을 사용합니다.
이것은 사진 편집 프로그램에서 이미지를 확대할 때 부드럽게 보간하는 것과 같은 원리입니다. 소수점 좌표 (6.29, 12.52)가 있다면, 주변 4개 픽셀의 값을 거리 비율에 따라 가중 평균합니다.
(6, 12), (6, 13), (7, 12), (7, 13) 네 점의 값을 섞어서 (6.29, 12.52) 위치의 값을 계산하는 것이죠. 이렇게 하면 소수점 좌표에서도 정확한 특징을 추출할 수 있습니다.
Bilinear Interpolation 동작 원리 조금 더 자세히 살펴보겠습니다. 특징 맵에서 (6.29, 12.52) 위치의 값을 구한다고 가정합시다.
먼저 주변 4개 정수 좌표의 값을 가져옵니다. 좌표 (6, 12)의 값이 0.8, (7, 12)의 값이 0.6, (6, 13)의 값이 0.9, (7, 13)의 값이 0.7이라고 합시다.
x 방향으로 먼저 보간합니다. y=12 라인에서 x=6과 x=7 사이의 x=6.29 값을 계산합니다.
0.8 * 0.71 + 0.6 * 0.29 = 0.742입니다. 마찬가지로 y=13 라인에서 x=6.29 값은 0.9 * 0.71 + 0.7 * 0.29 = 0.842입니다.
이제 y 방향으로 보간합니다. 0.742 * 0.48 + 0.842 * 0.52 = 0.794입니다.
이것이 (6.29, 12.52) 위치의 최종 값입니다. Sampling Ratio RoIAlign에는 sampling_ratio라는 중요한 파라미터가 있습니다.
각 출력 셀을 계산할 때 몇 개의 샘플링 포인트를 사용할지 결정합니다. sampling_ratio=2이면 각 셀을 2x2 그리드로 나누고, 4개 포인트에서 bilinear interpolation을 수행한 뒤 평균을 냅니다.
샘플링 포인트가 많을수록 정확하지만 계산량이 증가합니다. 코드 분석 위의 코드를 살펴보겠습니다.
spatial_scale은 원본 이미지 좌표를 특징 맵 좌표로 변환하는 비율입니다. ResNet의 conv4 출력은 stride 16이므로 1/16을 사용합니다.
aligned=True는 좌표 정렬 보정을 활성화하는 옵션으로, 최신 구현에서는 반드시 켜야 합니다. boxes에 소수점 좌표 (10.5, 15.7, 25.3, 30.8)을 넣어도 RoIAlign은 정확히 처리합니다.
반올림 없이 bilinear interpolation으로 특징을 추출하여 aligned_features를 반환합니다. 성능 차이 박시니어 씨가 실험 결과를 보여줬습니다.
"RoIPooling 대신 RoIAlign을 쓰니까 마스크 AP가 3~4퍼센트 향상됐어요." Instance Segmentation에서 이 정도 개선은 큰 의미가 있습니다. 특히 작은 객체에서 효과가 두드러집니다.
경계가 선명해지고 디테일이 살아납니다. 주의사항 RoIAlign을 사용할 때 주의할 점이 있습니다.
spatial_scale을 잘못 설정하면 전혀 다른 영역에서 특징을 추출합니다. 백본의 stride를 정확히 확인하고 올바른 값을 넣어야 합니다.
또한 aligned=True 옵션을 빼먹으면 미세한 오차가 여전히 남을 수 있습니다. 정리 김개발 씨는 RoIAlign으로 바꾸고 다시 학습했습니다.
"와, 마스크가 훨씬 깔끔해졌어요!" RoIAlign은 Mask R-CNN의 핵심 기술 중 하나입니다. 작은 개선처럼 보이지만, 픽셀 단위 예측의 품질을 크게 높여줍니다.
여러분의 모델이 마스크 품질이 좋지 않다면, RoIAlign을 사용하고 있는지 확인해 보세요.
실전 팁
💡 - RoIAlign 사용 시 반드시 aligned=True 옵션을 켜세요
- sampling_ratio는 2~4 사이가 적절하며, 너무 크면 계산량만 증가합니다
- spatial_scale은 백본의 출력 stride에 맞게 정확히 설정해야 합니다
4. Mask Head 이해
모델 구조를 살펴보던 김개발 씨가 질문했습니다. "마스크는 어떻게 예측하나요?" 박시니어 씨가 다이어그램을 그리며 답했습니다.
"Mask Head가 담당해요. 작지만 강력한 네트워크죠."
Mask Head는 각 ROI에 대해 픽셀 단위 마스크를 예측하는 작은 FCN(Fully Convolutional Network)입니다. RoIAlign으로 추출된 14x14 특징 맵을 입력받아, 여러 개의 컨볼루션 레이어를 거친 뒤 28x28 크기의 이진 마스크를 출력합니다.
마치 저해상도 스케치를 받아서 고해상도 그림을 완성하는 화가처럼, 작은 특징 맵에서 정밀한 마스크를 생성합니다.
다음 코드를 살펴봅시다.
import torch
import torch.nn as nn
class MaskHead(nn.Module):
def __init__(self, in_channels=256, num_classes=80):
super().__init__()
# 4개의 conv 레이어 (특징 추출)
self.conv1 = nn.Conv2d(in_channels, 256, 3, padding=1)
self.conv2 = nn.Conv2d(256, 256, 3, padding=1)
self.conv3 = nn.Conv2d(256, 256, 3, padding=1)
self.conv4 = nn.Conv2d(256, 256, 3, padding=1)
# Deconv 레이어 (해상도 2배 증가: 14x14 -> 28x28)
self.deconv = nn.ConvTranspose2d(256, 256, 2, stride=2)
# 클래스별 마스크 예측 (각 클래스마다 독립적인 마스크)
self.mask_pred = nn.Conv2d(256, num_classes, 1)
def forward(self, x):
# x: (N, 256, 14, 14) - RoIAlign 출력
x = torch.relu(self.conv1(x))
x = torch.relu(self.conv2(x))
x = torch.relu(self.conv3(x))
x = torch.relu(self.conv4(x)) # (N, 256, 14, 14)
x = torch.relu(self.deconv(x)) # (N, 256, 28, 28)
masks = self.mask_pred(x) # (N, 80, 28, 28)
return masks # 각 클래스별 마스크
김개발 씨는 Mask R-CNN 코드를 읽다가 궁금해졌습니다. 분류와 박스는 FC(Fully Connected) 레이어로 예측하는데, 마스크는 어떻게 만들어질까요?
박시니어 씨가 설명하기 시작했습니다. "마스크는 특별해요.
픽셀 단위 예측이 필요하니까 FC 레이어를 쓸 수 없거든요." Mask Head의 역할 Mask Head는 각 ROI(Region of Interest)에서 추출된 특징으로부터 픽셀 단위 마스크를 생성하는 작은 네트워크입니다. 마치 화가가 스케치를 보고 세밀화를 그리는 것과 같습니다.
RoIAlign이 14x14 크기의 저해상도 특징 스케치를 제공하면, Mask Head는 이것을 28x28 크기의 고해상도 마스크로 완성합니다. 왜 Fully Convolutional인가? Mask Head는 FCN(Fully Convolutional Network) 구조를 사용합니다.
FC 레이어를 사용하면 공간 정보가 사라집니다. 이미지를 1차원 벡터로 펼치면 "어느 픽셀이 어디에 있었는지" 위치 정보가 손실됩니다.
하지만 마스크는 정확히 "어느 픽셀이 객체에 속하는지"를 알아야 합니다. 따라서 공간 구조를 유지하는 컨볼루션 레이어만 사용합니다.
네트워크 구조 Mask Head의 구조는 놀랍도록 단순합니다. 4개의 3x3 컨볼루션 레이어가 차례로 연결됩니다.
각 레이어는 256개의 채널을 유지하면서 특징을 정제합니다. 패딩을 1로 설정하여 크기가 줄어들지 않도록 합니다.
이 과정에서 14x14 크기는 그대로 유지되지만, 특징의 품질은 점점 좋아집니다. 다음으로 deconvolution(ConvTranspose2d) 레이어가 해상도를 2배로 늘립니다.
14x14가 28x28이 됩니다. 이것은 업샘플링의 일종으로, 학습 가능한 파라미터를 사용하여 저해상도를 고해상도로 변환합니다.
마지막으로 1x1 컨볼루션으로 클래스별 마스크를 예측합니다. 출력 채널이 num_classes(예: 80)개가 되어, 각 클래스마다 독립적인 28x28 마스크가 생성됩니다.
클래스별 마스크의 의미 여기서 중요한 점이 있습니다. Mask Head는 모든 클래스에 대한 마스크를 동시에 예측합니다.
사람 클래스 마스크, 자동차 클래스 마스크, 고양이 클래스 마스크 등 80개 클래스 전부 말이죠. 추론 시에는 분류 브랜치가 예측한 클래스에 해당하는 마스크만 선택해서 사용합니다.
예를 들어 어떤 ROI가 "자동차"로 분류되었다면, 80개 마스크 중 자동차 채널의 마스크만 가져옵니다. 이렇게 하면 각 클래스마다 최적화된 마스크를 학습할 수 있습니다.
손실 함수 Mask Head는 이진 크로스 엔트로피(Binary Cross Entropy) 손실을 사용합니다. 각 픽셀이 객체에 속하는지(1) 속하지 않는지(0)를 이진 분류합니다.
여기서 중요한 점은 정답 클래스의 마스크에 대해서만 손실을 계산한다는 것입니다. 만약 정답이 "사람"이면, 사람 채널의 마스크만 ground truth와 비교하고 나머지 79개 클래스는 무시합니다.
이렇게 하면 클래스 분류와 마스크 예측이 분리됩니다. 분류는 분류 브랜치가 담당하고, 마스크는 "주어진 클래스에서 어떤 픽셀이 속하는가"만 집중합니다.
왜 28x28인가? 박시니어 씨가 흥미로운 사실을 알려줬습니다. "28x28은 계산량과 품질의 절충안이에요." 더 큰 해상도(예: 56x56)를 사용하면 마스크가 더 정밀해지지만 계산량이 4배 증가합니다.
반대로 14x14를 그대로 사용하면 디테일이 부족합니다. 실험 결과 28x28이 최적의 균형점이었습니다.
추론 시에는 이 28x28 마스크를 원본 ROI 크기로 다시 확대합니다. 예를 들어 ROI가 100x80이면 28x28 마스크를 100x80으로 리사이즈하여 원본 이미지에 적용합니다.
코드 분석 위의 코드를 단계별로 살펴보겠습니다. 입력 x는 RoIAlign에서 나온 (N, 256, 14, 14) 특징입니다.
4개의 conv 레이어를 거치면서 채널은 256으로 유지되고 크기도 14x14로 유지됩니다. 각 레이어 후에 ReLU 활성화 함수를 적용합니다.
deconv 레이어는 stride=2로 설정되어 크기를 2배로 늘립니다. (N, 256, 28, 28)이 됩니다.
마지막 mask_pred는 1x1 컨볼루션으로 채널을 80개(클래스 수)로 변환합니다. 최종 출력은 (N, 80, 28, 28)입니다.
실무 활용 실제 프로젝트에서 Mask Head를 수정할 일이 있을까요? 작은 객체가 많은 데이터셋에서는 deconv를 한 번 더 추가하여 56x56 마스크를 생성할 수 있습니다.
반대로 빠른 추론이 필요하면 conv 레이어를 줄이거나 채널 수를 줄일 수 있습니다. 하지만 대부분의 경우 기본 설정으로도 충분한 성능을 냅니다.
주의사항 초보 개발자들이 흔히 하는 실수는 모든 클래스의 마스크에 손실을 적용하는 것입니다. 반드시 정답 클래스에 해당하는 마스크에만 손실을 계산해야 합니다.
그렇지 않으면 학습이 불안정해지고 성능이 크게 떨어집니다. Detectron2 같은 프레임워크는 이를 자동으로 처리하지만, 직접 구현할 때는 주의해야 합니다.
정리 김개발 씨는 Mask Head의 동작을 이해했습니다. "작은 네트워크지만 핵심 역할을 하네요!" Mask Head는 Mask R-CNN에서 Instance Segmentation을 가능하게 하는 핵심 컴포넌트입니다.
간단한 구조지만 효과적으로 픽셀 단위 마스크를 생성합니다. 이 원리를 이해하면 자신만의 세그멘테이션 모델을 설계할 수 있습니다.
실전 팁
💡 - Mask Head의 conv 레이어 개수는 4개가 표준이며, 이보다 적으면 성능이 떨어집니다
- 작은 객체가 많다면 출력 해상도를 56x56으로 늘려보세요
- 손실 계산 시 반드시 정답 클래스의 마스크에만 적용해야 합니다
5. Detectron2 프레임워크
김개발 씨는 논문을 읽고 Mask R-CNN을 직접 구현하려다가 막막함을 느꼈습니다. "이걸 다 구현해야 하나요?" 박시니어 씨가 웃으며 답했습니다.
"Detectron2를 사용하세요. Facebook AI Research에서 만든 강력한 프레임워크예요."
Detectron2는 Facebook AI Research(FAIR)에서 개발한 PyTorch 기반 객체 감지 라이브러리입니다. Mask R-CNN을 비롯한 최신 모델들이 구현되어 있으며, 모듈화된 설계로 쉽게 커스터마이징할 수 있습니다.
마치 레고 블록처럼 필요한 컴포넌트를 조합하여 자신만의 모델을 만들 수 있습니다. COCO 데이터셋 사전 학습 가중치도 제공되어 즉시 사용하거나 파인튜닝할 수 있습니다.
다음 코드를 살펴봅시다.
from detectron2.config import get_cfg
from detectron2.engine import DefaultTrainer, DefaultPredictor
from detectron2.data import MetadataCatalog, DatasetCatalog
from detectron2 import model_zoo
import cv2
# 1. 설정 초기화
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(
"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
))
# 2. 모델 가중치 로드 (COCO 사전 학습)
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(
"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
)
# 3. 추론 설정
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7 # 신뢰도 임계값
cfg.MODEL.DEVICE = "cuda" # GPU 사용
# 4. Predictor 생성 및 추론
predictor = DefaultPredictor(cfg)
image = cv2.imread("example.jpg")
outputs = predictor(image) # 한 줄로 추론 완료!
# 5. 결과 추출
instances = outputs["instances"].to("cpu")
boxes = instances.pred_boxes # 바운딩 박스
scores = instances.scores # 신뢰도
classes = instances.pred_classes # 클래스
masks = instances.pred_masks # 마스크
김개발 씨는 Mask R-CNN 논문을 3번이나 읽었습니다. RPN, RoIAlign, Mask Head까지 이론은 이해했지만, 이것을 실제로 구현하려니 막막했습니다.
수천 줄의 코드를 직접 작성해야 할까요? 박시니어 씨가 구원의 손길을 내밀었습니다.
"직접 구현할 필요 없어요. Detectron2를 쓰세요." Detectron2란 무엇인가? Detectron2는 Facebook AI Research에서 만든 최고 수준의 객체 감지 라이브러리입니다.
마치 요리할 때 모든 재료를 직접 재배하지 않고 마트에서 사는 것처럼, Detectron2는 검증된 구현을 제공합니다. Mask R-CNN, Faster R-CNN, RetinaNet, Panoptic Segmentation 등 최신 모델들이 이미 구현되어 있습니다.
무엇보다 PyTorch 기반이라 익숙하고 디버깅하기 쉽습니다. 또한 COCO, LVIS 같은 대규모 데이터셋에서 사전 학습된 가중치를 제공하여, 바로 사용하거나 자신의 데이터로 파인튜닝할 수 있습니다.
모듈화된 설계 Detectron2의 가장 큰 장점은 모듈화입니다. 레고 블록을 조립하듯이, 백본, RPN, ROI Head, 손실 함수 등을 자유롭게 조합할 수 있습니다.
ResNet-50 백본을 ResNet-101로 바꾸고 싶다면 설정 파일 한 줄만 수정하면 됩니다. FPN을 추가하거나 제거하는 것도 간단합니다.
커스텀 데이터셋을 등록하고, 새로운 데이터 증강을 추가하고, 손실 함수를 수정하는 것 모두 명확한 인터페이스를 통해 가능합니다. 전체 코드를 이해하지 못해도 필요한 부분만 수정할 수 있습니다.
설정 시스템 Detectron2는 YAML 기반 설정 시스템을 사용합니다. 모든 하이퍼파라미터, 모델 구조, 학습 설정이 YAML 파일에 정의되어 있습니다.
코드를 수정하지 않고 설정 파일만 바꾸면 다양한 실험을 할 수 있습니다. Model Zoo에서 제공하는 설정 파일을 가져와서 일부만 수정하면 됩니다.
예를 들어 배치 크기를 바꾸려면 cfg.SOLVER.IMS_PER_BATCH = 4처럼 한 줄만 추가하면 됩니다. 학습률도 cfg.SOLVER.BASE_LR = 0.001로 간단히 조정할 수 있습니다.
Model Zoo 박시니어 씨가 유용한 기능을 소개했습니다. "Model Zoo를 활용하세요." Model Zoo는 사전 학습된 모델 가중치와 설정 파일 모음입니다.
COCO 데이터셋에서 학습된 다양한 모델을 제공하며, 성능(AP)과 속도 정보도 함께 제공됩니다. 예를 들어 mask_rcnn_R_50_FPN_3x는 ResNet-50 백본에 FPN을 사용하고 3x 스케줄로 학습한 Mask R-CNN입니다.
이 모델의 가중치를 다운로드하여 바로 사용하거나, 자신의 데이터셋으로 파인튜닝할 수 있습니다. 추론 과정 위의 코드로 추론이 얼마나 간단한지 보여드리겠습니다.
먼저 설정을 초기화하고 Model Zoo에서 YAML 파일을 로드합니다. 다음으로 사전 학습된 가중치를 다운로드합니다.
get_checkpoint_url이 자동으로 URL을 제공하고 Detectron2가 알아서 다운로드합니다. DefaultPredictor를 생성하면 추론 준비가 완료됩니다.
이미지를 읽고 predictor(image)를 호출하면 끝입니다. 단 한 줄로 Mask R-CNN 추론이 완료됩니다.
결과는 딕셔너리 형태로 반환되며, instances에 모든 정보가 담겨 있습니다. 커스텀 데이터셋 등록 자신의 데이터로 학습하려면 어떻게 할까요?
Detectron2는 간단한 함수로 데이터셋을 등록할 수 있습니다. COCO 포맷이나 Pascal VOC 포맷이면 거의 자동으로 처리됩니다.
커스텀 포맷이어도 DatasetCatalog.register로 등록 함수를 제공하면 됩니다. 데이터셋 등록 후 설정에서 cfg.DATASETS.TRAIN = ("my_dataset",)처럼 지정하고, 클래스 개수 cfg.MODEL.ROI_HEADS.NUM_CLASSES를 맞춰주면 학습 준비가 완료됩니다.
학습 과정 학습도 놀랍도록 간단합니다. DefaultTrainer 클래스가 모든 것을 처리합니다.
데이터 로딩, 모델 학습, 검증, 체크포인트 저장, TensorBoard 로깅 등이 자동으로 이루어집니다. 커스텀 손실 함수나 평가 지표를 추가하려면 DefaultTrainer를 상속하여 필요한 메서드만 오버라이드하면 됩니다.
학습 중간에 자동으로 검증 세트에서 평가하고, 최고 성능 모델을 저장합니다. TensorBoard를 열면 손실 그래프, AP 변화 등을 실시간으로 확인할 수 있습니다.
실무 활용 사례 실제 프로젝트에서 Detectron2를 어떻게 활용할까요? 많은 기업과 연구자들이 Detectron2를 기반으로 프로젝트를 진행합니다.
의료 영상 분석, 자율주행, 산업 검사 등 다양한 분야에서 활용됩니다. 믿을 수 있는 구현과 높은 성능 덕분에 프로토타입부터 프로덕션까지 사용할 수 있습니다.
커스터마이징이 필요하면 원하는 부분만 수정하면 됩니다. 새로운 백본을 추가하거나, 손실 함수를 바꾸거나, 후처리 로직을 변경하는 것 모두 가능합니다.
주의사항 Detectron2를 사용할 때 주의할 점이 있습니다. 처음에는 설정 시스템이 복잡해 보일 수 있습니다.
YAML 파일 간 상속 관계를 이해하는 데 시간이 걸립니다. 공식 문서를 꼼꼼히 읽고, Model Zoo의 예제를 참고하는 것이 좋습니다.
또한 GPU 메모리를 많이 사용합니다. 배치 크기나 이미지 크기를 조절하여 메모리에 맞춰야 합니다.
OOM(Out Of Memory) 에러가 나면 cfg.SOLVER.IMS_PER_BATCH를 줄이세요. 정리 김개발 씨는 Detectron2로 몇 줄의 코드로 Mask R-CNN을 실행했습니다.
"이렇게 간단할 줄이야!" Detectron2는 복잡한 구현을 숨기고 사용하기 쉬운 인터페이스를 제공합니다. 논문의 이론을 이해했다면, Detectron2로 실제 프로젝트에 바로 적용할 수 있습니다.
여러분도 오늘 당장 시작해 보세요.
실전 팁
💡 - 공식 문서와 Colab 튜토리얼을 먼저 실행해보며 익히세요
- Model Zoo에서 비슷한 태스크의 설정 파일을 찾아 수정하는 것이 가장 빠릅니다
- GPU 메모리가 부족하면 배치 크기와 이미지 크기를 줄이세요
6. 커스텀 학습 실습
드디어 실전입니다. 김개발 씨는 자신의 데이터셋으로 Mask R-CNN을 학습시켜야 합니다.
"COCO 데이터가 아니라 우리 제품 사진인데, 어떻게 하죠?" 박시니어 씨가 단계별로 알려주기 시작했습니다.
커스텀 학습은 자신의 데이터셋에 Mask R-CNN을 적용하는 과정입니다. 데이터셋 준비, 어노테이션, Detectron2 등록, 설정 조정, 학습, 평가까지 전체 파이프라인을 구축합니다.
COCO 사전 학습 모델에서 시작하여 **전이 학습(Transfer Learning)**으로 적은 데이터로도 좋은 성능을 얻을 수 있습니다. 마치 요리사가 기본 레시피를 자신만의 맛으로 변형하는 것처럼, 사전 학습 모델을 자신의 도메인에 맞게 파인튜닝합니다.
다음 코드를 살펴봅시다.
from detectron2.data import DatasetCatalog, MetadataCatalog
from detectron2.engine import DefaultTrainer
from detectron2.config import get_cfg
from detectron2 import model_zoo
import os
# 1. 커스텀 데이터셋 로드 함수
def get_custom_dataset():
# COCO 포맷의 어노테이션 파일 로드
from detectron2.data.datasets import load_coco_json
return load_coco_json(
"annotations/instances_train.json",
"images/train/",
"custom_train"
)
# 2. 데이터셋 등록
DatasetCatalog.register("custom_train", get_custom_dataset)
MetadataCatalog.get("custom_train").set(
thing_classes=["product", "defect"] # 커스텀 클래스
)
# 3. 설정 초기화 (사전 학습 모델 기반)
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(
"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
))
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(
"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
)
# 4. 커스텀 설정
cfg.DATASETS.TRAIN = ("custom_train",)
cfg.DATASETS.TEST = ()
cfg.DATALOADER.NUM_WORKERS = 2
cfg.SOLVER.IMS_PER_BATCH = 2 # 배치 크기
cfg.SOLVER.BASE_LR = 0.00025 # 학습률
cfg.SOLVER.MAX_ITER = 3000 # 반복 횟수
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 2 # 클래스 개수
# 5. 학습 시작
os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train() # 학습 실행!
김개발 씨는 회사의 제품 검사 프로젝트에 투입되었습니다. 컨베이어 벨트 위의 제품 사진에서 불량 부위를 자동으로 찾아내야 합니다.
COCO 데이터셋에는 이런 데이터가 없습니다. 직접 데이터를 모으고 학습시켜야 합니다.
박시니어 씨가 체크리스트를 건넸습니다. "순서대로 따라 해봐요." 1단계: 데이터 수집 및 어노테이션 가장 먼저 데이터를 모아야 합니다.
제품 사진을 다양한 각도와 조명에서 수백 장 촬영합니다. 데이터가 많을수록 좋지만, 전이 학습을 활용하면 수백 장으로도 충분합니다.
중요한 것은 다양성입니다. 다양한 상황을 포함해야 모델이 일반화됩니다.
다음으로 어노테이션 작업입니다. 각 사진에서 객체의 윤곽선을 픽셀 단위로 그려야 합니다.
LabelMe, CVAT, Labelbox 같은 도구를 사용하면 편리합니다. 어노테이션은 시간이 오래 걸리는 작업이지만, 품질이 모델 성능을 좌우합니다.
어노테이션을 COCO 포맷으로 저장합니다. COCO 포맷은 JSON 파일로, 이미지 정보, 카테고리, 세그멘테이션 폴리곤 등을 포함합니다.
Detectron2는 COCO 포맷을 기본으로 지원하여 쉽게 로드할 수 있습니다. 2단계: 데이터셋 등록 어노테이션이 완료되면 Detectron2에 등록합니다.
DatasetCatalog.register 함수로 데이터셋을 등록합니다. 첫 번째 인자는 데이터셋 이름(예: "custom_train"), 두 번째 인자는 데이터를 로드하는 함수입니다.
load_coco_json을 사용하면 COCO 포맷 JSON을 자동으로 파싱합니다. MetadataCatalog에 클래스 이름을 등록합니다.
예를 들어 ["product", "defect"]처럼 자신의 클래스 목록을 지정합니다. 이것은 시각화할 때 클래스 이름을 표시하는 데 사용됩니다.
3단계: 설정 조정 이제 학습 설정을 조정합니다. 먼저 사전 학습 모델을 선택합니다.
COCO에서 학습된 mask_rcnn_R_50_FPN_3x를 로드합니다. 이 모델은 80개 클래스를 학습했지만, 마지막 레이어만 바꾸면 자신의 클래스 개수에 맞출 수 있습니다.
cfg.MODEL.ROI_HEADS.NUM_CLASSES를 자신의 클래스 개수로 설정합니다. 이렇게 하면 분류 레이어와 마스크 레이어가 자동으로 재초기화됩니다.
나머지 레이어는 COCO 가중치를 그대로 사용합니다. 이것이 전이 학습의 핵심입니다.
하이퍼파라미터 조정 박시니어 씨가 중요한 팁을 알려줍니다. "하이퍼파라미터가 성능을 크게 좌우해요." **학습률(BASE_LR)**은 너무 크면 학습이 불안정하고, 너무 작으면 느립니다.
사전 학습 모델을 파인튜닝할 때는 보통 0.00025 정도로 시작합니다. 처음부터 학습할 때보다 낮은 학습률을 사용합니다.
**배치 크기(IMS_PER_BATCH)**는 GPU 메모리에 따라 조정합니다. 메모리가 8GB라면 2~4 정도가 적당합니다.
배치 크기를 바꾸면 학습률도 비례하여 조정해야 합니다. **반복 횟수(MAX_ITER)**는 데이터셋 크기에 따라 다릅니다.
작은 데이터셋이면 3000~5000 정도면 충분합니다. TensorBoard로 손실을 모니터링하며 조정합니다.
4단계: 학습 실행 모든 준비가 끝났습니다. 학습을 시작합니다.
DefaultTrainer를 생성하고 trainer.train()을 호출하면 학습이 시작됩니다. 학습 중에는 자동으로 손실이 출력되고, 일정 주기마다 체크포인트가 저장됩니다.
cfg.OUTPUT_DIR에 모델 가중치와 로그가 저장됩니다. TensorBoard를 실행하면 실시간으로 손실 그래프를 볼 수 있습니다.
total_loss, loss_cls, loss_box_reg, loss_mask 등 각 손실이 개별적으로 표시됩니다. 손실이 수렴하는지, 과적합이 발생하는지 확인할 수 있습니다.
5단계: 평가 및 추론 학습이 끝나면 평가합니다. 테스트 데이터셋을 등록하고 cfg.DATASETS.TEST에 지정합니다.
DefaultPredictor로 추론을 수행하고 결과를 시각화합니다. Detectron2는 Visualizer 클래스로 바운딩 박스와 마스크를 이미지에 그려줍니다.
정량적 평가를 위해 COCOEvaluator를 사용하면 AP, AP50, AP75 등 COCO 메트릭을 계산할 수 있습니다. 이 지표로 모델 성능을 객관적으로 판단합니다.
과적합 방지 김개발 씨가 걱정했습니다. "데이터가 적으면 과적합이 생기지 않나요?" 맞습니다.
작은 데이터셋에서는 과적합이 흔합니다. 이를 방지하기 위해 데이터 증강을 활용합니다.
Detectron2는 랜덤 플립, 리사이즈, 컬러 지터 등 다양한 증강을 제공합니다. 커스텀 증강도 쉽게 추가할 수 있습니다.
또한 **조기 종료(Early Stopping)**를 사용합니다. 검증 세트의 성능이 더 이상 개선되지 않으면 학습을 멈춥니다.
Detectron2는 자동으로 최고 성능 모델을 저장하므로, 과적합된 모델을 사용할 걱정이 없습니다. 실무 경험 공유 박시니어 씨가 실전 경험을 나눴습니다.
"제조업체 프로젝트에서 제품 불량 검사 모델을 만들었어요." 데이터는 500장밖에 없었지만, COCO 사전 학습 모델로 시작하여 AP 70 이상의 성능을 얻었습니다. 핵심은 고품질 어노테이션과 적절한 데이터 증강이었습니다.
또한 클래스 불균형 문제를 해결하기 위해 불량 샘플을 더 자주 샘플링했습니다. 주의사항 커스텀 학습에서 흔히 하는 실수가 있습니다.
클래스 개수를 잘못 설정하거나, 데이터셋 경로를 틀리게 지정하는 경우입니다. 에러 메시지를 꼼꼼히 읽고 설정을 다시 확인하세요.
또한 어노테이션 품질을 소홀히 하면 아무리 학습해도 성능이 나오지 않습니다. 처음에 시간을 들여 정확히 어노테이션하는 것이 중요합니다.
정리 김개발 씨는 자신의 데이터로 Mask R-CNN을 성공적으로 학습시켰습니다. "생각보다 어렵지 않네요!" 커스텀 학습은 데이터 준비부터 평가까지 전체 파이프라인을 이해해야 합니다.
하지만 Detectron2 덕분에 복잡한 코드 구현 없이 설정만으로 해결할 수 있습니다. 여러분도 오늘 배운 내용으로 자신만의 Instance Segmentation 모델을 만들어 보세요.
실전 팁
💡 - 어노테이션 품질이 가장 중요합니다. 시간을 들여 정확히 작업하세요
- 작은 데이터셋에서는 반드시 전이 학습을 활용하세요
- TensorBoard로 손실을 모니터링하며 과적합 여부를 확인하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.