OpenPose의 DNN 부분을 Chainer CPU로 움직여 보았습니다.

이 기사는 우리 블로그의 전재입니다.

소개



이번에는 Mac에서 OpenPose를 chainer를 사용하여 실행해 보겠습니다.
(전체가 아닌 탐지 히트 맵을 생성하는 일부 기능입니다)

1. Caffe 학습된 모델 다운로드
2. Chainer에서 Caffe 모델 로드
3. Chainer 네트워크에 이미지 적용

CVPR2017에서 발표된 단안 카메라에 의한 골격 추정 알고리즘의 OpenPose, 이미 Ubuntu, Windows에서의 실시간 처리가 실현되는 것으로 보고되었습니다. 하지만 GPU가 필요하거나 Mac은 대응하고 있지 않기 때문에, 어떻게든 Mac이나 CPU에서도 움직일 수 있을까 생각하고 Caffe의 모델을 Chainer로 읽어 전반의 DNN 부분만 실행해 봅니다.

실행 환경 (Linux에서도 작동해야 함)



Mac book Pro(2.7GHz Intel Core i5,16GB 1867MHz DDR3)
Python2.7 (Chainer, Numpy)

작업



1. Caffe 학습된 모델 다운로드

여기 에 Windows 용 실행 바이너리가 있으므로 다운로드합니다. 여기에는 Caffe 매개 변수 파일이 포함되어 있습니다.
(직접 링크가 신경이 쓰이는 분은 htps : // 기주 b. 이 m/C무-ぺrせp つあl-m ぷちんgーぁb/오뻬뽀세/bぉb/마s r/도 c/인 s 탓치온. md 의 중간에 있는 Download and unzip the portable OpenPose demo 1.0.1.에서 떨어뜨려 주세요)

2. Chainer에서 Caffe 모델 로드

이번에는 골격 18점을 추정하는 COCO 모델을 사용합니다. (MPI 모델도 유사한 절차로 가능)
Caffe 모델은 다음 디렉토리에 저장됩니다.

OpenPose_demo_1.0.1/models/pose/coco/pose_iter_440000.caffemodel

이것을 chainer에서 읽습니다.
from chainer.functions import caffe
func = caffe.CaffeFunction('pose_iter_440000.caffemodel')

3. Chainer 네트워크에 이미지 적용

OpenPose_demo_1.0.1/models/pose/coco/pose_deploy_linevec.prototxt
읽으면 네트워크 구성이 작성되었으며 마지막 출력 레이어를 살펴보면
layer {
   name: "concat_stage7"
   type: "Concat"
   bottom: "Mconv7_stage6_L2"
   bottom: "Mconv7_stage6_L1"
   # top: "concat_stage7"
   top: "net_output"
   concat_param {
     axis: 1
   }
 }

그리고 출력 노드의 첫 번째는 Mconv7_stage6_L2라는 이름으로 정의됩니다.
(Mconv7_stage6_L1 쪽은 본 같다)

그래서 이것을 func의 출력층으로 지정함으로써 (1,19,h,w)의 출력 맵을 얻을 수 있습니다.
x = chainer.Variable([画像のnumpy配列])
y, = func(inputs={'data': x}, outputs=['Mconv7_stage6_L2'])
print y.data.shape #(1,19,h,w)

이미지의 numpy 배열은 크기가 (1, 4, height, width)이고 값이 0-255가 아니라 0.0-1.0
또한 dtype이 np.float32가 아니면 안됩니다.
(RGB가 아닌 RGBA가 예상되는지 모르겠지만 네 번째는 0을 채워 입력하고 있습니다)

↓ 시험해 본 것이 이쪽의 이미지



    POSE_COCO_BODY_PARTS {
        {0,  "Nose"},
        {1,  "Neck"},
        {2,  "RShoulder"},
        {3,  "RElbow"},
        {4,  "RWrist"},
        {5,  "LShoulder"},
        {6,  "LElbow"},
        {7,  "LWrist"},
        {8,  "RHip"},
        {9,  "RKnee"},
        {10, "RAnkle"},
        {11, "LHip"},
        {12, "LKnee"},
        {13, "LAnkle"},
        {14, "REye"},
        {15, "LEye"},
        {16, "REar"},
        {17, "LEar"},
        {18, "Bkg"},
    }

히트 맵은 위의 구조에 쓰여진 신체 부위의 각각의 존재 확률을 보여줍니다.
1장당 10초 정도 걸립니다만, CPU에서도 움직이기 때문에 사용도가 퍼질 것 같습니다.

좋은 웹페이지 즐겨찾기