Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 배우는 합성곱(Convolution): CNN의 핵심 원리와 OpenCV 구현 예제

이미지 인식은 과거에 선형 회귀(linear regression)나 유사도 비교와 같은 훨씬 단순한 방법으로 수행되었습니다. 그 결과는 당연히 만족스럽지 못했으며, 손으로 쓴 알파벳을 인식하는 간단한 작업조차 어려웠습니다. 합성곱 신경망(CNN, Convolutional Neural Network)은 인간의 뇌가 이미지를 지각할 때 일어나는 신경 활동을 낮은 연산 비용으로 느슨하게 모방함으로써, 기존의 전통적인 방식보다 한 단계 발전된 접근법을 제공합니다.

합성곱 신경망(CNN) 개요

파이썬으로 배우는 합성곱(Convolution): CNN의 핵심 원리와 OpenCV 구현 예제

사람이 다양한 사물을 인식하는 방식과 매우 유사하게, 컴퓨터 알고리즘 역시 입력을 일반화하고 한 번도 본 적 없는 이미지에 대해 판단을 내릴 수 있기까지 수백만 장의 이미지를 학습해야 합니다.

컴퓨터는 모든 이미지를 픽셀(pixel)이라 불리는 2차원 숫자 배열로 인식합니다. 이미지 속 사물을 식별하기 위해 컴퓨터는 특수한 형태의 인공 신경망, 즉 합성곱 신경망(CNN)을 사용하며, 'CNN'이라는 이름은 네트워크에서 가장 중요한 연산 중 하나인 합성곱(convolution)에서 유래했습니다.

합성곱 신경망에서 각 층(layer)은 너비(width), 높이(height), 깊이(depth)로 구성됩니다. CNN의 핵심인 합성곱은 두 함수를 결합하여 새로운 함수를 만드는, 즉 두 정보 집합을 병합하는 연산입니다. 이미지 합성곱의 경우 이를 두 행렬을 요소별로 곱한 뒤 그 결과를 모두 더하는 방식으로 이해할 수 있습니다.

이미지 처리에서 합성곱은 다음과 같은 3단계 절차로 진행됩니다.

  • 입력 이미지를 가져옵니다.

  • 입력 이미지에 적용할 커널(kernel) 행렬을 준비합니다.

  • 입력 이미지와 커널을 합성곱한 결과를 저장할 최종 출력 이미지를 생성합니다.

아래는 OpenCV를 사용해 소벨 필터(Sobel filter)를 구현한 간단한 예제입니다. 소벨 필터는 에지 검출(edge detection)에 널리 사용되는 대표적인 이미지 처리 필터입니다.

예제 코드

import cv2
import numpy as np

img = cv2.imread('beach.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY).astype(float)

edge_x = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
edge_y = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3)
edge = np.sqrt(edge_x ** 2 + edge_y ** 2)

# 이미지는 0~255 색상 공간에 맞도록
# 정규화할 수 있습니다.
cv2.imwrite('beach_convol.jpg', edge)

코드 설명

위 코드는 먼저 컬러 이미지를 그레이스케일로 변환한 뒤, x축 방향과 y축 방향의 기울기를 각각 계산합니다. 이후 두 방향의 기울기 값을 제곱하여 더하고 제곱근을 취함으로써 최종적인 에지 강도(magnitude)를 구합니다. 그 결과, 이미지 속 객체의 윤곽선이 뚜렷하게 드러난 출력 이미지를 얻을 수 있습니다.

입력 이미지

파이썬으로 배우는 합성곱(Convolution): CNN의 핵심 원리와 OpenCV 구현 예제

출력 이미지

파이썬으로 배우는 합성곱(Convolution): CNN의 핵심 원리와 OpenCV 구현 예제