1. 显存不足 Out of Memory
错误如,Check failed: error == cudaSuccess (2 vs. 0) out of memory
.
有可能是没有使用 cuDNN,默认 Caffe 模型消耗 GPU 显存大于(>) 12GB,cuDNN 能够减少 BODY_25 模型 GPU 显存占用到约 2 GB,COCO 模型 GPU 显存占用减少到约 1.5 GB.
2. 运行速度优化问题
参考:
- doc/speed_up_preserving_accuracy.md
- doc/speed_up_preserving_accuracy.md#cpu-version
- doc/installation.md#profiling-speed
- Github 项目 - OpenPose 运行速度优化
3. BODY_25 & COCO & MPI 模型的差异
COCO 模型未来会被移除.
BODY_25 模型更快,更准,且新包括了脚部关键点(foot keypoints).
但,COCO 模型消耗 GPU 显存更少(默认参数设置时,可以送入 2GB 的 GPUs 显卡),而且在 CPU 模型运行更快.
MPI 模型只用于对 MPI-keypoints 结构的人体Pose,其比 BODY_25 更慢,精度更低.
BODY_25 - pose_deploy.prototxt
COCO - pose_deploy_linevec.prototxt
4. 其它项目应用 OpenPose API
场景:不只是使用 OpenPose Demo,计划将 OpenPose API 用于其它项目.
安装 OpenPose 头文件headers
和库文件 libraries
到系统环境路径(如:/usr/local/
或 /usr/
):
cd build/
sudo make install
安装完成后,即可采用 find_package
cmake 命令,在其它项目中应用 OpenPose.
如:CMakeLists.txt
中的小例子. 为了使用该脚本,需要复制 FindGFlags.cmake
和 FindGlog.cmake
到项目路径 <project_root_directory>/cmake/Modules/
(如果项目中没有该路径,则新创建该路径).
cmake_minimum_required(VERSION 2.8.7)
add_definitions(-std=c++11)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
find_package(GFlags)
find_package(Glog)
find_package(OpenCV)
find_package(OpenPose REQUIRED)
include_directories(${OpenPose_INCLUDE_DIRS} ${GFLAGS_INCLUDE_DIR} ${GLOG_INCLUDE_DIR} ${OpenCV_INCLUDE_DIRS})
add_executable(example.bin example.cpp)
target_link_libraries(example.bin ${OpenPose_LIBS} ${GFLAGS_LIBRARY} ${GLOG_LIBRARY} ${OpenCV_LIBS})
如果 Caffe 是与 OpenPose 一起编译的,会自动寻找到 Caffe. 否则,需要指定 Caffe 路径. (否则,可能出现错误:/usr/bin/ld: cannot find -lcaffe
):
link_directories(<path_to_caffe_installation>/caffe/build/install/lib)
7 comments
大哥还是大哥
作者您好,我看了一下openpose_deploy.prototxt文件,观察到它的输入Blob是1*3*16*16,这是什么东西的信息呢?如果是图像的话是不是太小了,如果是图像预处理后的结果,那预处理的文件是哪一个呀?
还有就是输出的Blob是1*78*2*2,是同时包含了heatmap和PAF么?该怎么理解和怎么提取呢?
deploy.prototxt 中的输入 blob 的维度中 16*16 是可变的,根据实际运行时输入来确定. 输出 blob 的维度是 1 x (num_jointx2) x out_heatmap_size1 x out_heatmap_size2. heatmap 是 1:num_joints; PAF 是 num_joints+1:num_jointsx2.
感谢老师的答复,对于"根据实际运行时的输入来确定"我还是有些不理解,是只项目的源代码在每次读取一帧图片的时候都改动了prototxt文件吗?
好了,我解决了这个问题了,应该是在初始化的时候设置了h*w,在运行的过程中对输入的图片先resize再输入神经网络进行处理,输出的信息根据原图大小再恢复
没有改动 prototxt,但是 reshape 了 prototxt 的网络输入 size.
嗯嗯,非常感谢您及时的解答