十三、Ubuntu18.04下配置C++版本的mediapipe

2023-11-05

1.官方教程

Ubuntu下配置C++版本的mediapipe

2.记录我的配置过程

我的配置过程基本上是按照官方教程来的,只不过会更加详细一些

2.1 安装Bazelisk

bazelisk是 官方提供的 bazel 包装器
bazel是Google开源的一套类似于Make的编译构建工具

我这里是通过npm安装bazelisk,所以需要先安装npm:

sudo apt-get install npm

安装失败:
在这里插入图片描述
再加一句,然后重新安装npm:

 ## 不过在安装nodejs-dev node-gyp这个东西的时候,把我的ROS(melodic版本)的很多库都卸载了,不知道会不会影响ROS的使用
sudo apt-get install nodejs-dev node-gyp libssl1.0-dev
sudo apt-get install npm

然后再安装bazelisk

## -g指的是全局安装,这样就不用每次开启terminal都跑一次bazelisk指令了
sudo npm install -g @bazel/bazelisk

在这里插入图片描述

2.2 安装mediapipe库

按照官网的教程走即可,将miediapie的源码,放到/home/下面
可以看到家目录下,多了一个mediapipe的文件夹

cd $HOME
git clone https://github.com/google/mediapipe.git

在这里插入图片描述

2.3 安装OpenCv和FFmpeg

首先是安装FFmpeg,直接在终端输入以下指令,即可完成安装

sudo apt-get install -y \
    libopencv-core-dev \
    libopencv-highgui-dev \
    libopencv-calib3d-dev \
    libopencv-features2d-dev \
    libopencv-imgproc-dev \
    libopencv-video-dev

不过我这里显示已经装过了,也不知道是啥时候装的,先不管了
在这里插入图片描述
然后再通过运行setup_opencv.sh以从源代码自动构建 OpenCV 并修改 MediaPipe 的 OpenCV 配置
这是最简单的方式,这是一个批处理文件,谷歌已经帮我们配置好了环境变量,直接运行就可以安装OpenCV3

## 进入从github上面下载下来的源码文件夹“mediapipe”
cd mediapipe
## 然后直接运行“mediapipe”文件夹里面的setup_opencv.sh这个文件
./setup_opencv.sh

这一步一定要多试几次,因为网络问题非常容易失败
在这里插入图片描述
输入以下指令,可以查看自己的OpenCV版本
装完之后,我这边显示的是3.4.18,我记得装之前是OpenCV 2.几的版本

## 查看OpenCV版本
pkg-config --modversion opencv

在这里插入图片描述

2.4 运行helloworld(CPU)

## 先进入源码所在的文件夹
cd mediapipe
export GLOG_logtostderr=1
## 只使用CPU运行
bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
    mediapipe/examples/desktop/hello_world:hello_world

报错了:好像是没安装numpy
在这里插入图片描述
缺啥装啥就完事了

sudo apt-get install python3-pip
sudo apt-get install python3-numpy

然后继续运行helloworld,成功!
到此就已经成功把mediapipe安装完成了!
在这里插入图片描述

2.5 编译和运行hand_tracking(CPU)

## 进入源码所在的目录
cd mediapipe
## 用bazel编译hand_tracking的代码
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu
## 运行编译好的代码
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt

报错了,这是因为gcc的版本太低了!
在这里插入图片描述

ubuntu18.04自带的gcc 7.5.0编译HellowWorld没有问题,但是要进行hand_tracking的编译,就会报错:
在这里插入图片描述
解决办法:将gcc、g++都升级至8.0版本

## 安装gcc-8 和 g++-8版本
sudo apt-get install gcc-8
sudo apt-get install g++-8
## 设置优先级
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/g++-8 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/g++-7 50

可以看到现在gcc和g++编译器的版本已经升级到8.4.0了
在这里插入图片描述

然后再次运行hand_tracking,又报错:
在这里插入图片描述
这是因为之前使用gcc-7.5版本编译,在~/.cache/bazel中(这是隐藏文件,按Ctrl + H就能看见)保留了7.5版本的缓存,直接升级gcc-8后,出现版本不对应的问题,所以要将这个bazel文件夹直接删掉
在这里插入图片描述
然后再次运行hand_tracking,这次没报错了,编译成功!

可以看到下面这个文件夹里,编译生成了相关的文件!
在这里插入图片描述
PS:看别人的博客,删除了~/.cache/bazel这个文件,还是编译不通过,还会报错:
ERROR1:

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中的链接选项即可

ERROR2:

/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

解决方案:在mediapipe/mediapipe/framework/tool/BUILD中的110行后面,加入 linkopts = [“-lm”], (注意有英文逗号)

但是我在配置的过程中是没有遇到这两个ERROR的,我在删除了~/.cache/bazel这个文件之后就编译通过了
然后输入以下指令就可以直接运行了!!!

## 进入源码所在的目录
cd mediapipe
## 运行之前编译好的代码
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt

在这里插入图片描述

2.6 编译和运行face_detection(CPU)

## 进入源码所在的目录
cd mediapipe
## 用bazel编译face_detection的代码
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/face_detection:face_detection_cpu
## 运行之前编译好的代码
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/face_detection/face_detection_cpu --calculator_graph_config_file=mediapipe/graphs/face_detection/face_detection_desktop_live.pbtxt

2.7 编译和运行face_mesh(CPU)

## 进入源码所在的目录
cd mediapipe
## 用bazel编译face_mesh的代码
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/face_mesh:face_mesh_cpu
## 运行之前编译好的代码
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/face_mesh/face_mesh_cpu --calculator_graph_config_file=mediapipe/graphs/face_mesh/face_mesh_desktop_live.pbtxt

报错:
找不到Can't find file: mediapipe/modules/face_detection/face_detection_short_range.tflite
找不到Can't find file: mediapipe/modules/face_landmark/face_landmark_with_attention.tflite
这是因为,源码中并不包含这两个文件,必须去官网下载
在这里插入图片描述
然后放到对应的路径下即可
在这里插入图片描述
在这里插入图片描述

2.8 编译和运行Iris(CPU)

报错:Can't find file: mediapipe/modules/face_landmark/face_landmark.tflite
解决方法如上,去官网下载face_landmark.tflite文件,放到目录下:
在这里插入图片描述

## 进入源码所在的目录
cd mediapipe
## 用bazel编译Iris的代码
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/iris_tracking:iris_tracking_cpu
## 运行之前编译好的代码
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/iris_tracking/iris_tracking_cpu --calculator_graph_config_file=mediapipe/graphs/iris_tracking/iris_tracking_cpu.pbtxt

2.9 编译和运行Objectron (3D Object Detection)(CPU)

在这里插入图片描述

同理要检测鞋子shoe,就要去官网下载object_detection_3d_sneakers.tflite,放到mediapipe/modules/objectron/object_detection_3d_sneakers.tflite目录下

同理要检测杯子cup,就要去官网下载object_detection_3d_cup.tflite,放到 mediapipe/modules/objectron/object_detection_3d_cup.tflite目录下

在这里插入图片描述

## 进入源码所在的目录
cd mediapipe
## 用bazel编译Objectron的代码
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/object_detection_3d:objectron_cpu

## 检测杯子cup,输入输出路径需要自己指定,路径不能含有中文!!!!!视频格式必须是mp4!!!!!!
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/object_detection_3d/objectron_cpu \
  --calculator_graph_config_file=mediapipe/graphs/object_detection_3d/objectron_desktop_cpu.pbtxt \
  --input_side_packets=input_video_path=/home/yao/My_Mediapipe_config/myinput/mycup.mp4,output_video_path=/home/yao/My_Mediapipe_config/myoutput/res_cup.mp4,box_landmark_model_path=	mediapipe/modules/objectron/object_detection_3d_cup.tflite,allowed_labels=Mug

## 检测鞋子shoes,输入输出路径需要自己指定,路径不能含有中文!!!!!视频格式必须是mp4!!!!!!
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/object_detection_3d/objectron_cpu \
  --calculator_graph_config_file=mediapipe/graphs/object_detection_3d/objectron_desktop_cpu.pbtxt \
  --input_side_packets=input_video_path=/home/yao/My_Mediapipe_config/myinput/myshoes.mp4,output_video_path=/home/yao/My_Mediapipe_config/myoutput/res_shoes.mp4,box_landmark_model_path=	mediapipe/modules/objectron/object_detection_3d_sneakers.tflite,allowed_labels=Footwear

检测马克杯 Mug的结果:

在这里插入图片描述

检测鞋子 Footwear的结果:
在这里插入图片描述

3.其他Bug

有时候,在运行完一个demo以后(例如,face_mesh),再运行其他已经编译好的demo(例如,hand_tracking)有可能还会报错找不到.tflite文件,这个时候一般只需要重新编译再运行即可

4.参考

Ubuntu上安装MediaPipe
Ubuntu 布置Mediapipe环境
Windows10 编译Mediapipe C++版本保姆级教程
Linux MediaPipe C++版手势识别环境搭建与编译
Ubuntu下编译mediapipe,C++
MediaPipe的编译与测试
mediapipe 编译命令、运行命令、以及部分解释
mediapipe教程1:python代码
mediapipe教程2:linux桌面程序编译与运行
Ubuntu升级编译器版本 从gcc5到gcc7
Ubuntu18.04降低/升级编译器版本(实测有效)
Mediapipe - 将Mediapipe handtracking封装成动态链接库dll/so
手部21个关键点检测+手势识别-[MediaPipe]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十三、Ubuntu18.04下配置C++版本的mediapipe 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Scala环境配置完成,在命令行还是不能运行

    刚开始我以为是版本兼容的问题 所以下载了很多个版本 发现没用 我找了很久都不知道是什么原因 网上也没找到跟我一样的问题 偶然我发现是系统环境变量PATHEXT中缺少东西 在PATHEXT中添加 bat 然后就可以了
  • AIX系统安装

    1 选择安装介质 CD ROM 现有备份的安装系统 网络安装 Token Ring Ethernet FDDI U盘 服务器通电启动系统 在控制台显示器出现keyboard字符时 按对应的按钮 1 进入系统管理服务模式 SMS 2 指定控制
  • C语言中结构体初始化并清零的方法有几种?

    结构体初始化清零方法 在C语言中 结构体初始化并清零的方法有以下几种 手动赋值为0 结构体定义后在函数内手动将每个成员都赋值为0 例如 struct MyStruct int a char b float c struct MyStruct
  • vue页面基本组成

    作为编写过html的人 vue页面的基本组成是什么呢 如何快速入手vue呢 我来讲下自己的思路 简介 vue是一个前端框架 运行它需要下载node js 后台支撑 下载vs code 代码编辑器 来编辑代码 可配合eliment ui 上百
  • nodejs处理图片文件上传

    如果使用express框架的话 其内置模块就可以直接处理文件上传了 而不需要饱含额外的模块 express版本 3 4 4 1 使用bodyParser过滤器 并且指定上传的目录为public upload 注意这里的目录为相对于expre
  • PyQt5学习笔记--GridLayout、FormLayout和StackedLayout布局

    目录 1 GridLayout布局 2 FormLayout布局 3 StackedLayout布局 1 GridLayout布局 import sys from PyQt5 QtWidgets import class MyWindow
  • select、poll、epoll

    因为实际需要所致 我们不得不考虑在现有的开源 商用的应用服务器之外开发一个 有性能要求 有并发要求的服务端应用 从技术要求的角度来分析一下 用Java实现这件事情我们可能关注的知识层面 在整体上 可能需要我们从下面几个层面出发来考虑 1 在
  • windows多个不同java共存

    windows多个不同java共存 如图我电脑存在java1 8和15 使用时 我会存在工具支持的java版本不一样 有的工具要8才能使用有的工具需要11或者15以上java才能正常使用 于是为了方便快捷便写了这个多java版本共存 jav
  • 微服务SpringCloud

    什么是SpringCloud SpringCloud是由Spring提供的一套能够快速搭建微服务架构程序的框架集 SpringCloud本身不是一个框架 而是一系列框架的统称 SpringClound就是为了搭建微服务架构才出现的 有人将S
  • Linux如何查看系统时间

    文章目录 一 使用date命令查看系统时间 二 通过 var log syslog文件查看系统时间 三 通过 proc uptime文件查看系统运行时间 四 通过hwclock命令查看硬件时间 五 通过timedatectl命令设置系统时区
  • Python实现普通二叉树

    Python实现普通二叉树 二叉树是每个节点最多有两个子树的树结构 本文使用Python来实现普通的二叉树 关于二叉树的介绍 可以参考 https blog csdn net weixin 43790276 article details
  • MES系统是什么?MES系统的主要功能是什么?看完本文就知道

    MES系统是什么 MES系统是一套面向制造企业车间执行层的生产信息化管理系统 MES可以为企业提供包括制造数据管理 计划排程管理 生产调度管理 库存管理 质量管理 人力资源管理 工作中心 设备管理 工具工装管理 采购管理 成本管理 项目看板
  • PytorchCNN项目搭建 6--- 训练、验证CNN

    PytorchCNN项目搭建 6 训练 验证CNN 1 配置args cfg log 等 2 将数据集dataset经DataLoader变成dataloader 3 加载网络net 4 选择损失函数和优化器 5 训练网络 得到损失值 主函
  • 【qt】蒙版mask使用

    蒙版 mask 蒙版基本概念 在绘图软件中 蒙版类似于蒙在原始图片上的一块玻璃 即蒙版 然后我们再在这块玻璃上使用其他工具对图片进行修改 这样就不会破坏原始图片 而又能看到图片修改后的效果 蒙版通常是黑白色的 通常通过改变蒙版 玻璃 的灰度
  • node 加密解密模块_Node之加密与解密处理

    crypto模块概述 在Node js中 使用OpenSSL类库作为其内部实现加密与解密处理的基础手段 这是因为目前OpenSSL已经成为了一个经过严格测试的可靠的加密与解密算法的实现工具 在Node js中 OpenSSL类库被封装在cr
  • 真正解决Pandas写入excel的多sheet问题

    真正解决Pandas写入excel的多sheet问题 遇到需要利用pandas的to excel 在同一个Excel文件中 循环在不同的sheet中写入数据 但查阅大量资料 基本都无法利用for循环 在 sheet1 sheet2 shee
  • java中native的用法

    Java开发中会碰到声明为 native的方法 如 public native int hashCode 这是一个native方法 为什么存在native方法呢 Java不是完美的 Java的不足除了体现在运行速度上要比传统的C 慢许多之外
  • 数学建模写作模板及排版经验(超全)

    开篇福利分享 链接 https pan baidu com s 10hJMmLw8pQ5r3csnnySH g pwd msy3 提取码 msy3 论文是建模中最后的一环也是最关键的一环 这环做好了那就圆满了 做砸了全功尽弃 了 关于怎么写
  • Raspberry Pi和Python OpenCV人工神经网络和卷积神经网络演示及其机器学习微型框架

    首先 主要讨论和演示机器学习中使用的基本数据模型及其演示 其次开始的深度学习讨论 然后 探讨 ANN 和 CNN 如何预测结果 例如 当呈现未知图像时 CNN 将尝试将其识别为属于它已被训练识别的类别之一 Raspberry Pi机器学习
  • 十三、Ubuntu18.04下配置C++版本的mediapipe

    十三 Ubuntu18 04下配置C 版本的mediapipe 1 官方教程 2 记录我的配置过程 2 1 安装Bazelisk 2 2 安装mediapipe库 2 3 安装OpenCv和FFmpeg 2 4 运行helloworld C