最近因一个项目需要用到google的mediapipe包进行手部识别,效果不错便想将其移植到jetson nano的ubuntu系统上。坑不少,在这里记录一下过程。
一、Windows10的安装方法
windows10安装很简单,直接打开cmd用pip安装就行:
pip3 install mediapipe -i https://pypi.tuna.tsinghua.edu.cn/simple’‘’
二、Jetson Nano下的安装方法
mediapipe 没有提供aarch64的wheel文件,因此需要源码编译。官方用的系统是ubuntu20,我用的是ubuntu18,步骤一致。
先贴出官方的安装方法: MediaPipe Python on aarch64 Ubuntu 20.04 顺利的话照着顺序和解决方案做就可以安装完成了。 下面是我按照官方安装的步骤进行安装以及每一步遇到的错误和解决方法:
1、首先下载Mediapipe文件并安装bazel (官方的编译器)
$ clone https://github.com/google/mediapipe.git
这里我们安装 bazel 4.0.0版本的,其他版本可能会出现警告,安装方法参考这篇文章:在jetson nano上安装bazel 安装完然后检查一下版本就行了:
$ bazel version
2、安装依赖
$ sudo apt install -y python3-dev
$ sudo apt install -y cmake
3、安装编译器
$ sudo apt install -y protobuf-compiler
后面编译的时候如果出现缺少any.proto错误,这意味着protoc可能太旧,您可以从GitHub下载最新的protoc-3.x.x-linux-aarch_64.zip(这里贴出3.18.0的下载链接),然后解压文件:
$ unzip protoc-3.x.x-linux-aarch_64.zip
然后将“bin”和include下的“google”复制到/mediapipe中。然后,修改mediapipe/setup.py,将
protoc_command = [self._protoc, ‘-I.’, ‘–python_out=.’, source]
修改为
protoc_command = [self._protoc, ‘-I.’, ‘-I/usr/local/include’, ‘–python_out=.’, source]
4、进mediapipe目录删除不必要的OpenCV模块和链接器标志。
$ cd mediapipe
$ sed -i -e "/\"imgcodecs\"/d;/\"calib3d\"/d;/\"features2d\"/d;/\"highgui\"/d;/\"video\"/d;/\"videoio\"/d" third_party/BUILD
$ sed -i -e "/-ljpeg/d;/-lpng/d;/-ltiff/d;/-lImath/d;/-lIlmImf/d;/-lHalf/d;/-lIex/d;/-lIlmThread/d;/-lrt/d;/-ldc1394/d;/-lavcodec/d;/-lavformat/d;/-lavutil/d;/-lswscale/d;/-lavresample/d" third_party/BUILD
5、修改文件
打开third_party/BUILD,定位到
“WITH_ITT”: “OFF”, “WITH_JASPER”: “OFF”, “WITH_WEBP”: “OFF”,
在后面添加两句,然后保存退出:
“ENABLE_NEON”: “OFF”, “WITH_TENGINE”: “OFF”,
6、编译
这一步问题最多并且耗时最久,一次编译要将近一个小时,每一次出错都要重新编译(摊手.jpg)
$ python3在这里插入代码片 setup.py gen_protos && python3 setup.py bdist_wheel
出现的错误:
1、缺少any.proto错误,解决方法看上面第3步。 2、return tensor错误: 这里的错误是因为gcc的版本太低,不能自动执行类型转换,有两个办法解决,第一个升级gcc7到gcc8,第二个是修改文件,将报错文件中的
return tensor
修改成
return absl::StatusOr< mediapipe::Tensor > ( mediapipe::Tensor(std::move(tensor)));
但是后面还会有另一个return报错,所以这里我用的是第一个方法一劳永逸:
升级gcc8: Ubuntu18.04 更新gcc和g++的版本号
3、this rule is missing dependency declarations for the following fles错误 清理bazel的缓存然后重新编译即可
rm -rf ~/.cache/bazel/
|