볼륨의 따른 컨볼루션

  • 컨볼루션 연산을 RGB 이미지에서 수행한다면 widthheight3 크기의 데이터를 연산할 것임
  • 필터도 마찬가지로 333 처럼 3차원 행렬이여야 함

def conv3d(data: np.ndarray, filters: np.ndarray, stride: int = 1) -> np.ndarray:
    data_h, data_w, data_d = data.shape
    filter_h, filter_w, filter_d = filters.shape
    assert data_d == filter_d, "Data and filter depth must be the same"

    output_h = ((data_h - filter_h) // stride) + 1
    output_w = ((data_w - filter_w) // stride) + 1
    output = np.zeros((output_h, output_w))

    for i in range(output_h):
        for j in range(output_w):
            for k in range(filter_h):
                for l in range(filter_w):
                    for m in range(filter_d):
                        output[i, j] += data[i * stride + k, j * stride + l, m] * filters[k, l, m]
    return output
  • 필터와 데이터의 depth 는 같아야한다.
  • 3d 연산의 이점
    • 특정 채널의 엣지만 검출하려면 해당 채널의 필터를 제외한 필터의 값을 0으로 만들면 된다.
    • numpy 의 벡터화 기능을 사용할 수 있으므로 연산이 빨라진다.

여러개의 필터

  • 수직, 수평, 45도, 70도의 엣지를 모두 검출하고 싶다면?
  • 6x6x3 의 데이터를 수평 엣지 검출 필터 3x3x3 와 연산하면 4x4x1 의 결과가 나온다.
  • 여러가지 종류의 필터로 연산을 하여 4x4 의 결과를 쌓으면 4x4xN 크기의 결과가 나온다.