1. OpenPose 基准
OpenPose 提供了各显卡预计能达到的运行速度基准.
2. 速度分析(Profiling Speed)
OpenPose 在 basic GUI 中显示 FPS. 在运行 OpenPose 时,通过命令行可以获得更复杂的速度度量(speed metrics).
为此,需要在 OpenPose 编译安装时选择 PROFILER_ENABLED
flag 选项. 在处理 F
帧 之后,OpenPose 会自动对每一个 subthread 进行显示时间分析. (默认 F=1000
,可以通过 --profile_speed
flag 进行修改).
[1] - 1 张显卡的时间分析:FPS 是在终端命令行中显示的最慢的时间(因为 OpenPose 是多线程的multi-threaded). 时间是以毫秒为单位的,因此 FPS=1000/millisecond_measurement
.
[2] - 多张显卡的时间分析:假设有 n
张显卡,则需要等待 n x F
帧,以可视化每张显卡的速度. FPS = minFPS(speed_per_GPU/n, worst_time_measurement_other_than_GPUs)
. 对于 < 4 张 GPUs 时,一般 FPS = speed_per_GPU/n
.
3. 保持精度时加快速度
OpenPose 提供了一些建议,以在保持精度的前提下,最大化实时运行速度.
[1] - 在 CMake 编译时,开启 WITH_OPENCV_WITH_OPENGL
flag,以获得更快速度的 GUI 显示(必须需要保证 OpenCV 具有 OpenCL 支持).
注:Ubuntu 中,apt-get install
安装的默认的 OpenCV 不支持 OpenGL.
[2] - 将 GPU 渲染更改为 CPU 渲染,能够获得大约 +0.5 FPS (--render_pose 1
).
[3] - 使用 cuDNN 5.1 (cuDNN 6 慢了大约 ~10% ).
[4] - 使用 BODY_25
模型,以同时最大化速度和精度(但,COCO 和 MPII 模型速度更慢,精度更低)
4. 加快速度并减少内存
OpenPose 提供的最大化 OpenPose 速度,但保持精度均衡的建议:
[1] - 减少 --net_resolution
,如 320x176,精度较低.
[2] - 对于 Face,减少 --face_net_resolution
. 分辨率为 320x320 时效果较佳.
[3] - [1] 和 [2] 同时能够减少 GPU 显存占用(或 CPU 版本减少了 RAM 内存).
[4] - 使用 BODY_25
模型,以同时最大化速度. 使用 MPI_4_layers
模型,最小化 GPU 显存占用,但精度更低,速度更慢,Body Parts 数更少.
注:最大精度的配置:
# Ubuntu: Body
./build/examples/openpose/openpose.bin
--net_resolution "1312x736"
--scale_number 4
--scale_gap 0.25
# Ubuntu: Body + Hand + Face
./build/examples/openpose/openpose.bin
--net_resolution "1312x736"
--scale_number 4
--scale_gap 0.25
--hand
--hand_scale_number 6
--hand_scale_range 0.4
--face
5. CPU 版本
OpenPose CPU 版本,对于 COCO 模型的运行速度约为 0.3 FPS,对于默认的 BODY_25 模型的运行速度约为 0.1 FPS (如,大约 15秒/每帧). 采用 COCO 模型或减少 net_resolution
.
矛盾事实:CPU 版本 OpenPose,BODY_25 模型比 COCO 模型大约慢 5x 倍,但 GPU 版本却快了大约 40%.