Pelee - A Real-Time Object Detection System on Mobile Devices 리뷰

논문 바로보기

가벼워도 성능 좋고 스피드도 빠르다! 3마리 토끼를 잡은 detector

SSD 가 나오고도 벌써 3년, 수많은 Convolutional Neural Network 기반의 detector 들이 등장하였다.

FPN, RetinaNet, YoloV3 등 성능적인 부분을 개선한 논문도 있고 속도적인 부분을 개선한 논문도 많다.

모두 훌륭한 논문이지만, 오늘 볼 것은 다른 쪽으로 노력한 친구들이다.

SSD로 돌아가서, 해당 모델이 빠른 것인 사실이지만, 그것은 언제나 연구환경 에서다.

59FPS의 놀라운 성능은 TITAN X, Intel Xeon E5-2667v3@3.20GHz에서 발생한다.

SSD를 연구실 환경에서 열심히 돌려봤는데 정말 아무리 잘 나와야 45FPS 정도였다.

만약 이 모델을 그대로 핸드폰에서 돌린다면 답답한 속도와 함께 핸드폰은 따뜻한 손난로로 변할 것이다.

이러한 제한된 메모리와 연산력에서 빠르고 정확한 detector 가 오늘 볼 논문 Pelee의 목표이다.

이 분야의 대표주자로 MobileNet, MobileNetV2, ShuffleNet 가 있다.

각각이 가지고 있는 특징들은 조금씩 다르지만, 한 가지 공통점으로 Depthwise Seperable Convolution(Dw convolution) 을 사용한다. 이 분야의 선구자인 MobileNet 을 시작으로 연산량 줄이기위해 정석적으로 사용되는 방식이었다.

뎁스와-이즈 세퍼러블 컨볼루션

기존은 3 x 3 x M x N filter 를 썼다면 dw convolution 에서는 3 x 3 x 1 x M 과 1 x 1 x M x N 을 쓰는 것이다.

성능은 비슷하지만 연산량은 크게 준다! ((3 x 3 x M x N) x w x h vs (3 x 3 x M + M x N) x w x h)

Pelee 는 이에 당돌하게 맞서며 Conventional Convolution 으로 충분하다고 나온 논문이다.

Abstract 와 Introduction 에 계속 현재 딥러닝 프레임워크로 효율적으로 구현하기 어렵다 를 강조하는 것을 보면 아마 위 논문들을 구현하다가 그 복잡함에 단단히 화가 난 것 같다.

차근차근 그들의 논문을 살펴보며 Conventional Convolution만으로 어떻게 극복하였는지 살펴보자.


Depthwise Seperable Convolution 게섯거라, 토종 Convolution 나가신다!

CNN을 제한된 메모리와 계산량으로 좋은 성능을 내려던 시도는 전에도 많이 있었으며, 아까도 말한 MobileNet 과 ShuffleNet 이 그 선두주자라 할 수 있겠다.

다만 이 두 개의 경우 dw convolution 에 크게 의존하고 있으며, 현재 딥러닝 라이브러리에서 구현의 효율도 떨어진다며 다른 방식을 제시한다.

Classification 과 Detection 양쪽 모두에서 효율적인 구조를 만들기 위해 새로 설계한 CNN architecture, PeleeNet 과 Pelee 이다.

Mobile Device 를 위한 DenseNet 기반의 PeleeNet

PeleeNet 은 DenseNet-41을 변형시켜 만든 네트워크로 MobileNet 에 비해서 66% 밖에 안 되는 모델 크기를 가지면서 성능도 1.5% 높고 속도도 아주 빠르다고 한다. (NVIDIA TX2에서 1초에 240장의 이미지 분류!)

그렇다면 어떤 방식을 이용해 dw convolution 없이도 좋은 성능을 보일 수 있었을까?

  • 원래의 Dense layer 대신 Two-way Dense layer 를 사용한다.

    원래 DenseNet 에 사용되는 Dense layer 에는 1 x 1 과 3 x 3, 두 개의 convolution 결과를 원본과 concatenate 하여 사용된다.

    여기에 3 x 3 convolution 을 두 번 시행한 결과를 같이 이용한다면? dense layer 를 두 개 쌓은 것과 비슷한 receptive field 를 한 layer 로 얻을 수 있을 것이다.

    자세히 알고 싶다면 이 방식을 가장 먼저 사용했던 GoogLeNet 을 참조해보자

    원래는 4k 와 k channel convolution 의 1-way 를 2k , k/2 channel convolution 의 2-way 로 변경했기에 연산량도 크게 다르지 않다.

    Pelee 의 Dense Block

  • Stem Block 을 Dense Block 전에 둔다.

    DenseNet 에서도 그렇고 Inception-v4DSOD 논문을 살펴보면 Block 을 쌓기 전에, 간단한 convolution 을 통해 feature를 뽑는 단계가 있다.

    이 논문들의 공통된 의견은 input 에 바로 block 을 쌓는 것보다 먼저 간단한 convolution 을 거치는 것이 훨씬 효율적이라는 것이다.

    PeleeNet 의 특징이라면 다른 구조들은 단순 convolution 쌓기 구조라면, 여기서는 Inception을 사용한다는 것이다.

    아무래도 다른 구조에 비해 얕은 dense block 때문에 이러한 선택을 한 것으로 보이지만, 정확한 이유는 나와있지 않았다…

    후에 이에 대해서도 한번 실험해볼 계획이다.

    Pelee 의 Stem Block

  • BottleNeck Layer 의 채널 수를 유동적으로 한다.

    Bottleneck Layer 는 1 x 1 Convolution 으로 channel 수를 줄여 연산량을 줄이는 방식이다.

    그런데 그 채널 수는 항상 4k (k 는 growth rate)인데, 자세히 보니 초반의 몇 layer 는 오히려 channel 수가 더 많아지는 현상이 있다는 것을 발견하였다.

    (k=32의 첫 dense block 은 처음에 64로 시작하는데 bottleneck에서 128이 된다.)

    이러면 오히려 연산량을 늘게되고, DenseNet 이 의도했던 방향과 맞지 않게 된다.

    따라서 channel 의 수를 block 에 따라 유동적으로 바꿔, bottleneck 에서 channel이 늘어나는 불상사가 일어나지 않게 하였다.

    이 과정에서 accuracy 는 조금 줄었지만, 연산량은 28.5 % 나 줄었다고 한다.

    자세한 channel 수는 원본 코드에서 직접 확인하자.

  • Transition Layer 의 Compression 을 사용하지 않는다.

    나름 DenseNet 의 핵심 부분이라고 할 수 있는 Transition 의 Compression 부분을 과감하게 삭제하였다.

    비교했더니 성능이 떨어져서 그렇다고 한다.

    네트워크가 얇아서 그런것일까? 아니면 Compression 자체가 문제가 있는것일까?

    DenseNet 논문을 읽어보면 Compression만 성능 비교를 한 부분이 없고 치사하게 Bottleneck 이랑 묶어 놔서 알 수가 없긴 하다.

    이 부분도 추가적으로 연구해볼만한 부분이라고 생각된다.

  • Composite Function 을 변경함

    DenseNet 의 Composite function 은 BatchNorm - Relu - Conv 순서로 이루어진다. (pre-activation)

    하지만 PeleeNet 은 Conv - BatchNorm - Relu 순으로 이루어진다. (post-activation)

    무슨 차이가 있을까 싶지만, Conv와 BatchNorm 이 이어져있다는 점이 중요하다.

    둘이 이어짐으로 Conv와 BatchNorm 을 한 layer 로 합칠수가 있게 되며, Inference stage 에서 굉장히 빨라진다고 한다.

    물론 이러한 변화가 성능에 하락을 주기 때문에,

    • 네트워크를 얇고 넓게 설계

    • 1 x 1 conv layer 를 마지막 dense block 뒤에 추가

    등으로 해결했다고 한다.

PeleeNet 은 classification 알고리즘! Pelee 은 SSD 와 결합한 detection 알고리즘!

이제 PeleeNet 으로 detection 에 써볼 차례다.

가벼운 classification 네트워크에 어울리는 것은 역시 가벼운 detection 알고리즘이다.

저자들이 선택한 것은 Single Shot MultiBox Detecotr 였다.

그냥 쓰지는 않고, 몇가지 변형을 통해 사용하여 Yolov2 에 비해서 VOC 에서는 mAP 가 1.9%, 방식에 따라 다르긴 하지만 COCO 에서도 조금 더 좋은 성능을 보인다.

  • 38 x 38 feature map… 안써요 어휴

    SSD 는 38 x 38, 19 x 19, 10 x 10, 5 x 5, 3 x 3, 1 x 1 총 6가지의 feature map 을 선택한다.

    이 부분을 잘 모르겠다면 전 post 를 확인해보면 도움이 될것이다.

    가장 작은 부분 탐지를 위해 사용되는 38 x 38 의 경우 성능도 구린 주제에 전체 prediction 의 66% 나 차지한다 (5776 / 8732)

    차라리 38 x 38 은 버리고 다른 방식으로 정확성을 올리는 방법을 쓰는 것이 속도 향상에 도움이 된다.

    Pelee 는 이에 따라 38 x 38 을 빼고, 19 x 19 가 그 역할을 같이 하도록 구현하였다.

    그래서 19 x 19 with two scales, 10 x 10, 5 x 5, 3 x 3, 1 x 1 이렇게를 최종 feature map 으로 사용하게 된다.

  • Residual Prediction Block

    Residual Block 을 Prediction 을 하는 방식은 RUN 에서 제안한 방식을 가져온 것이다.

    prediction 을 하기 전에 ResBlock 하나를 이용해서 해당 피쳐를 더 좋은 피쳐로 만드는 과정이다.

    ResBlock

  • Small Convolutional kernel Prediction

    원래는 3 x 3 convolution 으로 최종 prediction 을 한다. 하지만 위의 ResBlock 을 보면 이미 3 x 3 convolution 이 들어갔으니, 한 번 더 쓸 필요가 있을까?

    저자들은 3 x 3 대신 1 x 1 로 대신하여 거의 비슷한 결과를 얻으면서도 21.5%의 계산량을 줄일 수가 있었다.

pelee

이렇게 완성된 pelee! SSD 에 비해 간결한 것이 느껴진다.


Results

개인적으로 모든 결과에 대해서 언급하는 것을 좋아하지 않기 때문에, 중요하다고 생각하는 몇 개만 이야기를 하도록 하겠다.

더 자세한 내용이 필요하다면 논문을 참고하자.

densenet41 과 비교

위 결과는 DenseNet-41 을 baseline으로 하여 PeleeNet 으로 변형한 기법 들을 ablation test 한 결과이다.

해당 DenseNet 은 저자가 제한된 Computation Budget 에 맞춰 channel 수 등 몇 가지를 변형한 모델이다.

dataset 은 Standford Dog dataset을 이용해서 실험하는데, 이것만 가지고는 데이터가 너무 적어서 Imagenet 에서 추가로 가져와서 150,466 장을 training set 으로, 6,000 장을 validation set 으로 사용하였다.

필자는 차례대로 아래와 같이 해석하였다.

  • compression 을 제거하여 성능이 향상됨
  • post-activation 을 시도했는데 성능이 하락함, 하지만 속도를 늘리기에 최적화된 방법이기에 이를 보완할 방법을 먼저 찾고 싶은 듯 하다
  • 다시 pre-activation으로 돌리고, Dynamic Bottleneck channel 을 시도했더니 이 역시 성능이 살짝 떨어짐. 다만 이는 연산량이 크게 줄기 때문에 허용수치로 볼 수 있다
  • Stem Block 을 적용시켰더니 76.8이라는 꽤나 높은 수치를 얻음
  • 여기에 Post-Activation 을 다시 적용시키고, 2-way dense layer 를 이용하니 78.8 이라는 꽤 높은 수치를 얻음
  • 마지막으로 dense layer 를 추가로 3개를 쌓았더니 최종적으로 79.25라는 수치를 얻음

마지막에 3개의 layer를 추가해도 연산량은 DenseNet-41 보다 적기 때문에 추가한 것으로 보인다.

이렇게 한 결과는 전에 말했듯이 다른 dw convolution 을 사용한 결과보다 연산량은 적으면서 좋거나 비슷한 결과를 보였다.

tx2 classification 스피드 결과

tx2 detection 스피드 결과 특히 속도 쪽은 더욱 부각되는데, 224 x 224 classification 의 240 images for second 라는 놀라운 속도는 다른 네트워크에 비해 2배 가까이 빠른 속도이다.

detection 부분도 똑같이 SSD 를 사용한 다른 네트워크에 비해 2배가까이 높은 속도를 보인다.

다만 FP32 가 되면 속도 차이가 많이 줄어드는데, 이는 TX2 의 FP16에서의 dw convolution 연산 문제라고 한다.


Conclusion

Pelee 는 dw convolution 을 사용하지 않고도 그에 버금가는 성능과 함께 제한된 메모리, 계산력에서도 사용할 수 있는 네트워크를 제시하였다.

Convention convolution 만으로 이러한 성능을 내었으니, 추가적인 기법을 통해 훨씬 효율적인 detector를 만들 수도 있을 것 같다.

다만 이 논문의 evaluation 부분은 아쉽게 느껴진다.

DenseNet-41 에서 layer 를 추가한 것과 accuracy 성능 비교를 하는 것이 그 부분인데, DenseNet-41 은 원래 있던 구조가 아닌 저자들이 base 삼아 만든 구조이다.

어차피 DenseNet-41 을 mobile device 에서 사용할 생각이 아니었다면, 성능 비교의 지표는 똑같이 3 dense layer 를 추가시킨 DenseNet-47 과 했으면 더 의미있을 것이라 생각한다.

또한 TX2 FP16 일 때를 제외하고, 다른 상황에서의 속도 차이를 다른 device 에서도 추가적으로 실험이 더 필요하다고 생각한다.

TX2 FP16 상황을 제외하면 속도가 비슷하기 때문에, TX2 의 문제라고 생각되기 때문이다.

Dw convolution 없이도 속도가 비슷한 것도 하나의 contribution 라고 생각하는데, 충분한 실험이 없으니 무언가를 숨기는 듯한 느낌을 받아 찜찜하다.

기회가 되면 이 부분은 직접 해봐서 확인해보려고 한다.

카테고리:

업데이트:

댓글남기기