Computer Vision

image classification/recognition

 

Object Detection

 

Neural Style Transfer

 

- input이 매우 커질 수 있다는 챌린지

     - 1000*1000 사이즈의 이미지라면 3개의 채널까지 해서 --> $1000 \times 1000 \times 3 = 3000000$차원

 

standard한 NN에 입력한다고 치면 1000차원의 레이어의 파라미터 차원은 $(1000, 3000000)$로, $3000000000$에 달함

--> overfitting을 방지할 만큼 큰 데이터와 computational 파워를 구하기 쉽지 않음

 

 

Edge Detection Example

convolution operation

 

how to detect edges?

 

오른쪽은 그냥 내가 한번 만들어본 거 ..

6x6 흑백 이미지(채널 한 개)에 3x3 filter(kernel)를 곱한다 그 결과 4x4 이미지가 나옴

여기서 $\ast $는 "convolution"

- 한편, 파이썬에서는 element-wise multiplication 을 가리킴

 

 

convolution 계산법..

이런 식으로 계속 

---> vertical edge detector

 

conv-forward #python
tf.nn.conv2d #tensorflow
Conv2D #keras

 

설명을 위해 매우 간단한 6x6 이미지 준비

가운데 흰색과 검은색 경계에 vertical line이 있음

 

*필터를 이미지화했을 때

convolution 연산 결과

detected edge가 왜 이렇게 두꺼워?! --> 예시로 사용중인 이미지가 너무 작아서..

 

 

More Edge Detection

반대로 된 이미지였다면?

검정색으로 detect되는 vertical edge

 

horizontal filter는 어떻게 생겼을지 상상하기 어렵지 않다

 

좀더 복잡한(?) 이미지라면 ..

filter가 가운데를 지날 때는 걸쳐져 있으므로 10과 같은 중간값이 나옴

 

필터의 값을 어떻게 할지는 의견이 분분

(왼) Sobel filter

(오) Scharr filter

 

필터의 값들을 하나하나 지정하는 대신에, back prop 통해 학습해야 할 파라미터로 여기는 건 어떨까?

그리고 꼭 vertical/horizontal 방향이 아니더라도 다양한 각도의 edge를 찾을 수 있음!!

 

 

Padding

$n \times n$ 이미지에 $f \times f$ 필터를 적용하면 $n - f + 1 \times n - f + 1 $ 이미지가 나옴

-> 단점1: convolution 연산을 거듭할수록 이미지가 작아짐

-> 단점2: 외곽(edges)에 있는 픽셀값들은 한번~몇번 쓰이고 마는데, 가운데로 갈수록 픽셀값들이 계산에 overlap됨

---> 이미지에 padding을 씌움

 

 

예를 들어 6x6 이미지를 1개의 픽셀을 둘러 padding을 적용하면 8x8 이미지가 되고, 아웃풋은 6x6 이미지가 됨 -> 원래의 6x6 이미지 사이즈를 유지할 수 있게 됨

 

- conventionally 패딩의 값은 $0$으로 하고

- 몇 개의 픽셀을 패딩할 것인가 --> 이 경우 $p =1 $

--> output의 사이즈는 $n+2p - f + 1 \times n+2p - f + 1$

 

$p$값을 얼마로 할 것인가?

"Valid convolutions" & "Same convolutions"

- Valid = no padding : $n\times n$ $\ast$ $f\times f$ $=$ $$n-f+1\times n-f+1$$

- Same = Pad so that output size is the same as the input size

$$n+2p-f+1 = n$$

$$p = \frac{f-1}{2}$$

filter 사이즈에 따라 필요한 padding 의 사이즈가 달라지는 것

--> $f$는 거의 항상 "홀수"다

- $f$가 짝수면 비대칭적인 padding이 필요하게 됨

- $f$가 홀수면 한가운데 중심이 있다 (central pixel)

 

 

Strided Convolutions

stride $s = 2$ 로 한다면 filter를 옮길 때 한 칸만 이동하지 않고 두 칸을 이동하게 됨

 

아웃풋 이미지 크기:

$$\lfloor\frac{n+2p-f}{s}+1\rfloor \times \lfloor\frac{n+2p-f}{s}+1\rfloor$$

 

- $\lfloor\rfloor$ : 정수가 아닐 경우 floor = 정수로 "내림"

왜 올림이 아니라 내림?

--> filter가 이미지 밖으로 나갔을 때에는 계산하지 않도록 해야 함 (이미지나 패딩 안에서 fully contained 되었을 때만)

 

[cross-correlation vs. convolution]

 

수학에서 convolution 계산할 때는, filter를 뒤집는다

이렇게 생긴 필터라면

7 9 -1
2 0 1
5 4 3

이렇게..

 

엄밀히 말해서 딥러닝에서 하고 있는 convolution 연산은 "cross-correlation" 이지만, convention에 의해 convolution이라고 부른다

*cross-correlation:신호처리에서 두 신호가 얼마나 유사한지 계산할 때 쓰임(참고)

 

 

복사했습니다!