이 글에서는 파이썬 3.x(및 그 이전 버전) 환경에서 컨볼루션(convolution)의 개념과 구현 방법을 알아보겠습니다. 컨볼루션은 신경망(Neural Networks)과 특징 추출(Feature Extraction) 분야의 핵심 개념 중 하나로, 특히 CNN(합성곱 신경망)을 이해하는 데 필수적인 내용입니다.
권장 IDE − Jupyter Notebook
사전 준비 사항 − NumPy 설치, Matplotlib 설치
설치 방법
아직 필요한 라이브러리가 설치되어 있지 않다면, 아래 명령어로 간단히 설치할 수 있습니다.
>>> pip install numpy >>> pip install matplotlib
컨볼루션이란?
컨볼루션은 이미지에 적용하여 특징(feature)을 추출하는 대표적인 연산 방식입니다. 커널(kernel) 또는 좌표 행렬이라고 불리는 작은 크기의 행렬을 마치 슬라이딩 윈도우처럼 이미지 위를 이동시키며 곱셈과 덧셈을 수행하는 것이 핵심 원리입니다.
컨볼루션 좌표 행렬에 담긴 값에 따라 이미지에서 특정 패턴이나 특징을 선택적으로 감지할 수 있습니다. 예를 들어, 적절히 설계된 커널을 사용하면 이미지 속 가로 방향 경계(edge)와 세로 방향 경계(edge)를 효과적으로 찾아낼 수 있습니다.
그럼 지금부터 실제 코드 구현 과정을 살펴보겠습니다.
예제 코드
아래 예제에서는 세 개의 샘플 이미지에 가로/세로 경계 검출용 커널을 적용하고, 각 이미지의 특징 점수(feature score)를 계산합니다.
import numpy as np
from matplotlib import pyplot
# 이미지 초기화
img1 = np.array([np.array([100, 100]), np.array([80, 80])])
img2 = np.array([np.array([100, 100]), np.array([50, 0])])
img3 = np.array([np.array([100, 50]), np.array([100, 0])])
# 가로 경계 검출용 좌표 행렬 정의
coordinates_horizontal = np.array([np.array([3, 3]), np.array([-3, -3])])
print(coordinates_horizontal, '가로 경계(end points)를 검출하기 위한 좌표 행렬')
# 세로 경계 검출용 좌표 행렬 정의
coordinates_vertical = np.array([np.array([3, -3]), np.array([3, -3])])
print(coordinates_vertical, '세로 경계(end points)를 검출하기 위한 좌표 행렬')
# 요소별 곱셈(element-wise multiplication) 후 총합을 계산하는 함수
def apply_coordinates(img, coordinates):
return np.sum(np.multiply(img, coordinates))
# img1 시각화
pyplot.imshow(img1)
pyplot.axis('off')
pyplot.title('sample 1')
pyplot.show()
# image1의 가로/세로 특징 확인
print('가로 경계 특징 점수:', apply_coordinates(img1, coordinates_horizontal))
print('세로 경계 특징 점수:', apply_coordinates(img1, coordinates_vertical))
# img2 시각화
pyplot.imshow(img2)
pyplot.axis('off')
pyplot.title('sample 2')
pyplot.show()
# image2의 가로/세로 특징 확인
print('가로 경계 특징 점수:', apply_coordinates(img2, coordinates_horizontal))
print('세로 경계 특징 점수:', apply_coordinates(img2, coordinates_vertical))
# img3 시각화
pyplot.imshow(img3)
pyplot.axis('off')
pyplot.title('sample 3')
pyplot.show()
# image3의 가로/세로 특징 확인
print('가로 경계 특징 점수:', apply_coordinates(img3, coordinates_horizontal))
print('세로 경계 특징 점수:', apply_coordinates(img3, coordinates_vertical))
출력 결과

실행 결과를 보면, 각 샘플 이미지에 따라 가로 또는 세로 경계 특징 점수의 차이가 나타나는 것을 확인할 수 있습니다. 이처럼 커널의 값과 이미지 픽셀값의 조합에 따라 어떤 방향의 특징이 강하게 검출되는지 직관적으로 파악할 수 있습니다.
결론
이 글에서는 파이썬 3.x 환경에서 컨볼루션의 기본 개념을 소개하고, NumPy와 Matplotlib를 활용해 이미지의 가로/세로 경계 특징을 검출하는 전체 구현 과정을 살펴보았습니다. 컨볼루션은 CNN 모델의 핵심 동작 원리이므로, 이번 예제를 통해 커널이 이미지의 패턴을 어떻게 인식하는지 감을 잡았다면 앞으로 딥러닝 학습에 큰 도움이 될 것입니다. 다음 단계로는 다양한 크기의 커널을 실험해 보거나, 실제 이미지 데이터에 컨볼루션을 적용해 보는 것을 추천합니다.