컴퓨터 비전과 관련해서 논문은 계속 읽고 있지만 직접 실습을 해보기 위해 colab을 사용해 보았다.
라이브러리는 detectron2를 사용했다.
# 현재 코랩의 PyTorch 버전에 맞는 detectron2 설치
import torch
TORCH_VERSION = ".".join(torch.__version__.split(".")[:2])
CUDA_VERSION = torch.__version__.split("+")[-1]
!pip install 'git+https://github.com/facebookresearch/detectron2.git'
detectron은 faster R-CNN부터 지원하는데, 원본 논문과는 약간 다르게 FPN이라는 기술이 추가된 faster R-CNN을 기본적으로 권장한다.
따라서 여기서 아이디어를 얻어 실습 주제를 정해보았다.
원 논문의 faster R-CNN VS FPN이 추가된 faster R-CNN
필요할 모듈들을 임포트했다.
from detectron2 import model_zoo
from detectron2.config import get_cfg
from detectron2.engine import DefaultPredictor
from detectron2.evaluation import COCOEvaluator, inference_on_dataset
from detectron2.data import build_detection_test_loader
필요한 두 가지 모델을 담기 위해 cfg_fpn, cfg_c4라는 변수를 각각 만들었다.
get_cfg()는 기본 설정 객체를 만드는 함수이다. 모델을 담을 빈 객체라고 생각하면 된다.
get_config_file()의 인자에 해당 모델의 이름을 정확히 입력해 모델의 구조와 학습 설정을 받아올 수 있다.
get_checkpoint_url()을 통해서는 가중치 값들을 가져온다.
# 1. 현대적 방식 (FPN 포함)
cfg_fpn = get_cfg()
cfg_fpn.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml"))
cfg_fpn.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml")
cfg_fpn.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
predictor_fpn = DefaultPredictor(cfg_fpn)
# 2. 원 논문 스타일 (FPN 제외, C4 구조)
cfg_c4 = get_cfg()
cfg_c4.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_50_C4_3x.yaml"))
cfg_c4.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_50_C4_3x.yaml")
cfg_c4.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
predictor_c4 = DefaultPredictor(cfg_c4)
코랩의 content폴더에 자신이 분석해보고 싶은 이미지를 넣는다.
나는 내가 찍었던 사진 16개를 입력으로 주었다.
경로설정에서 확장자는 자신의 파일에 맞게 바꿔준다.
import cv2
import os
import numpy as np
import glob
from google.colab.patches import cv2_imshow
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog
# 1. 경로 설정
input_path = "/content/test/*.jpeg" # 확장자가 png라면 *.png로 변경
output_path = "/content/comparison_results/"
os.makedirs(output_path, exist_ok=True)
# 2. 메타데이터 (COCO 기준 레이블 이름 사용)
metadata = MetadataCatalog.get("coco_2017_val")
# 3. 이미지 루프 실행
image_files = glob.glob(input_path)
print(f"총 {len(image_files)}개의 이미지를 처리합니다.")
for img_file in image_files:
# 이미지 로드
im = cv2.imread(img_file)
if im is None: continue
# --- FPN 모델 추론 및 시각화 ---
outputs_fpn = predictor_fpn(im)
v_fpn = Visualizer(im[:, :, ::-1], metadata=metadata, scale=0.8)
out_fpn = v_fpn.draw_instance_predictions(outputs_fpn["instances"].to("cpu"))
img_fpn = out_fpn.get_image()[:, :, ::-1]
# --- C4 모델 추론 및 시각화 ---
outputs_c4 = predictor_c4(im)
v_c4 = Visualizer(im[:, :, ::-1], metadata=metadata, scale=0.8)
out_c4 = v_c4.draw_instance_predictions(outputs_c4["instances"].to("cpu"))
img_c4 = out_c4.get_image()[:, :, ::-1]
# --- 결과 합치기 (왼쪽 FPN / 오른쪽 C4) ---
# 두 이미지의 크기가 같으므로 옆으로 붙임 (Horizontal Stack)
combined_result = np.hstack((img_fpn, img_c4))
# 상단에 라벨 텍스트 추가 (선택 사항)
cv2.putText(combined_result, "Modern FPN", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
cv2.putText(combined_result, "Original C4", (img_fpn.shape[1] + 10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
# 결과 저장 및 출력
file_name = os.path.basename(img_file)
save_file = os.path.join(output_path, f"compare_{file_name}")
cv2.imwrite(save_file, combined_result)
print(f"Saved: {file_name}")
결과는 아래처럼 두 모델을 통과한 이미지를 서로 붙여 비교하기 편하게 출력된다.
아래의 사진들은 16개의 결과 중 일부이다.





실험 결과, 내가 입력으로 넣었던 이미지들에 대해 느낀 점은 아래와 같다.
<FPN대비 C4의 장/단점>
C4에서는 같은 대상에 중복으로 box 처리 하는 모습이 보임 (img 1,5,9,11,15)
C4가 더 많은 대상을 더 높은 확률로 예측 (img 3,5,6,9,10,11,15)
C4는 잘못된 예측에 높은 확률을 부여한 경우도 있다 (img 13)
어떤 이미지가 몇 번 이미지인지는 이 글에서 얘기하지 않지만,
해당 특징이 보였던 이미지의 개수만 대략 판단하는 용도로 이해하면 될 것 같다.
FPN은 작은 물체 탐지에 강점이 있다고 하는데, 크게 느끼지 못했다.
오히려 C4에서 중복 박스 문제만 해결된다면 더 좋다고 생각이 들었다.
'AI > 컴퓨터비전(CV)' 카테고리의 다른 글
| [CV 논문] You Only Look Once:Unified, Real-Time Object Detection (0) | 2026.02.10 |
|---|---|
| [CV 논문] SSD: Single Shot MultiBox Detector (0) | 2026.02.09 |
| [CV 논문] Faster R-CNN: Towards Real-Time Object Detectionwith Region Proposal Networks (1) | 2026.01.12 |
| [CV 논문] Fast R-CNN (0) | 2026.01.10 |
| [CV 논문] Rich feature hierarchies for accurate object detection and semantic segmentation (1) | 2026.01.09 |