Mac 配置 openpose 的经历总结
文章目录
一、下载openpose资源
可以使用 git 命令(需要先找好安装位置):
git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose
或者手动去 github 下载。
二、安装所需环境
以下命令都在openpose主目录下执行。
2.1 HomeBrew
bash scripts/osx/install_brew.sh
可能出现的问题: 解决办法:在
/etc/hosts
里手动添加raw.githubusercontent.com
和其IP地址的映射。(值得注意的是这里是 refused 而不是 timed out)参考文章:https://blog.csdn.net/qq_43531694/article/details/106862753
2.2 CMake GUI
brew install --cask cmake
有些文档里可能会给出brew cask install cmake
,但是 big sur 已经不再支持这种写法,会报如下错误:
2.3 Caffe,OpenCV 等
bash scripts/osx/install_deps.sh
遇到了 2 个错误:
错误1:
The ‘brew link’ step did not complete successfully
解决方法:问题实际上就是我本地另一个路径下已经存在了这些文件。报错信息给出了两种方法,一种是删掉冲突文件(rm),另一种是建立链接(brew link),我用了第二种,没再出错。
brew link --overwrite python@3.9
错误2:
执行 pip install 时提示 no module named pip
刚看到这个问题我挺疑惑的,我明明装过pip,为什么提示我没有这个模块呢?后来发现这里用的是系统自带的python2.7 的 pip,而我曾装过的是 python3 的 pip,两者不通用。所以就安装 python2.7 的 pip:
sudo easy_install pip
但是报出了语法错误:
上网查了好多办法都没能解决,直觉猜测应该是 python2 和 python3 的兼容性问题。于是我就想,能不能不用 pip2,直接用 pip3 跑呢?于是我就找到 scripts/osx/install_deps.sh
,把 python2.7 改成了 python:
果然成功跑起来了。(当然理论上之后可能会出现别的问题,但幸运的是并没有)
紧接着又出现了新问题,跑是跑起来了,但是网络不行,超时了:
于是就换了国内源:
do
echo "sudo -H python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple $pkg"
sudo -H python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple "$pkg"
done
这次没有超时,但是报了新的 ERROR:
Google翻译一下是:pip 的依赖解析器当前不考虑所有已安装的包,此行为是以下依赖冲突的根源。意思就是说系统不会检查 opencv-python 和 numpy 的版本匹配问题,并且给出了一些具体的要求。但事实上我们所下载使用的版本并不是报错提示所显示的版本,而是openpose开发者自己限制的版本,所以理论上并不会出现版本兼容问题。另外,从 bash 的执行情况来看,这个 ERROR 并没有影响到程序的后续运行,所以我就没有管它。
当看到下面这段话,就说明安装成功了:
三、使用CMake编译
先在 openpose 主目录下新建一个 build 文件夹。
3.1 打开cmake
3.2 运行cmake
第一步:在前两行分别输入 openpose 根目录和其下的 build 文件夹路径
第二步:点击 Configure,中间的部分要 Configure完成后才有
第三步:确认信息无误后,点击 Generate
遇到了 2 个问题:
问题1:
提示 ./3rdparty/caffe
不是非空文件夹。
Caffe will be built from source now.
CMake Error at /Applications/CMake.app/Contents/share/cmake-3.17/Modules/ExternalProject.cmake:2659 (message):
No download info given for 'openpose_lib' and its source directory:
/Users/apple/Desktop/openpose-master/3rdparty/caffe
is not an existing non-empty directory. Please specify one of:
* SOURCE_DIR with an existing non-empty directory
* DOWNLOAD_COMMAND
* URL
* GIT_REPOSITORY
* SVN_REPOSITORY
* HG_REPOSITORY
* CVS_REPOSITORY and CVS_MODULE
Call Stack (most recent call first):
/Applications/CMake.app/Contents/share/cmake-3.17/Modules/ExternalProject.cmake:3267 (_ep_add_download_command)
CMakeLists.txt:796 (ExternalProject_Add)
查阅资料后发现 cmake GUI 无法帮我们下载 caffe,需要我们手动下载:
git clone https://github.com/CMU-Perceptual-Computing-Lab/caffe
问题2:
模型下载时间过长或卡住,如果能挂代理的话可以cd models
之后bash getModels.sh
手动下载。
或者用我的网盘资源:链接: https://pan.baidu.com/s/1Pt0gd0fNqWGud7lsZp7t7w 提取码: 2n3r ,下载好后放到models下的对应位置即可。
四、build
进入 build 目录,执行:
make -j`sysctl -n hw.logicalcpu`
报错:
原因是找不到 vecLib,没有它的路径。
解决方法:打开build/caffe/src/openpose_lib-build/CMakeCache.txt
文件,找到vecLib_INCLUDE_DIR:PATH=vecLib_INCLUDE_DIR-NOTFOUND
一行,从本机搜索找到vecLib.h
文件后将其路径覆盖掉vecLib_INCLUDE_DIR-NOTFOUND
。
作为参考,我所用的路径是/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/Headers/vecLib.h
。
再次build,中途出现了语法错误:
错误原因:protobuf 的新旧版本对 SetTotalBytesLimits 的定义不同。SetTotalBytesLimits 的作用是设置文件字节大小的上限,新版本只有一个参数就是上限(int),老版本有两个参数,分别是上限(int)和警告阈值(int)。于是去翻出错位置./3rdparty/caffe/src/caffe/util/io.cpp
的代码:
const int kProtoReadBytesLimit = INT_MAX; // Max size of 2 GB minus 1 byte.
// ... 省略若干行
coded_input->SetTotalBytesLimit (kProtoReadBytesLimit, 536870912);
实际上就是把 INT_MAX 作为文件大小上界,超出 536870912 就警告。为了迎合新版的定义,我们只需把第二个参数去掉即可,即:
coded_input->SetTotalBytesLimit (kProtoReadBytesLimit);
再次build,终于成功了。
五、测试Demo
退回主目录。
5.1 only body in image
./build/examples/openpose/openpose.bin --image_dir examples/media/
5.2 body + hand in image
./build/examples/openpose/openpose.bin --image_dir examples/media/ --hand
5.3 only body in video
./build/examples/openpose/openpose.bin --video examples/media/video.avi
六、Unity 插件(Mac不可用)
在成功安装好openpose后,我想尝试用一下官方提供的 Unity 插件,以便日后在 Unity 中做应用开发。步骤很简单,只需要在 CMake 的 generate 这一步里把 BUILD_UNITY_SUPPORT选上再重新generate+build即可:
但是理想很丰满,现实很骨感,直到编译完成运行 bin 文件时才报错:
不知道有没有其它的解决办法,只能日后慢慢探索了。