Linux MediaPipe C++版手势识别环境搭建与编译
环境:Ubuntu18.04,gcc/g++ version>8.0, OpenCV version==3.4, Bazel version==3.7.2
1、安装Bazel
见官方文档:Installing Bazel using Bazelisk - Bazel main
2、下载MedianPipe源码
git clone https://github.com/google/mediapipe.gitcd mediapipe
3、安装OpenCV和FFmpeg
MedianPipe源码根目录中有写好的脚本setup_opencv.sh,但是在执行的时候很多opencv的前置依赖项并未安装,导致编译不通过;
参照此文章OpenCV-3编译安装方法及常见错误解决(Ubuntu平台) - 尚码园 安装前置依赖方可正常编译通过。
建议第一次编译不通过时,将setup_opencv.sh下载的opencv3.4和对应的contrib文件备份,同时注释下面几行代码:
#rm -rf /tmp/build_opencv#mkdir /tmp/build_opencvcd /tmp/build_opencv#git clone git://github.com/opencv/opencv_contrib.git#git clone git://github.com/opencv/opencv.git
cmake .. 后面的选项加上 -DWITH_V4AL=OFF -DWITH_LIBV4L=ON
4、GCC版本问题
ubuntu18.04自带gcc-7.5,编译MediaPipe 的HellowWorld Demo没有问题,但是要进行手势识别的编译,就会报错:
ERROR: /home/ubuntu/mediapipe/mediapipe/calculators/tensor/BUILD:657:11: C++ compilation of rule '//mediapipe/calculators/tensor:image_to_tensor_converter_o
pencv' failed (Exit 1): gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonh
eap-object -fno-omit-frame-pointer -g0 -O2 '-D_FORTIFY_SOURCE=1' -DNDEBUG -ffunction-sections ... (remaining 57 argument(s) skipped)Use --sandbox_debug to see verbose messages from the sandbox gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wun
used-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -g0 -O2 '-D_FORTIFY_SOURCE=1' -DNDEBUG -ffunction-sections ... (remaining 57 argumen
t(s) skipped)Use --sandbox_debug to see verbose messages from the sandbox
mediapipe/calculators/tensor/image_to_tensor_converter_opencv.cc: In member function 'virtual absl::lts_20210324::StatusOrmediapipe::Tensor mediapipe::{an
onymous}::OpenCvProcessor::Convert(const mediapipe::Image&, const mediapipe::RotatedRect&, const mediapipe::Size&, float, float)':
mediapipe/calculators/tensor/image_to_tensor_converter_opencv.cc:106:12: error: could not convert 'tensor' from 'mediapipe::Tensor' to 'absl::lts_20210324::
StatusOrmediapipe::Tensor'
return tensor;
^~~~~~
Target //mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu failed to build
原因就是gcc版本过低,
//mediapipe/calculators/tensor:image_to_tensor_converter_gl_buffer · Issue #1684 · google/mediapipe · GitHub
更新gcc、g++至8.0版本之后即可解决该问题;
接下来再编译手势识别代码可能遇到:
[ERROR]
/home/base/.cache/bazel/_bazel_base/10f4be354af48e783fcaf1c23632155f/external/com_google_absl/absl/types/BUILD.bazel:54:11: undeclared inclusion(s) in rule '@com_google_absl//absl/types:bad_any_cast_impl':
this rule is missing dependency declarations for the following files included by 'com_google_absl/absl/types/bad_any_cast.cc':
'/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h'
'/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h'
'/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h'
Target //mediapipe/examples/desktop/libexample:libexample.so failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 1.981s, Critical Path: 0.28s
INFO: 106 processes: 106 internal.
FAILED: Build did NOT complete successfully
这是因为之前使用gcc-7.5版本编译,~/.cache/bazel中保留了7.5版本的缓存,直接升级gcc-8/9后,出现版本不对应的问题;解决方法:删除该文件夹。
接下来再次编译,可能遇到问题:
ERROR: /home/base/workspace/mediapipe/mediapipe/examples/desktop/hand_tracking/BUILD:27:10: Linking of rule '//mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu' failed (Exit 1): gcc failed: error executing command /usr/bin/gcc @bazel-out/k8-opt/bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu-2.params
原因:opencv三方库没有全部链接上,修改opencv_linux.BUILD中的链接选项即可。
5、lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
/home/base/workspace/mediapipe/mediapipe/framework/tool/BUILD:107:10: Linking of rule '//mediapipe/framework/tool:encode_as_c_string' failed (Exit 1): crosstool_wrapper_driver_is_not_gcc failed: error executing command external/local_config_cuda/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc @bazel-out/host/bin/mediapipe/framework/tool/encode_as_c_string-2.params
/usr/bin/ld: bazel-out/host/bin/external/com_google_absl/absl/strings/libstrings.a(charconv.o): undefined reference to symbol 'nan@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
但是,由于对bazel编译工具不熟悉,找不到对应链接库的位置,无法解决该问题;经过查找,找到了类似解答:
Undefined reference to symbol 'ceil@@GLIBC_2.2.5' at build time · Issue #1171 · tensorflow/tensorflow · GitHub
undefined reference to symbol xx@@GLIBC_2.2.5 - 海滨银枪小霸王 - 博客园
c - ld: undefined reference to symbol 'log2@@GLIBC_2.2.5' - Stack Overflow
Issue in TensorFlow CUDA Support on Jetson Nano · Issue #852 · google/mediapipe · GitHub
最后在mediapipe找到了和我一模一样的问题,由于他遇到了前置问题,我没能第一时间发现他后面写的问题描述。
所有问题解决方法均指向了这条解决方式:
而和我相同问题的兄弟说:
没错:在mediapipe/BUILD at master · google/mediapipe · GitHub这里加上一句linkopts = ["-lm"],(注意有逗号)即可解决问题,而这坑爹的103行其实并不是当时的那一行,所以加入只会报错。但是这个方法确实是对的,需要在编译的时候加入对应的链接库。
回头再看error内容:
第一句
/home/base/workspace/mediapipe/mediapipe/framework/tool/BUILD:107:10: Linking of rule '//mediapipe/framework/tool:encode_as_c_string' failed (Exit 1):
实际encode_as_c_string在 110行;
第二句
查看 bazel-out/host/bin/mediapipe/framework/tool/encode_as_c_string-2.params
这里-pthread等就是加入的编译相关链接库,直接在后面加入-lm试试;编译同时提示内容已经发生改变,再回头看看报错信息:
Linking of xxx/tool:encode_as_c_string error
原来是/home/base/workspace/mediapipe/mediapipe/framework/tool/BUILD中的encode_as_c_string这段需要补上对应的链接库
cc_binary(name = "encode_as_c_string",srcs = ["encode_as_c_string.cc"],visibility = ["//visibility:public"],deps = ["@com_google_absl//absl/strings",],
)
所以在里面加入 linkopts = ["-lm"], (注意有英文逗号)。
修改后编译生成的
bazel-out/host/bin/mediapipe/framework/tool/encode_as_c_string-2.params
中新加入了 -lm, 即可解决该问题。
Linux MediaPipe C++版手势识别环境搭建与编译相关推荐
- 小知识点:ARM 架构 Linux 大数据集群基础环境搭建(Hadoop、MySQL、Hive、Spark、Flink、ZK、Kafka、Nginx、Node)
换了 M2 芯片的 Mac,以前 x86 版本的 Linux 大数据集群基础环境搭建在 ARM 架构的虚拟机集群上有些用不了了,现在重新写一份基于 ARM 架构的,少数不兼容之外其他都差不多,相当 ...
- 【Linux Mint 深度学习开发环境搭建】开发软件安装
系列文章目录 第一章 Linux mint 深度学习开发环境搭建之Nvidia显卡相关软件安装 第二章 Linux mint 深度学习开发环境搭建之开发软件安装 第三章 Linux mint 深度学习 ...
- linux 下51单片机开发环境搭建
linux 下51单片机开发环境搭建(arch linux) 编译sdcc 软件: sdcc 命令:sdcc file.c 得到一堆文件需要( .inx) 命令: packihx file.inx & ...
- Linux 下的 ActiveMQ C++ 环境搭建与测试
Linux 下的 ActiveMQ C++ 环境搭建与测试 一.下载安装jdk jdk官网下载地址:https://www.oracle.com/technetwork/java/javase/dow ...
- linux设备驱动开发之环境搭建(基于exynos4412)
第一章 linux设备驱动开发之环境搭建(基于exynos4412) 目录 第一章 linux设备驱动开发之环境搭建(基于exynos4412) 1.搭建开发板运行环境 1.1.交叉开发模式 安装交叉 ...
- 高通Android智能平台环境搭建_编译流程分析
高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...
- -i 可以编译添加多个_大咖说 | 基于 NXP i.MX8 eIQ 环境搭建和编译
一.前言 NXP 针对 Machine Learning ( ML ) 创建了 eIQ 工具,以方便开发者在 i.MX 系列设备上开发 ML 相关应用. 本篇将会分两个章节,一章节介绍 eIQ 软件, ...
- 高通平台开发环境搭建、编译、烧录(android5.1以上系统)
高通平台开发环境搭建.编译.烧录(android5.1以上系统) 以MSN8937为例 1. 安装Ubuntu(12.04LTS以上稳定版本) 安装过程中必须以根用户登录或使用sudo获取ro ...
- FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译
FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, M ...
最新文章
- 趣味图形之 余弦函数cos与直线相交(另一种相交)
- 理解MapReduce
- matlab画梅花,基于Matlab图像素描生成算法究.doc
- node实战学习纪录
- oracle大对象实例_Oracle解析复杂json的方法实例详解
- lintcode: 跳跃游戏 II
- 解决larave-dompdf中文字体显示问题
- 统计vs机器学习,数据领域的“少林和武当”!
- jq事件不自执行方法
- Android异步载入AsyncTask具体解释
- 安卓程序代写 网上程序代写[原]Android开发技巧--ListView
- H.264学习过程中遇到的英文缩写整理
- Ubalun电动牙刷拆卸及内部刨析
- 2022NISCTF--web
- 文件夹排序(先文件夹排序,后文件排序)
- 在cmd中遍历局域网内的IP命令解析
- so-vits-svc4.0 中文详细安装、训练、推理使用教程
- “华为杯”第一届中国研究生网络安全创新大赛
- 程序员的核心竞争力分享
- 什么是反向代理服务器
热门文章
- 易经与计算机科学,人与计算机的思维模式区别,以及计算机的易经八卦运算
- 量子计算机与易经,易经卦象的演化过程,就是一个量子计算机模型?
- 蚂蚁金服暂缓上市,程序IT圈炸了
- 2014 微软校招笔试答案 编程题
- 霍涛的HashMap由 数组 + 链表 组成
- 【LeetCode】77. Combinations 解题报告(Python C++)
- 云计算服务模型,第 2 部分: 平台即服务(PaaS)
- kubernetes指令合集
- STM32串口读取一帧数据USART_IT_IDLE
- 欧盟将启动超40亿欧元投资,提升数字经济领域竞争力