linux bazel构建mediapipe源码
参考网址:
https://google.github.io/mediapipe/getting_started/install.html
记录一下debia上编译mediapipe的过程:
1.准备Bazelisk
sudo wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64
sudo chmod +x /usr/local/bin/bazel
2.源码下载:
$ cd $HOME
$ git clone https://github.com/google/mediapipe.git
# Change directory into MediaPipe root directory
$ cd mediapipe
我是手动下载的mediapipe-0.8.11.zip,🏠之后直接进入即可。
3.安装opencv
bash setup_opencv.sh
中间可能遇到opencv无法下载,多尝试几次
在opencv.sh中每次重来都会删除/tmp/build_opencv然后重新开始、
如下git下载缓慢,
git clone https://github.com/opencv/opencv_contrib.git
git clone https://github.com/opencv/opencv.git
可以有如下解决方案:
3.1.注释掉如下代码,然后自己手动下载这两个git放到对应的目录之后,重新运行
注释:
#rm -rf /tmp/build_opencv
#mkdir /tmp/build_opencv
#git clone https://github.com/opencv/opencv_contrib.git
#git clone https://github.com/opencv/opencv.git
然后bash setup_opencv.sh
3.2.将git命令改为从国内镜像下载:
git clone https://github.com/opencv/opencv_contrib.git --> git clone https://gitcode.net/opencv/opencv_contrib.git
git clone https://github.com/opencv/opencv.git --> git clone https://gitcode.net/opencv/opencv.git
其中opencv_contrib.git我还是从github.com下载的,不知道gitcode.net能否找到
4.安装gpu支持
sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev
export GLOG_logtostderr=1
bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world
bazel run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/hello_world:hello_world --verbose_failures
一直报time.h的报错,最后添加--linkopt=-lr编译成功
bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world -c opt --verbose_failures --linkopt=-lrt
sudo apt install libart-2.0-dev
实际最后发现是我自己的个人账户没法访问librt.so,sudo账户就没有问题,sudo会有将bazelout放到root的风险,所以还需要显示指出bazelout的存放目录:
sudo bazel --output_user_root=/自己的路径/mediapipe/mediapipe-0.8.11/out/out run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/hello_world:hello_world --verbose_failures --cxxopt=-fpermissive --cxxopt=-Wno-error
sudo bazel --output_user_root=/自己的路径/mediapipe/mediapipe-0.8.11/out/out run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world -c opt --verbose_failures
5.android编译环境安装:
bash setup_android_sdk_and_ndk.sh
echo $ANDROID_NDK_HOME
bash setup_android_sdk_and_ndk.sh
export ANDROID_HOME=/自己的路径/Android/Sdk
export ANDROID_NDK_HOME=/自己的路径/Android/Sdk/ndk-bundle/android-ndk-r21
echo $ANDROID_NDK_HOME
使用setup_android_sdk_and_ndk.sh后WORKSPACE中会自动加入:
android_sdk_repository(name = "androidsdk", path = "/自己的路径/Android/Sdk")
android_ndk_repository(name = "androidndk", api_level=21, path = "/自己的路径/Android/Sdk/ndk-bundle/android-ndk-r21")
6.开始编译android的samples:
bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu:handtrackinggpu
会提示找不到java,添加:--java_runtime_version=remotejdk_11
bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu:handtrackinggpu --java_runtime_version=remotejdk_11
会发现opencv-3.4.3-android-sdk.zip始终因为网络不稳定下不来,可以自己下载,然后WORKSPACE中直接使用本地下载的文件:
http_archive(
name = "android_opencv",
build_file = "@//third_party:opencv_android.BUILD",
strip_prefix = "OpenCV-android-sdk",
type = "zip",
# url = "https://github.com/opencv/opencv/releases/download/3.4.3/opencv-3.4.3-android-sdk.zip",
url = "file:///自己的路径/mediapipe/opencv-3.4.3-android-sdk.zip"
)
接着发现@maven下不来,继续修改WORKSPACE,如下,注释掉访问不了的maven,使用阿里云的maven替换
maven_install(
...
repositories = [
#"https://dl.google.com/dl/android/maven2",
"https://repo1.maven.org/maven2",
#"https://jcenter.bintray.com",
"http://maven.aliyun.com/nexus/content/repositories/google",
"http://maven.aliyun.com/nexus/content/repositories/jcenter",
"http://maven.aliyun.com/nexus/content/groups/public/",
],
)
最后发现可以编译了,但是卡在了
bazel-out/k8-opt/bin/external/com_google_absl/absl/base/_objs/base/sysinfo.o:sysinfo.cc:function absl::lts_20210324::base_internal::ReadMonotonicClockNanos(): error: undefined reference to 'clock_gettime'
添加--linkopt=-lrt也还是报错。
查看资料发现,其实glibc2.17之后是不需要添加-lrt选项的,怀疑是自己的账户权限不对,所以改成使用sudo,解决了问题,最后编译指令变成:
sudo bazel output_user_root=/自己的路径/mediapipe/mediapipe-0.8.11/out/ build -c opt --strip=ALWAYS --config=android_arm64 --fat_apk_cpu=arm64-v8a,armeabi-v7a mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu_aar:mediapipe_hand_tracking.aar --java_runtime_version=remotejdk_11 --verbose_failures
备注:/自己的路径/mediapipe/mediapipe-0.8.11/out/这个路径是自动创建的,不要外部创建
编译solutioncore
sudo bazel --output_user_root=/自己的路径/mediapipe/mediapipe-0.8.11/out/out build --strip=always --linkopt=-Wl,--strip-all -c opt --config=android_arm64 --fat_apk_cpu=arm64-v8a,armeabi-v7a mediapipe/java/com/google/mediapipe/solutioncore:solution_core.aar --java_runtime_version=remotejdk_11 --verbose_failures
另外指令--strip=never --copt -g选项会让so变得特别大,所以建议不要使用。
总结:
遇到的问题:
1.备注使用sudo编译时提示numpy找不到,使用如下指令安装pip(pip已有可忽略)和numpy
sudo apt install python3-pip
sudo pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
2.java环境找不到
--java_runtime_version=remotejdk_11 会自动下载
3.maven无法下载:
改为使用阿里云的源
"http://maven.aliyun.com/nexus/content/repositories/google",
"http://maven.aliyun.com/nexus/content/repositories/jcenter",
"http://maven.aliyun.com/nexus/content/groups/public/",
4.其他git无法下载等
找到对应报错的地方,用自己下的替换或者修改git源
5.undefined reference to 'clock_gettime'
尝试用sudo编译看看
目前怎么编译不带符号表的库还没找到方法,待继续跟进。