본문 바로가기

AI 논문

[꼼꼼하게 논문 읽기] Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose ( 2018 )

728x90
반응형

GCN을 우선 활용해보려면

다음과 같은 과정이 필요하죠

real stream으로 video를 받고

해당 frame에서 keypoint를 뽑은뒤에

해당 matadata를 쌓고

그 data를 GCN에 넣어 추론 후에

해당 inference를 활용해야하죠

이게 말이 쉽지..

임베디드에서는 진짜로 욕이나옵니다.

여튼 해야되니까 찾아봅시다

뭐라도 되겠죠하다보면

글을 못썻던 이유는 위의 일을 하느라 좀 늦어졌네요

드디어 pose estimation model을 확보했네요

license부터 따져야 될게 많아서.. 그것보다

하드웨어에서 돌아가게 했던게 쉽지가 않았어요..

여튼 시작해봅시다.

 

반응형

Abstract

  multi-person pose estimation architecture를 adapt하였고 이 architecture에서는 edge devices에서 사용된다고 하네요. OpenPose로부터 bottom-up approach를 따르는데, decent quality와 frame 안에서 people의 수에 robustness하기 때문이라고 하네요. edge device에서 26-28 fps가 나온다고 하네요. quality도 쓸만하고요. intel의 OpenVINO toolkit에 포함되었다고 하네요.

Introduction

  Multi-person pose estimation은 important tast고 different domain에서 사용되고 있죠. 가령, action recognition. motion capture, sports 와 같은 분야에서요. 이 task는 image에서 every person에 대한 pose skeleton을 predict합니다. skeleton은 keypoints 나 joints로 구성되어 있죠. 

  Human pose estimation accuracy는 CNNs에 도움을 받아 greatly improved되었죠. 그러나, compact에 대한 research나 efficient pose estimation methods는 거의 없죠. mobile phone에 대한 simplifed Mask R-CNN keypoint detector demo가 있긴 한데, FPS가 10이 나오죠. 그러나 implementation details 와 accuracy characteristics가 제공되지 않았죠. 다른 것 역시 검토해보았으나, 미흡했다고 하네요

  저자들의 연구는 OpenPose를 optimize하고 CNNs의 modern design techniques이 pose estimation task에 사용될 수 있는 방법을 보여주죠. 결론적으로 cpu 에서 26-28 fps 가 나오는 결과물을 보여준다고 합니다. 성능 감소는 1% 미만이라고 합니다.

Related Work

  Multi-person pose estimation problem은 두 가지 방식으로 approached 되어 왔죠. 먼저, top-down이라고 불리는 방식으로, person detector를 applies하고 detected person마다 pose estimation algorithm을 run하는 방식이죠. 따라서 pose estimation problem은 두 개의 subproblems로 나눠지게 되는데요. 두 분야에서 SOTA achievements가 사용됩니다. inference speed는 image 안에 detected people의 number에 의존하죠.

  두 번째 방식은, bottom-up 방식인데, people의 수에 robust하죠. 먼저 all keypoints가 주어진 image에서 detected 되면, 그 다음 human instance에 의해 grouped 되죠. 이런 방식은 전자의 방식보다 빠른데, 두 번째 방식은 keypoints를 한 번에 찾고, 각 person에 대해 pose estimation은 rerun하지 않기 때문이죠. 저자들은 bottom up 방식의 openpose를 기반으로 하고 따라서 사람 수에 invariant하다고 하네요.

Analysis of the Original Openpose

  Inference Pipeline

  all bottom up 방식과 유사하게, OpenPose pipeline는 두 parts로 구성되어 있죠

    1. two tensor를 provide하는 NN의 inference : keypoint heatmaps와 their pairwise relations( pafs ). 이 output은 8 배로 작게 downsampled 되죠.

    2. person instance로 keypoints를 grouping. 이 과정은 tensors를 original image size로 upsampling, heatmaps peak에 대한 keypoints extraction 그리고 instance로 그들을 grouping을 포함합니다. 

  network는 먼저 features를 extract합니다. 그러고 난 다음 heatmaps와 pafs의 initial estimation을 perform하죠. 그후에 5 개의 refinement stage가 performed 되죠. 18 개의 keypoints를 찾을 수 있습니다. 그러고 난 다음, grouping prcedure가 각 keypoint에 대해 best pair를 search하죠. 이는 keypoint pairs의 predefined list에 의거합니다. 예를 들면, 미리 정의된 left elbow and left wrist, right hip and right knee 등이 있죠. 총 19 pairs가 정의되어 있습니다. pipeline은 Fig 1에 설명되어 있습니다.

 inference 동안, input image는 resized 되는데 height를 이용해 network input size에 match되도록 하죠. width는 image aspect ratio를 preserve하기 위해 scaled 되고 multiple of 8로 padded되죠.

  Complexity Analysis

  original implementation은 VGG-19 backbone을 사용합니다. 그대로 사용하지 않고 conv4_2 layer까지 cut하는데, feature extractor로 사용하죠. 그 후에 initial and 5 refinement stage가 만들어지죠.

  각 stage는 parallel branches로 구성됩니다: heatmaps를 위한 하나와 pafs를 위한 하나죠. 두 개의 branches는 같은 design을 가집니다. 이는 Table 1에 나타나 있죠.

Table 2는 refiement stage의 수와 accuracy 간의 trade-off를 보여줍니다.

Table 2에서 볼 수 있듯이, latter stage는 GFLOPs 당 less improvement를 제공하죠. 따라서 optimized version에 대해, 처음 두 개의 stage만을 keep하기로 했다고 하네요: initial stage와 single refinement stage

  post-processing part에 대한 profile은 Table 3에 요약되어 있습니다.

 

이는 OpenCV를 활용해 code를 running함으로써 얻어진 결과입니다. grouping 자체가 lightweight이지만, 다른 부분은 최적화 대상이죠.

Optimization

  Network Design

  모든 실험은 original paper의 default training parameters form을 활용하여 performed됩니다. 그리고 train에 coco dataset을 사용했습니다. initial 과 first refinement stage만을 가지고 있습니다. 그러나, rest stage는 regularizing effect를 제공할 수 습니다. 따라서 final network는 additional stage를 가지고 retrained 되었습니다. 그렇지만 first two만 사용하고요. ~1% AP 하락만을 있었죠.

  Lightweight Backbone

  VGG net이 proposed되었을 때부터, similar 하거나 better classification accuracy을 가진 few lightweight network topologies 가 designed 되었죠. 저자들은 VGG feature extractor를 대체하기 위해 MobileNet 계통을 검토했고 MobileNet v1으로 대체했다고 하네요.

  가장 간단한 방법으로, 모든 layers를 till deepest 까지 keep 한다면, 이는 output tensor resolution과 matched되죠, accuracy drop을 야기합니다. 이는 shallowness 하고 weak feature representation때문일 것이라 추측되고요. spatial resolution을 save하고 backbone weights를 reuse하기 위해 , dilated convolution을 사용합니다. conv4_2/dw layer의 stride는 removed 되고, dilation parameter value는 2로 set하죠. 이는 receptive field를 preserve하는 conv5_1/dw layer를 succeeding하기 위함이고요. 따라서 모든 layer에서 till conv5_5 block까지를 사용합니다. conv5_6의 addition은 accuracy 를 improve 하죠. 저자들은 MobileNet v2 역시 사용하지만 결과는 좋지 않았죠. 이는 Table 4에서 볼 수 있고요.

  Lightweight Refinement Stage

  keypoint heatmaps과 pafs의 new estimation 생성하기 위해, refinement stage는 backbone으로부터 feature를 받죠.  keypoint heatmaps와 pafs의 previous estimation은 concatenated 되고요. 이 사실에 Motivated되어, heatmaps와 pafs 간의 computation의 대부분을 share하기로 결정하고 single prediction branch를 initial 과 refinement stage에서 사용하기로 합니다. 마지막 두 개의 layer를 제외하고 모든 layer를 share합니다. 이는 Fig 2에서 볼 수 있듯이 keypoint heatmaps와 pafs를 직접 생성하죠.

  그런 다음 7x7 kernel size를 가진 each convolution은 같은 receptive field를 가진 convolutional block에 의해 replaced 됩니다. 이는 long-range spatial dependencies를 capture하죠. 이 block design을 가진 실험의 series를 수행했고 3 개의 1x1 , 3x3, 그리고 3x3 kernal size를 가진 consecutive convoltuion이면 충분하다는 사실을 알아냈죠. 후자는 dilation parameter가 2를 가지죠. 이는 initial receptive field를 preserve하죠. network 가 deeper해졌기 때문에, residual connection을 각 block에 추가 했죠.

  Fast Post-processing

  저자들은 code를 profiled하고 extra memory allocations를 removed 했으며, OpenCV's routine을 가진 keypoints extraction을 parallelized 했죠. 이는 code를 상당히 빠르게 만들었고요. last bottleneck은 feature maps를 input image size로 resize하는 겁니다. resize step을 skip 해서 network output에 직접 grouping 했지만, accuracy drop이 심했죠. 따라서 upsamling feature maps step은 피할수가 없죠. input image size와 같은 필요는 없고 실험적으로 upsample factor 8과 input image size로 upsampling한 것은 같았습니다. demo를 위해서 upsample factor 4를 사용했고요.

 

여기까지 하겠습니다.

생각할게 조금 생기네요

생각보다 옛날 모델이다보니

개선의 여지가 있는데..음음

다음 글은 언제 뵐지 잘모르겠습니다

일이 한가할때 다시뵈요.

728x90
반응형