Max Pooling & Average Pooling 함수 구현

Hot potato·2025년 1월 25일

AI 비전 컴퓨팅

목록 보기
10/13

Pooling 기법

Convolutional layer에서 추출된 feature map의 크기가 너무 커지게 되면 연산량이 급증하여 학습 자체가 불가능해질 수 있기 때문에, pooling layer (풀링층)에서 feature map의 크기를 줄인다

📌 Pooling 특징

  • 보통 stride = 2, filter(pool) size = 2를 사용하여 이를 통해 입력으로 들어오는 이미지의 높이/ 너비를 절반으로 줄인다
  • padding은 거의 사용하지 않는다
  • 입력 이미지 채널과 풀링을 통해 나온 feature map의 채널 수는 같다

1. Max Pooling

같은 색깔로 칠해져있는 칸에서 가장 큰 값을 리턴한다.

import cv2
import numpy as np
from google.colab.patches import cv2_imshow  # Colab 전용

# Max Pooling 함수 정의
def max_pooling(img, pool_size=2, stride=2):
    """
    Max Pooling 구현.

    Parameters:
        img (ndarray): 입력 2D 배열 (그레이스케일 이미지).
        pool_size (int): 풀링 커널 크기 (기본값: 2).
        stride (int): 풀링 스트라이드 크기 (기본값: 2).

    Returns:
        ndarray: Max Pooling 결과 이미지.
    """
    height, width = img.shape
    out_h = (height - pool_size) // stride + 1
    out_w = (width - pool_size) // stride + 1

    out_img = np.zeros((out_h, out_w), dtype=np.uint8)

    for y in range(out_h):
        for x in range(out_w):
            out_img[y, x] = np.max(
                img[y * stride : y * stride + pool_size,
                    x * stride : x * stride + pool_size]
            )
    
    return out_img

# 이미지 불러오기
img_path = '/content/sample_data/flower.jpg'  # 이미지 경로
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)  # 그레이스케일로 읽기

# Max Pooling 적용
pooled_img = max_pooling(img, pool_size=2, stride=2)

# 결과 출력
print("원본 이미지 크기:", img.shape)
print("Max Pooling 결과 이미지 크기:", pooled_img.shape)

print("원본 이미지")
cv2_imshow(img)

print("Max Pooling 적용 결과")
cv2_imshow(pooled_img)

✅ 공간적 크기가 줄어든 걸 확인할 수 있다!!


2. Average Pooling

같은 색깔로 칠해져 있는 칸의 평균값을 리턴한다

import cv2
import numpy as np
from google.colab.patches import cv2_imshow  # Colab 전용

# Average Pooling 함수 정의
def average_pooling(img, pool_size=2, stride=2):
    """
    Average Pooling 구현.

    Parameters:
        img (ndarray): 입력 2D 배열 (그레이스케일 이미지).
        pool_size (int): 풀링 커널 크기 (기본값: 2).
        stride (int): 풀링 스트라이드 크기 (기본값: 2).

    Returns:
        ndarray: Average Pooling 결과 이미지.
    """
    height, width = img.shape
    out_h = (height - pool_size) // stride + 1
    out_w = (width - pool_size) // stride + 1

    out_img = np.zeros((out_h, out_w), dtype=np.uint8)

    for y in range(out_h):
        for x in range(out_w):
            # 영역 내 평균 계산
            out_img[y, x] = np.mean(
                img[y * stride : y * stride + pool_size,
                    x * stride : x * stride + pool_size]
            )
    
    return out_img

# 이미지 불러오기
img_path = '/content/sample_data/cat.jpg'  # 이미지 경로
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)  # 그레이스케일로 읽기

# Average Pooling 적용
pooled_img = average_pooling(img, pool_size=2, stride=2)

# 결과 출력
print("원본 이미지 크기:", img.shape)
print("Average Pooling 결과 이미지 크기:", pooled_img.shape)

print("원본 이미지")
cv2_imshow(img)

print("Average Pooling 적용 결과")
cv2_imshow(pooled_img)

✅ 공간적 크기가 줄어든 걸 확인할 수 있다!! (max pooling이랑 average pooling이랑 같은 사진을 썻더니 같은 값이 나와서;; 사진 교체)

profile
결국 난 잘될사람🍀 아자아자🥔

0개의 댓글