본문 바로가기
카테고리 없음

PS(Problem Solving)에서의 컨볼루션과 컴퓨터 비전(CV, Computer Vision)에서의 컨볼루션

by redcubes 2025. 3. 31.

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(nlog⁡n)O(n \log n) 으로 개선 가능

3. FFT 컨볼루션 핵심 아이디어

  • 다항식을 점-값 형태로 바꿔서 곱한 후, 다시 계수로 되돌림
  1. A(x)A(x), B(x)B(x) 를 FFT로 변환 → A(ωk)A(\omega^k), B(ωk)B(\omega^k)
  2. 점마다 곱하기 → C(ωk)=A(ωk)⋅B(ωk)C(\omega^k) = A(\omega^k) \cdot B(\omega^k)
  3. 역 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://youtu.be/KuXjwB4LzSA

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. 시간 영역에서의 컨볼루션

신호 x(t)와 필터 h(t)가 있을 때,

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 하면:

  • 입력 x(t)X(f)
  • 필터 h(t)H(f)
  • 출력 y(t)Y(f)

그런데 놀랍게도,

Y(f)=X(f)⋅H(f)Y(f) = X(f) \cdot H(f)

즉, 시간 영역의 복잡한 컨볼루션이, 주파수 영역에서는 단순한 곱셈이 됨.


2-3. 왜 이게 중요할까?

  • 시간 영역에서 컨볼루션은 계산량이 많다. (O(n2))
  • 주파수 영역에서는 곱셈만 하니까 빠르다.
    **FFT를 이용하면 O(nlogn)**으로 줄일 수 있음

결국:

컨볼루션을 빠르게 계산하고 싶다면 → FFT로 바꾸고, 곱하고, 다시 돌려라(IFFT)


3. 🎧 실제 예시: 소리 필터링

  • 어떤 음성 신호에 "에코 효과"를 주고 싶다.
  • 이건 일종의 필터를 적용하는 것 → 컨볼루션
  • 그런데 긴 소리 신호에서 컨볼루션을 직접 하면 느리다.
  • 그래서 FFT로 바꿔서, 주파수 곱셈으로 필터링하고, 다시 원래로 바꾸면 훨씬 빠르다.

4. 🧠 정리

구분 시간 영역 주파수 영역

입력 x(t) X(f)
필터 h(t) H(f)
컨볼루션 (xh)(t) X(f)H(f)
계산 복잡도 느림 O(n2) 빠름 O(nlogn) (FFT 활용)

💡 추가 팁: 이미지 처리에서도 동일

  • 이미지의 경계선 검출 (Sobel 필터 등)도 컨볼루션으로 구현됨
  • 큰 이미지에 고해상도 필터를 적용할 때 → FFT 기반 컨볼루션 사용하면 훨씬 빠름

원하면 FFT 컨볼루션을 실제 코드로 보여주거나, 이미지/소리 예시로 이어서 설명해줄 수도 있다.
계속 이어서 해볼까?