Centos7中MediaPipe编译
1. MediaPipe是什么?
MediaPipe是一个用于构建机器学习管道的框架,用于处理视频、音频等时间序列数据。这个跨平台框架适用于桌面/服务器、Android、iOS和嵌入式设备,如Raspberry Pi和Jetson Nano。
下面是用于对象检测与追踪的MediaPipe示例图,它由4个计算节点组成:PacketResampler计算器;先前发布的ObjectDetection子图;围绕上述BoxTrakcing子图的ObjectTracking子图;以及绘制可视化效果的Renderer子图。
Graphs
MediaPipe感知管道称为Graph。让我们以第一个solution为例,汉兹。我们输入一串图像作为输入,然后在图像上呈现手的landmarks。
下面的流程图代表MP(简称MediaPipe)hand solution graph。
在计算机科学术语中,图由边连接的节点组成。在MediaPipe Graph内部,节点称为Calculators,边缘称为Streams。每个流都携带一个时间戳递增的数据包序列
在上图中,我们用矩形块表示Calculators,用箭头表示Streams。
alculators(计算单元)
这些是用c++编写的特定计算单元,有分配的任务要处理。数据包(视频帧或音频段)通过计算单元的端口进入和离开。初始化计算器时,它声明将遍历端口的数据包有效负载类型。每当图形运行时,框架都会在计算器中实现Open、Process和Close方法。Open启动计算器;当数据包进入时,这个过程重复运行。整个图形运行后,进程关闭。
例如,考虑上图中显示的第一个计算单元。计算单元ImageTransform在输入端口获取图像,并在输出端口返回转换后的图像。另一方面,第二个计算单元imageto张量,将图像作为输入,并输出一个张量。
MediaPipe中的计算器类型
上面显示的所有计算单元都内置在MediaPipe中。我们可以把它们分成四类。
预处理计算单元是图像和媒体处理计算单元族。上图中的ImageTransform和imagetotensor就属于这一类
推理计算单元允许与Tensorflow和Tensorflow Lite进行ML推理的本地集成。
后处理计算单元执行ML后处理任务,如检测、分割和分类。TensorToLandmark是一个后处理计算单元。
计算单元工具是执行任务(如图像注释)的一类计算单元
计算单元api允许您编写自己的自定义计算器。
ObjectDetection子图仅在请求时运行,例如以任意帧速率或由特定信号触发。更具体地讲,在将视频帧传递到ObjectDetection之前,本示例中的PacketResampler将它们暂时采样为0.5 fps。你可以在PacketResampler中将这一选项配置为不同的帧速率。正是因为如此,在识别的时候可以时间抖动更少,而且可以跨帧维护对象ID。
安装Mediapipe框架
安装环境centos7, 首先需要安装和配置一下jdk,git等,这个自行安装和配置
1:安装bazel: 使用bazel编译Mediapipe的
Bazel是一个类似于Make,Maven和Gradle的开源构建和测试工具。Bazel支持多种语言混编的项目并且可以根据不同的平台输出不同的构建结果。
优势:
加快构建和测试速度:Bazel只重建必要的东西,借助缓存,优化依赖关系分析和并行执行,可以获得快速的和增量的构建。
支持多种语言:支持Java, C++, Android, iOS, Go和各种其他语言,可以运行在Windows,macOS和Linux上。
可扩展:可以扩展Bazel以支持您选择的语言
建议使用Bazelisk : Bazelisk is a launcher for Bazel which automatically downloads and installs an appropriate version of Bazel. Use Bazelisk if you need to switch between different versions of Bazel depending on the current working directory, or to always keep Bazel updated to the latest release.
Bazelisk是Bazel的一个启动器,会自动下载并安装适当版本的Bazel,如果需要根据当前工作目录在不同版本的Bazel之间切换,或者始终将Bazel更新到最新版本,可以使用Bazelisk更方便操作。
Bazelisk编译好的版本下载地址: https://github.com/bazelbuild/bazelisk/releases
我们选择 bazelisk-linux-amd64 版本 ,下载完成后可以将名称直接改为 bazelisk ; 当前也可以直接下载 bazel ,这里选择的版本是 5.2.0 。
2: 更新系统安装依赖环境
[root@anonymous python3]# yum update -y
3:更新gcc版本 , 如果不更新,编译过程中可能会出现: gcc: error: unrecognized command line option '-std=c++17'
安装过程点击: 查看
4: 下载mediapipe
git clone https://github.com/google/mediapipe.git
cd mediapipe
进入下载的目录 编辑 WORKSPACE 文件,
在repositories节点添加国内的镜像仓库,以下配置为添加完成的,前三项是新添加的;
repositories = [
"https://maven.aliyun.com/repository/google",
"https://maven.aliyun.com/repository/central",
"https://maven.aliyun.com/repository/public",
"https://maven.google.com",
"https://dl.google.com/dl/android/maven2",
"https://repo1.maven.org/maven2",
"https://jcenter.bintray.com",
],
5:安装python,Python这里安装在 /usr/local/python3 目录中,版本3.8 ,
查看 mediapipe 目录的 requirements.txt 文件,在当前的python环境中安装其中的组件。一键安装命令:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
6: 安装android sdk 和ndk 创建目录 /usr/local/android , /usr/local/android/ndk
执行 mediapipe目录中的 setup_android_sdk_and_ndk.sh 文件 , ndk版本r21
bash ./setup_android_sdk_and_ndk.sh /usr/local/android/sdk /usr/local/android/ndk r21
安装完成提示: 意思是设置环境变量
Android NDK is now installed. Consider setting $ANDROID_NDK_HOME environment variable to be /usr/local/android/ndk/android-ndk-r22
Set android_ndk_repository and android_sdk_repository in WORKSPACE
错误及处理:
如果在ubuntu中操作,可能会出现如下问题:Ubuntu 提示sudo: java: command not found
其中很多方法都提示要修改/etc/profile的配置,或是修改/etc/environment的配置。 但是改完之后依然无效。
应该是修改/etc/sudoers这个文件,在当前文件中添加java路径
在 /root/.bashrc文件中添加android配置
[root@anonymous mediapipe-master]# vim /root/.bashrc
export ANDROID_HOME=$PATH:/usr/local/android/sdk
export ANDROID_NDK_HOME=$PATH:/usr/local/android/ndk/android-ndk-r21
文件WORKSPACE中android的配置会在执行setup_android_sdk_and_ndk.sh时自动更新:
系统会在这个文件的最下面添加2行
android_sdk_repository(name = "androidsdk", path = "/usr/local/android/sdk")
android_ndk_repository(name = "androidndk", api_level=21, path = "/usr/local/android/ndk/android-ndk-r21")
没有的话自行添加
# You may run setup_android.sh to install Android SDK and NDK.
android_ndk_repository(
name = "androidndk",
path = "/usr/local/android/ndk/android-ndk-r21",
)
android_sdk_repository(
name = "androidsdk",
path = "/usr/local/android/sdk",
)
7: 安装opencv,可以直接运行 setup_opencv.sh 完成自动安装。
这里我使用手动安装的方式,不安装到opencv的默认目录,打开mediapipe中的 setup_opencv.sh 文件,可以看到安装的源码地址和版本
我们就按这个步骤来吧,新建一个目录,用 git 方式 下载 opencv_contrib 和 opencv 的源码,并且都切换到 3.4 版本
进入opencv 的源码目录,并创建目录release ,进入该目录依次执行下面的命令 ,注意配置好 opencv_contrib 的路径:
cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local/opencv \
-DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_ts=OFF \
-DOPENCV_EXTRA_MODULES_PATH=/home/wb888/download/opencv_contrib/modules \
-DBUILD_opencv_aruco=OFF -DBUILD_opencv_bgsegm=OFF -DBUILD_opencv_bioinspired=OFF \
-DBUILD_opencv_ccalib=OFF -DBUILD_opencv_datasets=OFF -DBUILD_opencv_dnn=OFF \
-DBUILD_opencv_dnn_objdetect=OFF -DBUILD_opencv_dpm=OFF -DBUILD_opencv_face=OFF \
-DBUILD_opencv_fuzzy=OFF -DBUILD_opencv_hfs=OFF -DBUILD_opencv_img_hash=OFF \
-DBUILD_opencv_js=OFF -DBUILD_opencv_line_descriptor=OFF -DBUILD_opencv_phase_unwrapping=OFF \
-DBUILD_opencv_plot=OFF -DBUILD_opencv_quality=OFF -DBUILD_opencv_reg=OFF \
-DBUILD_opencv_rgbd=OFF -DBUILD_opencv_saliency=OFF -DBUILD_opencv_shape=OFF \
-DBUILD_opencv_structured_light=OFF -DBUILD_opencv_surface_matching=OFF \
-DBUILD_opencv_world=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_xphoto=OFF \
-DCV_ENABLE_INTRINSICS=ON -DWITH_EIGEN=ON -DWITH_PTHREADS=ON -DWITH_PTHREADS_PF=ON \
-DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON
make -j 4
make install
系统配置opencv
touch /etc/ld.so.conf.d/mp_opencv.conf bash -c "echo /usr/local/opencv/lib64 >> /etc/ld.so.conf.d/mp_opencv.conf"
ldconfig -v
在WORKSPACE文件中 配置 opecv 文件,查看 setup_opencv.sh ,配置语句如下:
把这一段copy到一个sh文件中执行 config_opencv.sh,修改opencv的目录信息,
opencv_build_file="$( cd "$(dirname "$0")" ; pwd -P )"/third_party/opencv_linux.BUILD
workspace_file="$( cd "$(dirname "$0")" ; pwd -P )"/WORKSPACE
sed -i '/linkopts/a \ \ \ \ \ \ \ \ \"-L/usr/local/opencv/lib64",' $opencv_build_file
linux_opencv_config=$(grep -n 'linux_opencv' $workspace_file | awk -F ":" '{print $1}')
path_line=$((linux_opencv_config + 2))
echo $path_line
sed -i "$path_line d" $workspace_file
sed -i "$path_line i\ path = \"/usr/local/opencv\"," $workspace_file
echo "Done"
执行当前文件即可完成配置,实际是修改 third_party/opencv_linux.BUILD 和 WORKSPACE 文件
new_local_repository( name = "linux_opencv", build_file = "@//third_party:opencv_linux.BUILD", path = "/usr/local/opencv", )
mediapipe配置基本完成
执行以下语句:
export GLOG_logtostderr=1
bazelisk run --define MEDIAPIPE_DISABLE_GPU=1 \
--action_env PYTHON_BIN_PATH="/usr/local/python3/bin/python" \
mediapipe/examples/desktop/hello_world:hello_world
编译 MediaPipe 的 Android aar 包
Android的SDK和NDK已经配置好了,创建Mediapipe生成Android aar的编译文件
1: 生成需要的aar文件
在mediapipe/examples/android/src/java/com/google/mediapipe/apps中创建文件夹 build_aar , 并且在build_aar中创建文件 BUILD,内如如下:
load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar")
mediapipe_aar(
name = "mediapipe_pose_tracking",
calculators = ["//mediapipe/graphs/pose_tracking:pose_tracking_gpu_deps"],
)
编译文件BUILD中内容如下,name是生成后aar的名字,calculators为使用的模型和计算单元,其他的模型和支持计算单元可以查看 mediapipe/graphs/目录下的内容,在这个目录都是Mediapipe支持的模型。
其中目录 pose_tracking 就是使用到的模型,支持的计算单元需要查看该目录下的 BUILD 文件中的 cc_library 节点,可以有多个这样的节点 ,这里使用 pose_tracking_gpu_deps 计算单元
然后,执行命令:
bazelisk build -c opt --strip=ALWAYS \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--fat_apk_cpu=arm64-v8a,armeabi-v7a 、
--action_env PYTHON_BIN_PATH="/usr/local/python3/bin/python" \
mediapipe/examples/android/src/java/com/google/mediapipe/apps/build_aar:mediapipe_pose_tracking.aar
这个过程比较长,如果没有错误,则编译生成的aar文件在路径: bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/build_aar
2: 生成Mediapipe的二进制图
bazelisk build -c opt --action_env PYTHON_BIN_PATH="/usr/local/python3/bin/python3" \
mediapipe/graphs/pose_tracking:pose_tracking_gpu_binary_graph
生成文件的路径和名称: bazel-bin/mediapipe/graphs/pose_tracking/pose_tracking_gpu.binarypb 这格式android项目 assets 文件中的一个,
其它的assets 具体见 mediapipe/examples/android/src/java/com/google/mediapipe/apps/posetrackinggpu/BUILD中的assets节点
可以看出,我们需要的文件有三个 ,但是在源码中 mediapipe\modules\pose_detection 和 mediapipe\modules\pose_landmark 目录中并没有相关的文件,需要在 mediapipe 网站下载 :
下载地址: https://google.github.io/mediapipe/solutions/models 介绍了解模型需要的资源 , 还有其它资源开发也会用到
====================================================================================================
#1.app常规配置文件:mediapipe/examples/android/src/java/com/google/mediapipe/apps/posetrackinggpu/BUILD
manifest_values = {
"applicationId": "com.google.mediapipe.apps.posetrackinggpu",
"appName": "Pose Tracking",
"mainActivity": ".MainActivity",
"cameraFacingFront": "False",
"binaryGraphName": "pose_tracking_gpu.binarypb",
"inputVideoStreamName": "input_video",
"outputVideoStreamName": "output_video",
"flipFramesVertically": "True",
"converterNumBuffers": "2",
}
#2.执行器Graph结构:mediapipe/graphs/pose_tracking/pose_tracking_gpu.pbtxt
#3.视频显示内容配置:mediapipe/graphs/pose_tracking/subgraphs/pose_renderer_gpu.pbtxt
#4.姿态估计神经网络模型:mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite
mediapipe官网提供的人体关键点检测模型分为lite、full、heavy三个,由快到慢,由不准到准,可以自己选择,模型在路径mediapipe/modules/pose_landmark/下;
参考文档
//https://github.com/TowerYsable/mediapipe_pose_torch_Android
//https://github.com/LeeJeongHwi/Mediapipe_pose_Tracking_AAR_example
https://google.github.io/mediapipe/solutions/models#pose
https://google.github.io/mediapipe/solutions/pose#mobile
https://gitee.com/leesonzhong/test-media-pipe
https://google.github.io/mediapipe/solutions/pose#pose_landmarks
[基于PosNet的实时人体姿态估计]
https://blog.csdn.net/moxibingdao/article/details/106667114
https://blog.csdn.net/xavier_muse/article/details/93203093
https://blog.csdn.net/chen134225/article/details/112696943
https://www.cnblogs.com/xyb930826/p/6077534.html
https://blog.csdn.net/liuluoboliu/article/details/78060648
https://www.cnblogs.com/wangdongfang/p/13549816.html
linux 环境下python3 对google 的 protobuf 安装和使用 详解
https://blog.csdn.net/maylcc/article/details/103558367
CentOS7编译和安装GCC7.5
http://www.manongjc.com/detail/16-kvagwjteeglksuf.html
[Remove Line]
https://github.com/google/mediapipe/issues/943
安装cmake过程g++: 错误:unrecognized command line option ‘-std=gnu++14’
https://www.cnblogs.com/wangdongfang/p/13549816.html
========================================================================
问题及解决:
1:CMake Error: your CXX compiler: “CMAKE_CXX_COMPILER-NOTFOUND” was not found.
分类: LINUX2015-08-06 20:03:36
CMake Error: your CXX compiler: “CMAKE_CXX_COMPILER-NOTFOUND” was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name.
解决方法:yum install gcc-c++
2: zlib_archive/BUILD.bazel:5:1: undeclared inclusion(s) in rule '@zlib_archive//:zlib'
解决方法:bazel clean --expunge