3.5기(200104~)/감정인식

감정인식팀 2주차

KAU-Deeperent 2020. 3. 14. 12:14

회의 날짜: 2020.03.11

회의 장소: 홍대 커피빈

회의 내용: MobileNet v2 논문읽고 공부, 모델 실행시켜보기

팀원: 박형준 성광현 송근영 윤나라 황선경

 

MobileNetv2

Depth-wise Separable Convolution, 그리고 Linear bottleneck 갖는 inverted residual 모듈을 제안. 모듈은 낮은 치원의 압축된 표현을 입력으로 받아 높은 차원으로 먼저 확장한 , depth-wise convolution 필터를 통과시키고, linear convolution 통해 다시 낮은 차원 표현으로 projection하는 과정을 거침.

1. Depth-wise Separable Convolutions

= Depthwise Convolutions + Pointwise Convolutions

기존의 Convolutions 채널과 필터가 동시에 고려돼 최종 아웃풋을 만듦.

 

하지만 논문의 저자는 cross-channels correlation(입력 채널(이미지들) 사이의 유사도) spatial correlation(필터와 하나의 특정 채널 사이의 관계. 필터가 이미지의 특성을 포착하는 정도) 완전하게 독립적이기 때문에 채널과 필터를 따로 분리해서 학습 진행해도 문제가 없다고 주장함. 전체에 대한 Convolution 일반적인 연산이라면 이를 채널 별로 Convolution + 1x1 채널 Convolution 으로 Factorization .

실제로 연산량을 계산해보면 Traditional convolutions 입력 이미지의 크기x입력 이미지의 채널x 커널사이즈 제곱x아웃풋채널 이지만 Depthwise Separable Convolutions 연산량은 입력 이미지의 크기x입력 이미지의 채널x (커널사이즈 제곱+아웃풋채널) 이기 때문에 8~9 정도 연산량이 줄어듦.(커널 사이즈는 3 이라고 가정)

 

2. Linear Bottlenecks

Bottleneck Architecture 일반적으로 pointwise 1x1 Conv 이용해 Channel Reduction(차원 수를 줄임) 하는 방식

논문에서는 방식을 사용하기에 앞서 Input Manifold Activation Space보다 작은 차원의 subspace embedding 가능하면, Non-linear Activation 의한 변환이 정보를 잃지 않으면서 표현력이 좋은 함수처럼 작동한다 해석을 내놓음.

이러한 사실로부터, linear bottleneck 삽입해서 input manifold subspace 표현되도록 도와주겠다는 설명을 이어감.

manifold 어떤 이미지의 차원들이 존재하는 공간으로, Manifold 가설(It has been long assumed that manifolds of interest in neural network could be embedded in low-dimensional subspaces) 따르면 고차원의 정보는 사실 저차원으로 표현 가능함’.

예를 들어서 설명하면, 실제 세상에 존재하는 모든 사물들은 3차원 이라고 이야기를 하지만 사람들은 실제로 사물을 구분할 때는 2차원 정보를 받아들여 사물을 구분할 있다는 것으로, 고차원 정보는 사실 저차원 정보로도 충분히 구분할 있다는 .

논문에서 Linear Bottlenecks 만들 1x1 pointwise Convolutions 하여 차원수를 줄이는 것은 Manifold 가설 그대로 고차원의 채널은 사실 저차원의 채널로 표현할 있다 라는 논리 전개. (다만 채널을 과도하게 줄이면 안됨. 예를 들어 사람은 3차원의 정보를 2차원으로 구분하지만 1차원으로는 구분 못하는 것과 같음.)

Linear Bottlenecks에서 주장하는 다른 하나는 또한 연산량을 줄이기 위해서 1*1 conv 과도하게 압축하다보니 정보손실이 생기고, ReLU 필연적으로 정보 손실을 야기하기 때문(비선형에 의한 정보 손실: 0 이하의 값을 가진 경우 모두 0으로 맵핑하기 때문에 입력된 데이터의 정보를 모두 activation space에 담지 못하는 경우가 발생) 채널 수를 충분히 늘려 정보손실을 방어해야 한다는 . , 채널수가 충분히 많으면 ReLU 사용해도 중요 정보는 보존된다!’

 

 

만약 그림처럼 채널이 1 데이터가 ReLU 지나면 중요 정보가 삭제 있음.

 

 

 

하지만 채널이 2 데이터가 ReLU 지나면 중요 정보가 삭제 되더라도 다른 채널에서는 아직까지 존재할 가능성이 채널이 많으면 많을수록 높기 때문에 채널이 많을때 ReLU 사용하면 괜찮을 이라는 논리. (어차피 나중에 전부 합쳐져서 예측하기 때문에)

쉽게 설명하면 저차원 데이터에 conv 적용하면 많은 정보를 추출할 없기 때문에, 많은 데이터를 추출하기 위해 저차원의 압축된 데이터 압축을 먼저 풀고(확장) -> conv 층을 적용 -> projection 층을 통해 데이터를 다시 압축시킴.

 

저차원의 manifold 고차원 공간에 embedding

 그림은 주장을 실험적으로 증명한 것으로, 차원을 2, 3, 5, 15, 30 으로 각각 사용하고 ReLU 이용한 다음 원래대로 복원하였음. 차원이 작을 때는 ReLU 쓰면 정보가 손실되어 원본 영상을 복원할 없었지만, 차원을 충분히 늘리고 ReLU 쓰면 15, 30 같이 복원 있게 . 따라서 차원수가 충분히 큰 공간에서 ReLU 함수를 사용하게 되면 그만큼 정보 손실율이 낮아진다는 것을 의미함.

 따라서 논문에서 제안하는 모델 구조에서는 데이터 손실을 최소화하기 위해서 저차원의 데이터를 expansion층을 통해 확장시키고 depth-wise convolution 연산을 거쳐서 마지막에 projection 층을 통해 많은 데이터를 보존할 있도록 설계.

 

layer batch normalization activation function으로 ReLU 포함.

하지만 projection layer 출력에는 activation function 적용하지 않음. projection layer에서는 low-dimensional 데이터를 출력하기 때문에 여기에 non-linearity 사용하게 되면 데이터의 유용한 정보들이 손실된다는 것이 저자의 주장,

3. Inverted Residuals

 

Depth-wise Separable Convolutions Linear Bottlenecks 결합하면 Inverted Residuals

Input으로 low-dimensional compressed representation 받아 high-dimension으로 확장시킨 , depthwise convolution 수행

이렇게 나온 feature 다시 linear-convolution 통해 low-dimensional 정보로 만듦.

이러한 Module(Inverted Residual Block) 덕분에 Memory 사용량이 줄어, mobile design 최적화

 

기존의 Residuals 거꾸로 뒤집은 모양. 앞에서 언급한 논리대로 ReLU 사용해야 하기 때문에 채널을 확장(pointwise Convolutions)하고 Depthwise Convolutions 진행. Linear Bottlenecks에서 다시 채널 수를 줄임.

 

stride 1일때는 shortcut 있지만 stride 2 일때는 shortcut 없음. 이유는 논문에서 설명하지 않고 있지만 이미지의 크기가 줄어들 정보의 선형성이 보장되지 않기 때문이라고 추측

기존의 Bottleneck Architecture 채널 수를 줄이는 방식이었다면, 논문에서는 오히려 채널을 늘리는 형태이며, 실제 실험적으로도 나았다고 .

그리고 이렇게 input/output 사이즈가 작기 때문에 memory efficient 하다고 있음.

---

MobileNet V2 building block residual connection 활용. 이는 ResNet 동일하게 gradient 전달하기 위한 형태.

residual block(기존 ResNet) inverted residual(MobileNet V2)의 차이점

Network Architecture

 

MobileNetV2 구조는 처음에 32 필터의 fully convolution 레이어를 지난 , 19개의 residual bottleneck 레이러를 통과하도록 하였습니다. ReLU6 사용하여 low-precision 계산을 사용했을 강하도록 하였으며, 모든 커널은 3×3 크기를 사용하였습니다. 또한 dropout, batch normalization 적용하였습니다.

Expansion rate(t) 5에서 10 사이의 수를 사용한 것이 이상적인 성능을 내었습니다. 실험에서는 입력 채널의 6 사용하였습니다.

 

19 레이어로 되어 있는데, building block (n이라는 파라미터가 의미하듯) 1 이상 동일구조의 반복으로 되어 있습니다.

 

모델 테스트 결과

https://github.com/liminze/Real-time-Facial-Expression-Recognition-and-Fast-Face-Detection

MobileNet v2를 Backbone으로하는 Detection 모델을 깃허브에서 가져와 ubuntu환경에서 테스트 하였습니다.

20 fps로 양호한 성능이 나왔고 표정을 확실히 지어줘야 인식을하지만 양호한 정확도를 보여주고 있습니다.

추후 몇가지 모델을 테스트해보고 모델 확정 및 코드 리뷰 할 계획입니다.

실행 화면면은 다음과 같습니다.

놀란 표정
슬픈 표정
감정인식팀 2주차.pptx
3.56MB