기준 최신 2D 자세 추측 모델의 추론 속도

개시하다


2D 포즈로 추정하면 오픈포스트가 유명하지만, SOTA는 매년 업데이트하고 Jetson에 탑재할 수 있는 경량 비즈니스 모델도 등장한다.앱을 만드는 토대 위에서 현재 추론 속도가 얼마나 되는지 알고 싶어서 조사해봤어요.최근 모델의 연산량이 공개된 것 같은데 최종적으로 Jetson Nano의 실측값(이번에는 서버 사용)을 확인하고 싶다.
부수적인 샘플 코드를 사용해 빠르게 평가한다는 방침이어서 공정한 비교가 없을 수 있으니 참고가 되길 바란다.오류 지적 등을 환영합니다.

기준 조건


COCOCOval 2017의 모든 이미지에 대해 데이텀 개체 모델로 포즈를 추정한 결과 총 시간/장수(5000장)가 FPS였다.카메라에서 입력한다고 가정하면 추론은 한 과정에서만 순서대로 실행된다. (실제로는 중첩될 수 있다.)
탑다운(Top-Down) 방식은 사람의 Bbox를 입력하기 때문에 사람을 감지하는 시간은 포함되지 않지만, 사람의 감지와 자세 추측을 할 수 있는 배관 동작을 하는 전제에서 자세로 추정되는 추론 시간에 따라 FPS를 계산한다.한편, Bottom-Up 방식은 각 이미지의 추론 시간에 따라 FPS를 계산합니다.

운영 환경


Hardware

  • Nvidia GTX 1080Ti (12GB)
  • Intel Core i7 8700K
  • DDR4-2666 48GB
  • Software

  • Ubuntu 18.04
  • Python 3.6
  • CUDA 10.2
  • PyTorch 1.9.0
  • 데이터 세트


    COCO val2017

    평가 모델


    최신 2D 포즈 추정 모델(OpenPose 포함)에는 총 8개의 벤치가 있다.모델의 초파라미터는 가장 가볍다고 여겨지는 것과 정밀도가 좋다고 여겨지는 것을 마음대로 선택한다(경량의 모델을 찾으려면 정밀도가 좋은 모델은 참고 정도이기 때문이다).

    Top-Down 방식

  • Deep High-Resolution-Representation-Net (CVPR 2019)
  • (a) DHRRN pose_hrnet_w32 (256x192) with detected bbox
  • (b) DHRRN pose_hrnet_w32 (256x192) with ground truth bbox
  • (c) DHRRN pose_hrnet_w48 (384x288) with detected bbox
  • (d) DHRRN pose_hrnet_w48 (384x288) with ground truth bbox
  • Fast Human Pose Estimation (CVPR 2019)
  • (e) FHPE pose_hrnet_w32_student_FPD with detected bbox
  • (f) FHPE pose_hrnet_w32_student_FPD with ground truth bbox
  • DarkPose (ICCV 2019)
  • (g) DarkPose HRNet-W32 (256x192) with detected bbox
  • (h) DarkPose HRNet-W32 (256x192) with ground truth bbox
  • (i) DarkPose HRNet-W48 (384x288) with detected bbox
  • (j) DarkPose HRNet-W48 (384x288) with ground truth bbox
  • TransPose (Dec. 2020)
  • (k) TransPose R-A3 with detected bbox
  • (l) TransPose R-A3 with ground truth bbox
  • (m) TransPose H-A6 with detected bbox
  • (n) TransPose H-A6 with ground truth bbox
  • Lite-HRNet (CVPR 2021)
  • (o) Naive Lite-HRNet-18 256x192 with detected bbox
  • (p) Naive Lite-HRNet-18 256x192 with ground truth bbox
  • (q) Lite-HRNet-18 256x192 with detected bbox
  • (r) Lite-HRNet-18 256x192 with ground truth bbox
  • Bottom-Up 모드

  • OpenPose (CVPR 2017)
  • (s) OpenPose multi thread disabled
  • HigherHRNet (CVPR 2020)
  • (t) HHRNet w32-512 without multi-scale
  • (u) HHRNet w32-512 with multi-scale
  • HRNet-DEKR (CVPR 2021)
  • (v) DEKR pose_hrnet_w32 without multi-scale
  • (w) DEKR pose_hrnet_w32 with multi-scale
  • (x) DEKR pose_hrnet_w48 without multi-scale
  • (y) DEKR pose_hrnet_w48 with multi-scale
  • 결실


    AP를 가로축으로 하고 FPS를 세로축으로 하여 차트를 그립니다.성능을 추구하기 때문에 FPS의 결과는 상당히 심각하다.특히 탑다운(Top-Down) 방식은 이미지에 나타난 사람 수에 비례해 연산량을 늘렸기 때문에 애플리케이션에 맞는 디자인이 필요하다.
    성능은 Dark Pose가 우수하며, TransPose가 Bbox 단위로 가장 빠릅니다.Bottom-Up 방식은 OpenPose 이외에 FPS가 낮고 용도가 제한적입니다.

    Top-Down 방식



    Bottom-Up 모드



    총결산


    최신 2D 자세 추정 모형을 벤치로 표시해 보았다.다음에는 정밀도를 눈을 감고 추론 속도가 빠른 모델을 중심으로 추론 속도의 고속화에 대해 토론하고 싶습니다.

    부록: 실행 방법 노트


    TopDown 방식


    Deep High-Resolution-Representation-Net

  • DHRRN pose_hrnet_w32 (256x192) with detected bbox
  • DHRRN pose_hrnet_w32 (256x192) with ground truth bbox
  • DHRRN pose_hrnet_w48 (384x288) with detected bbox
  • DHRRN pose_hrnet_w48 (384x288) with ground truth bbox
  • $ python3 tools/test.py --cfg experiments/coco/hrnet/w32_256x192_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pose_hrnet_w32_256x192.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX False \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/coco/hrnet/w32_256x192_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pose_hrnet_w32_256x192.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX True \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/coco/hrnet/w48_384x288_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pose_hrnet_w48_384x288.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX False \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/coco/hrnet/w48_384x288_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pose_hrnet_w48_384x288.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX True \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 GPUS '(0,)'
    

    Fast Human Pose Estimation

  • FHPE pose_hrnet_w32_student_FPD with detected bbox
  • FHPE pose_hrnet_w32_student_FPD with ground truth bbox
  • 참고 사항:
  • requirements.txt의 torch = 1.0을 torch = 1.9로 설정합니다
  • data/cache/coco_cached_val2017_db.pkl 지우지 않으면 USEGT_BBOX가 무시되었습니다
  • $ python3 tools/test.py --cfg experiments/fpd_coco/hrnet/w32_256x192_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pose_hrnet_w32_student_FPD.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX False \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 100000 \
    WORKERS 4 GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/fpd_coco/hrnet/w32_256x192_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pose_hrnet_w32_student_FPD.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX True \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 100000 \
    WORKERS 4 GPUS '(0,)'
    

    DarkPose

  • DarkPose HRNet-W32 (256x192) with detected bbox
  • DarkPose HRNet-W32 (256x192) with ground truth bbox
  • DarkPose HRNet-W48 (384x288) with detected bbox
  • DarkPose HRNet-W48 (384x288) with ground truth bbox
  • $ python3 tools/test.py --cfg experiments/coco/hrnet/w32_256x192_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/w32_256×192.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX False \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 \
    GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/coco/hrnet/w32_256x192_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/w32_256×192.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX True \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 \
    GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/coco/hrnet/w48_384x288_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/w48_384×288.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX False \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 \
    GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/coco/hrnet/w48_384x288_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/w48_384×288.pth \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX True \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 \
    GPUS '(0,)'
    

    TransPose

  • TransPose R-A3 with detected bbox
  • TransPose R-A3 with ground truth bbox
  • TransPose H-A6 with detected bbox
  • TransPose H-A6 with ground truth bbox
  • $ python3 tools/test.py --cfg experiments/coco/transpose_r/TP_R_256x192_d256_h1024_enc3_mh8.yaml \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX False \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4
    
    $ python3 tools/test.py --cfg experiments/coco/transpose_r/TP_R_256x192_d256_h1024_enc3_mh8.yaml \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX True \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4
    
    $ python3 tools/test.py --cfg experiments/coco/transpose_h/TP_H_w48_256x192_stage3_1_4_d96_h192_relu_enc6_mh1.yaml \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX False \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 \
    GPUS '(0,)'
    
    $ python3 tools/test.py --cfg experiments/coco/transpose_h/TP_H_w48_256x192_stage3_1_4_d96_h192_relu_enc6_mh1.yaml \
    TEST.FLIP_TEST False \
    TEST.USE_GT_BBOX True \
    TEST.BATCH_SIZE_PER_GPU 1 \
    PRINT_FREQ 1000000 \
    WORKERS 4 \
    GPUS '(0,)'
    

    Lite-HRNet

  • Naive Lite-HRNet-18 256x192 with detected bbox
  • Naive Lite-HRNet-18 256x192 with ground truth bbox
  • Lite-HRNet-18 256x192 with detected bbox
  • Lite-HRNet-18 256x192 with ground truth bbox
  • 참고 사항:
    - naive_litehrnet_18_coco_256x192.py의 keypointhead의 in채널을 40에서 30으로 변경합니다 (pre-traained 모델과 일치하기 위해).
    - use_gt_bbox는 config 파일로 지정됩니다.
    $ python3 tools/test.py configs/top_down/naive_litehrnet/coco/naive_litehrnet_18_coco_256x192.py \
    pre-trained/naive_litehrnet_18_coco_256x192.pth
    
    $ python3 tools/test.py configs/top_down/lite_hrnet/coco/litehrnet_18_coco_256x192.py \
    pre-trained/litehrnet_18_coco_256x192.pth
    

    Bottom-Up 모드


    OpenPose

    $ time ./build/examples/openpose/openpose.bin --image_dir data/coco/images/val2017 \
    --display 0 --num_gpu 1 --write_json result.json --render_pose 0 --logging_level 2 --disable_multi_thread
    

    HigherHRNet

  • HHRNet-w32-512 without multi-scale
  • HHRNet-w32-512 with multi-scale
  • $ python3 tools/valid.py --cfg experiments/coco/higher_hrnet/w32_512_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pytorch/pose_coco/pose_higher_hrnet_w32_512.pth \
    TEST.FLIP_TEST False \
    TEST.LOG_PROGRESS True
    
    $ python3 tools/valid.py --cfg experiments/coco/higher_hrnet/w32_512_adam_lr1e-3.yaml \
    TEST.MODEL_FILE models/pytorch/pose_coco/pose_higher_hrnet_w32_512.pth \
    TEST.SCALE_FACTOR '[0.5, 1.0, 2.0]' \
    TEST.FLIP_TEST False \
    TEST.LOG_PROGRESS True
    

    HRNet-DEKR

  • DEKR pose_hrnet_w32 without multi-scale
  • DEKR pose_hrnet_w32 with multi-scale
  • DEKR pose_hrnet_w48 without multi-scale
  • DEKR pose_hrnet_w48 with multi-scale
  • $ python3 tools/valid.py --cfg experiments/coco/w32/w32_4x_reg03_bs10_512_adam_lr1e-3_coco_x140.yaml \
    TEST.MODEL_FILE model/pose_coco/pose_dekr_hrnetw32_coco.pth \
    TEST.LOG_PROGRESS True \
    TEST.FLIP_TEST False \
    PRINT_FREQ 10000
    
    $ python3 tools/valid.py --cfg experiments/coco/w32/w32_4x_reg03_bs10_512_adam_lr1e-3_coco_x140.yaml \
    TEST.MODEL_FILE model/pose_coco/pose_dekr_hrnetw32_coco.pth \
    TEST.LOG_PROGRESS True \
    TEST.FLIP_TEST False \
    TEST.NMS_THRE 0.15 \
    TEST.SCALE_FACTOR 0.5,1.0,2.0 \
    PRINT_FREQ 10000
    
    $ python3 tools/valid.py --cfg experiments/coco/w48/w48_4x_reg03_bs10_512_adam_lr1e-3_coco_x140.yaml \
    TEST.MODEL_FILE model/pose_coco/pose_dekr_hrnetw48_coco.pth \
    TEST.LOG_PROGRESS True \
    TEST.FLIP_TEST False \
    PRINT_FREQ 10000
    
    $ python3 tools/valid.py --cfg experiments/coco/w48/w48_4x_reg03_bs10_512_adam_lr1e-3_coco_x140.yaml \
    TEST.MODEL_FILE model/pose_coco/pose_dekr_hrnetw48_coco.pth \
    TEST.LOG_PROGRESS True \
    TEST.FLIP_TEST False \
    TEST.NMS_THRE 0.15 \
    TEST.SCALE_FACTOR 0.5,1.0,2.0 \
    PRINT_FREQ 10000
    

    좋은 웹페이지 즐겨찾기