PS(Problem Solving)에서의 컨볼루션과 컴퓨터 비전(CV, Computer Vision)에서의 컨볼루션은 이름은 같지만 목적과 구현이 꽤 다릅니다.
🎯 핵심 비교 요약
항목
항목 | PS에서의 컨볼루션 | CV에서의 컨볼루션 |
목적 | 수열/다항식 연산, 경우의 수 계산, 패턴 매칭 등 | 이미지 필터링, 특징 추출, 패턴 인식 |
수학적 정의 | 선형 컨볼루션 (다항식 곱셈과 유사) | 2D 필터 커널을 슬라이딩하며 합성곱 |
연산 대상 | 1차원 수열 (또는 다항식) | 2차원 행렬 (이미지) |
연산 방식 | 전 수열에 걸쳐 계산 (global) | 커널을 국소 영역에 적용 (local) |
알고리즘 | FFT로 고속화 | CNN 등에서 커널 학습 |
대표 응용 | 조합/경우의 수 문제, 문자열 패턴 매칭 | 엣지 검출, 블러링, CNN 이미지 분류 |
🔍 구체적인 차이
1. 연산 대상의 차이
- PS: 주로 1차원 수열 A=[a0,a1,...,an]A = [a_0, a_1, ..., a_n], B=[b0,b1,...,bm]B = [b_0, b_1, ..., b_m]을 다룹니다.
- CV: 일반적으로 2차원 이미지 행렬에 대해, 작은 **커널(kernel)**을 슬라이딩하며 처리합니다.
2. 연산 방식의 차이
🧮 PS에서의 컨볼루션 (선형 컨볼루션)
Ck=∑i=0kai⋅bk−iC_k = \sum_{i=0}^{k} a_i \cdot b_{k - i}
- 전체 수열에 대해 전역적으로 계산
- 다항식 곱셈과 거의 동일한 의미
- 결과의 길이는 n+m+1n + m + 1
🧾 CV에서의 컨볼루션
C(x,y)=∑i,jK(i,j)⋅I(x+i,y+j)C(x, y) = \sum_{i,j} K(i,j) \cdot I(x+i, y+j)
- II: 입력 이미지, KK: 커널
- 작은 커널을 이미지 위에서 슬라이딩하며 지역적으로 곱셈과 덧셈 수행
- 결과는 원본과 동일한 크기 또는 축소된 크기의 이미지
🧠 예시 비교
PS 예시
- A=[1,2,3]A = [1, 2, 3], B=[4,5,6]B = [4, 5, 6]
- 결과: [4,13,28,27,18][4, 13, 28, 27, 18]
- 사용 목적: 경우의 수 누적, 다항식 곱셈
CV 예시 (엣지 검출)
입력 이미지:
[[10, 10, 10],
[10, 50, 10],
[10, 10, 10]]
엣지 필터:
[[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]]
- 출력 결과: 중앙값만 높고 주변은 낮아짐 → 엣지(경계)를 강조함
- 사용 목적: 이미지의 특징 강조
📌 용어 혼동 주의
- CV에서는 컨볼루션이 실제로는 Cross-Correlation과 더 유사한 연산입니다. (뒤집지 않음)
- PS에서는 수학적 정의에 따라 실제로 수열을 뒤집어 곱하는 것이 컨볼루션입니다.
🧪 직관적인 비유
- PS의 컨볼루션: 두 음악 파형을 합쳐서 하나의 믹스 트랙을 만드는 것
→ 전체적으로 퍼짐 - CV의 컨볼루션: 이미지를 확대경으로 보며 한 부분만 강조하는 것
→ 국소적으로 작동
🧠 CNN에서의 컨볼루션 학습 원리
1. 컨볼루션이란?
- 이미지에 **필터(커널)**를 적용하여 특정한 특징(엣지, 텍스처 등)을 추출하는 연산
- 예시로, 3×3 필터를 입력 이미지에 슬라이딩하며 점곱(sum of element-wise products)을 수행
💡 예를 들어 수직 엣지를 검출하는 필터는 다음과 같음:
[-1 0 1]
[-2 0 2]
[-1 0 1]
2. CNN에서 필터는 어떻게 학습될까?
- 필터의 값은 초기에는 랜덤
- **역전파(Backpropagation)**를 통해 손실 함수에 따라 필터 값이 점차 조정됨
- 예를 들어, 개를 잘 분류하기 위한 엣지/질감 특징을 자동으로 학습하게 됨
💡 인간이 직접 필터를 설계하지 않아도, 신경망이 중요한 특징을 자동으로 학습한다는 점이 핵심!
3. Stride, Padding 등의 개념
- Stride: 필터가 얼마나 건너뛰며 이동하는지
- Padding: 입력의 경계 처리 (정보 손실 방지)
⚙️ PS (Programming/Problem Solving)에서의 FFT 컨볼루션 구현
1. 문제 상황
- A와 B 두 배열이 주어졌을 때, C[k]=∑i+j=kA[i]⋅B[j]C[k] = \sum_{i+j=k} A[i] \cdot B[j] 를 계산
- 즉, 다항식 곱셈 혹은 컨볼루션 문제
2. Naive 방식 vs FFT 방식
- Naive 방식: O(n2)O(n^2)
- FFT를 이용하면 O(nlogn)O(n \log n) 으로 개선 가능
3. FFT 컨볼루션 핵심 아이디어
- 다항식을 점-값 형태로 바꿔서 곱한 후, 다시 계수로 되돌림
- A(x)A(x), B(x)B(x) 를 FFT로 변환 → A(ωk)A(\omega^k), B(ωk)B(\omega^k)
- 점마다 곱하기 → C(ωk)=A(ωk)⋅B(ωk)C(\omega^k) = A(\omega^k) \cdot B(\omega^k)
- 역 FFT로 계수 복원 → C(x)C(x)
💡 이 과정을 통해 실제 배열 간의 컨볼루션이 빠르게 수행됨!
4. Python 또는 C++ 예시 코드
import numpy as np
def fft_convolve(a, b):
size = len(a) + len(b) - 1
n = 1 << (size - 1).bit_length() # 최소 2의 제곱수로 패딩
A = np.fft.fft(a, n)
B = np.fft.fft(b, n)
C = A * B
return np.fft.ifft(C).real.round().astype(int)[:size]
🔄 CNN과 FFT 컨볼루션의 연결고리
항목 CNN에서의 컨볼루션 PS에서의 FFT 컨볼루션
입력 | 이미지(2D 텐서) | 숫자 배열 또는 다항식 계수 |
필터 | 학습 가능한 파라미터 | 고정된 연산 |
목적 | 특징 추출 | 곱셈 연산 최적화 |
계산 방식 | 시간 영역에서 직접 연산 | 주파수 영역으로 변환 후 연산 |
FFT 활용 여부 | 일부 고속 CNN 구현에서 사용 가능 | 주 목적 |
🔍 마무리 요약
- CNN은 컨볼루션 필터를 학습하여 이미지에서 유용한 특징을 추출
- PS에서는 FFT를 사용해 수학적으로 동일한 컨볼루션 연산을 빠르게 수행
- 둘 모두 선형 필터링이라는 동일한 수학적 원리를 기반으로 동작하며, 활용 목적이 다를 뿐임
필요하다면 HTML 블로그 포스트 형식이나 Mermaid.js 기반 시각화 예시도 같이 드릴 수 있어요. 혹시 원하시나요?
https://namu.wiki/w/%ED%95%A9%EC%84%B1%EA%B3%B1?from=%EC%BB%A8%EB%B3%BC%EB%A3%A8%EC%85%98
합성곱
컨볼루션 정식 번역명칭은 합성곱이지만 이쪽이 더 많이 쓰인다. / convolution / 合 成 곱 합성곱에
namu.wiki
https://developer-lionhong.tistory.com/28
[OpenCV] 캐니 에지 검출(Canny edge detection)
개요 살면서 보호색이 뛰어난 동물들이나 곤충들을 본 적 있을 것입니다. 이들은 자신의 주변 환경과 비슷한 색이나 밝기를 가지고 있어서 사람 눈으로 잘 인식할 수 없을 때가 있죠. 이렇게 사
developer-lionhong.tistory.com
이번에는 **컨볼루션(convolution)**과 **FFT(Fast Fourier Transform)**를 서로 어떻게 연결되는지, 수학적으로는 깊이 있게, 그러나 직관적으로는 쉽게 설명해보겠다. 이 둘은 사실 매우 밀접하게 연결되어 있다.
🎯 핵심 요약
- 컨볼루션: 입력 데이터(예: 이미지, 소리)에 어떤 패턴(필터, 커널)을 "겹쳐서 계산"하는 것
- FFT: 데이터를 주파수 성분으로 바꿔서, 시간 영역의 연산을 주파수 영역에서 더 빠르게 할 수 있게 함
- 결론:
"시간 영역(Time Domain)의 컨볼루션은 주파수 영역(Frequency Domain)의 곱셈(Multiplication)과 같다."
즉,x∗h→FFTX(f)⋅H(f)x * h \quad \xrightarrow{\text{FFT}} \quad X(f) \cdot H(f)
1. 🎨 직관적 비유: “빵 반죽(시간 영역) vs 반죽 재료(주파수 영역)”
- 컨볼루션은 마치 빵 반죽을 손으로 주무르면서 모양을 바꾸는 것
(입력 데이터를 필터로 변형) - 그런데 FFT는 뭐냐면…
이 반죽을 밀가루, 설탕, 이스트처럼 **재료(=주파수)**로 완전히 분해해서 계산하는 방법임
👉 즉, 원래 시간에서 복잡한 계산을 안 하고,
재료 단위로 계산한 다음, 다시 합치면(=IFFT), 같은 결과를 얻을 수 있음
2. 📐 수학적 정리 (쉬운 수식 포함)
2-1. 시간 영역에서의 컨볼루션
신호 와 필터 가 있을 때,
y(t)=(x∗h)(t)=∫−∞∞x(τ)⋅h(t−τ) dτy(t) = (x * h)(t) = \int_{-\infty}^{\infty} x(\tau) \cdot h(t - \tau) \, d\tau
시간이동시키면서 곱하고 적분한다는 뜻이다.
2-2. 주파수 영역으로 변환
이걸 Fourier Transform 하면:
- 입력
- 필터
- 출력
그런데 놀랍게도,
Y(f)=X(f)⋅H(f)Y(f) = X(f) \cdot H(f)
즉, 시간 영역의 복잡한 컨볼루션이, 주파수 영역에서는 단순한 곱셈이 됨.
2-3. 왜 이게 중요할까?
- 시간 영역에서 컨볼루션은 계산량이 많다. ()
- 주파수 영역에서는 곱셈만 하니까 빠르다.
**FFT를 이용하면 **으로 줄일 수 있음
결국:
컨볼루션을 빠르게 계산하고 싶다면 → FFT로 바꾸고, 곱하고, 다시 돌려라(IFFT)
3. 🎧 실제 예시: 소리 필터링
- 어떤 음성 신호에 "에코 효과"를 주고 싶다.
- 이건 일종의 필터를 적용하는 것 → 컨볼루션
- 그런데 긴 소리 신호에서 컨볼루션을 직접 하면 느리다.
- 그래서 FFT로 바꿔서, 주파수 곱셈으로 필터링하고, 다시 원래로 바꾸면 훨씬 빠르다.
4. 🧠 정리
구분 시간 영역 주파수 영역
입력 | ||
필터 | ||
컨볼루션 | ||
계산 복잡도 | 느림 | 빠름 (FFT 활용) |
💡 추가 팁: 이미지 처리에서도 동일
- 이미지의 경계선 검출 (Sobel 필터 등)도 컨볼루션으로 구현됨
- 큰 이미지에 고해상도 필터를 적용할 때 → FFT 기반 컨볼루션 사용하면 훨씬 빠름
원하면 FFT 컨볼루션을 실제 코드로 보여주거나, 이미지/소리 예시로 이어서 설명해줄 수도 있다.
계속 이어서 해볼까?