Linux学习笔记(十三)madiepipe开发

文章目录

  • 1、简介
  • 2、源码编译
    • 2.1、安装bazel
    • 2.2、安装mediapipe
    • 2.3、使用GPU
      • 2.3.1、安装OpenGL ES
      • 2.3.2、配置TensorFlow的CUDA支持
  • 3、MediaPipe Hands
  • 4、MediaPipe Pose
  • 5、dlib

mediapipe github:https://github.com/google/mediapipe

mediapipe 官网:https://google.github.io/mediapipe/

dlib 官网:http://dlib.net/

dlib github:https://github.com/davisking/dlib

1、简介

MediaPipe是一款由Google开发并开源的数据流处理机器学习应用开发框架。它是一个基于图的数据处理管线,用于构建使用了多种形式的数据源,如视频、音频、传感器数据以及任何时间序列数据。 MediaPipe是跨平台的,可以运行在嵌入式平台(树莓派等),移动设备(iOS和Android),工作站和服务器上,并支持移动端GPU加速。 MediaPipe为实时和流媒体提供跨平台、可定制的ML解决方案。

MediaPipe 的核心框架由 C++ 实现,并提供 Java 以及 Objective C 等语言的支持。MediaPipe 的主要概念包括数据包(Packet)、数据流(Stream)、计算单元(Calculator)、图(Graph)以及子图(Subgraph)。

MediaPipe的特点:

  • 端到端加速:内置的快速ML推理和处理即使在普通硬件上也能加速。
  • 一次构建,随时随地部署:统一解决方案适用于Android、iOS、桌面/云、web和物联网。
  • 即用解决方案:展示框架全部功能的尖端ML解决方案。
  • 免费开源:Apache2.0下的框架和解决方案,完全可扩展和定制。

MediaPipe中的深度学习解决方案

Face Detection Face Mesh Iris Hands Pose Holistic
Linux学习笔记(十三)madiepipe开发_第1张图片 Linux学习笔记(十三)madiepipe开发_第2张图片 Linux学习笔记(十三)madiepipe开发_第3张图片 Linux学习笔记(十三)madiepipe开发_第4张图片
Hair Segmentation Object Detection Box Tracking Instant Motion Tracking Objectron KNIFT
Linux学习笔记(十三)madiepipe开发_第5张图片 Linux学习笔记(十三)madiepipe开发_第6张图片 Linux学习笔记(十三)madiepipe开发_第7张图片 Linux学习笔记(十三)madiepipe开发_第8张图片 Linux学习笔记(十三)madiepipe开发_第9张图片
Android iOS C++ Python JS Coral
Face Detection
Face Mesh
Iris
Hands
Pose
Holistic
Selfie Segmentation
Hair Segmentation
Object Detection
Box Tracking
Instant Motion Tracking
Objectron
KNIFT
AutoFlip
MediaSequence
YouTube 8M

2、源码编译

2.1、安装bazel

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

在jetson nano上安装bazel

安装依赖库

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt install openjdk-11-jdk pkg-config zip g++ zlib1g-dev unzip python3

源码编译

unzip bazel-4.0.0-dist.zip
bash ./compile.sh
sudo cp output/bazel /usr/local/bin

版本查看

bazel version

2.2、安装mediapipe

下载mediapipe源码

git clone https://github.com/google/mediapipe.git

安装依赖库

sudo apt install -y python3-dev cmake protobuf-compiler libprotobuf-dev cmake protobuf-compiler libprotobuf-dev 

修改mediapipe/setup.py

protoc_command = [self._protoc, '-I.', '--python_out=.', source]                            // 删除
protoc_command = [self._protoc, '-I.', '-I/usr/local/include', '--python_out=.', source]    // 增加

修改.cc 文件

  • ./mediapipe/calculators/tensor/image_to_tensor_converter_opencv.cc
  • ./mediapipe/calculators/tensor/image_to_tensor_converter_gl_buffer.cc
  • ./mediapipe/calculators/image/affine_transformation_runner_opencv.cc

Code below:

return tensor;                                                                                // 删除
return absl::StatusOr ( mediapipe::Tensor(std::move(tensor)));             // 增加
return out_image;                                                                             // 删除
return absl::StatusOr ( mediapipe::ImageFrame(std::move(out_image)));  // 增加

Go to the MediaPipe directory.

cd mediapipe

Remove unnecessary OpenCV modules and linker flags.

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

修改 mediapipe/third_party/BUILD:

"WITH_ITT": "OFF",   
"WITH_JASPER": "OFF",    
"WITH_WEBP": "OFF",    
"ENABLE_NEON": "OFF",  <--add this      
"WITH_TENGINE": "OFF",  <--add this    

安装

python3 setup.py gen_protos && python3 setup.py bdist_wheel

安装

pip3 install dist/mediapipe-0.8-cp36-cp36m-linux_aarch64.whl

重启

reboot

2.3、使用GPU

2.3.1、安装OpenGL ES

sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev mesa-utils

检验安装情况

glxinfo | grep -i opengl

打印如下

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA Tegra X1 (nvgpu)/integrated
OpenGL core profile version string: 4.6.0 NVIDIA 32.4.4
OpenGL core profile shading language version string: 4.60 NVIDIA
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 32.4.4
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

注意使用glxinfo检验OpenGL安装情况时,若通过ssh连接,则运行该命令时会报错libGL error: MESA-LOADER: failed to open swrast (search paths /usr/lib/aarch64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri),而通过直连Jetson的显示器运行该命令则不会有该错误。因此若之后通过ssh连接Jetson构建或运行出错,应该考虑通过直连显示器进行尝试。

之后在构建或运行时就需要将命令行中的参数–define MEDIAPIPE_DISABLE_GPU=1替换为–copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11。如下面尝试构建运行GPU版本的"Hello World":

export GLOG_logtostderr=1
bazel run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/hello_world:hello_world

2.3.2、配置TensorFlow的CUDA支持

首先确认各种库(CUPTI、CUDA、CUDNN、NVCC)的安装情况:

> ls /usr/local/cuda-10.2/targets/aarch64-linux/lib | grep libcupti*
libcupti.so
libcupti.so.10.2
libcupti.so.10.2.75

> ls /usr/local/cuda-10.2
bin  extras   lib64    nvml  nvvmx   samples  targets  version.txt
doc  include  LICENSE  nvvm  README  share    tools

> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_21:14:42_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

>  ls /usr/lib/aarch64-linux-gnu/ | grep libcudnn.so
libcudnn.so
libcudnn.so.8
libcudnn.so.8.0.0

将CUDA库的路径通过环境变量TF_CUDA_PATHS配置给TensorFlow:

sudo vim /etc/profile
export TF_CUDA_PATHS=/usr/local/cuda-10.2,/usr/lib/aarch64-linux-gnu,/usr/include

为了让bazel编译时能找到CUDA,还需要将TensorFlow官方.bazelrc文件中的build:using_cudabuild:cuda部分添加到MediaPipe文件夹下的.bazelrc文件中:

# This config refers to building with CUDA available. It does not necessarily
# mean that we build CUDA op kernels.
build:using_cuda --define=using_cuda=true
build:using_cuda --action_env TF_NEED_CUDA=1
build:using_cuda --crosstool_top=@local_config_cuda//crosstool:toolchain

# This config refers to building CUDA op kernels with nvcc.
build:cuda --config=using_cuda
build:cuda --define=using_cuda_nvcc=true

最后在编译的时候,就要在命令中再加两个参数--config=cuda--spawn_strategy=local

尝试编译运行GPU版Holistic案例
在MediaPipe文件夹下,运行如下命令编译Holistic GPU版:

bazel build -c opt --config=cuda --spawn_strategy=local --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/holistic_tracking:holistic_tracking_gpu

编译过程中报错ERROR: /home/victor/mediapipe/mediapipe/framework/tool/BUILD:66:10: Linking of rule ‘//mediapipe/framework/tool:encode_as_c_string’ failed (Exit 1),GitHub上有Issue提出类似问题https://github.com/google/mediapipe/issues/852,但解决方案貌似是需要修改一个中间文件。注意到有评论说目前MediaPipe用到CUDA的仅仅在Object Detection中,因此暂时放弃加上CUDA选项。修改编译命令重新编译:

bazel build -c opt --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/holistic_tracking:holistic_tracking_gpu

编译时间较长,花费了30多分钟,需要耐心等待。再运行如下命令运行生成的程序:

export GLOG_logtostderr=1
./bazel-bin/mediapipe/examples/desktop/holistic_tracking/holistic_tracking_gpu --calculator_graph_config_file=mediapipe/graphs/holistic_tracking/holistic_tracking_gpu.pbtxt

运行状态较好,帧数较为稳定,CPU利用率在60%左右,GPU利用率在80-90%浮动,可见应该是成功利用到了GPU资源。注意连接CSI摄像头时,需要修改mediapipe\examples\desktop\demo_run_graph_main_gpu.cc中设置正确的GStream Pipeline,否则无法打开摄像头,连接USB摄像头则可以直接使用。

3、MediaPipe Hands

MediaPipe Hands是一款高保真的手和手指跟踪解决方案。它利用机器学习(ML)从一帧中推断出21个手的3D坐标。

在对整个图像进行手掌检测后,根据手部标记模型通过回归对检测到的手区域内的21个3D手关节坐标进行精确的关键点定位,即直接坐标预测。该模型学习一致的内部手姿势表示,甚至对部分可见的手和自我遮挡也具有鲁棒性。

为了获得地面真实数据,用了21个3D坐标手动注释了约30K幅真实世界的图像,如下所示(从图像深度图中获取Z值,如果每个对应坐标都有Z值)。为了更好地覆盖可能的手部姿势,并对手部几何体的性质提供额外的监督,还绘制了各种背景下的高质量合成手部模型,并将其映射到相应的3D坐标。

Linux学习笔记(十三)madiepipe开发_第10张图片

4、MediaPipe Pose

MediaPipe Pose是一个用于高保真身体姿势跟踪的ML解决方案,利用BlazePose研究,从RGB视频帧推断出33个3D坐标和全身背景分割遮罩,该研究也为ML Kit姿势检测API提供了动力。

MediaPipe姿势中的地标模型预测了33个姿势坐标的位置(参见下图)。

Linux学习笔记(十三)madiepipe开发_第11张图片

5、dlib

对应的案例是人脸特效。

DLIB是一个现代C++工具包,包含机器学习算法和工具,用于在C++中创建复杂的软件来解决现实世界问题。它被工业界和学术界广泛应用于机器人、嵌入式设备、移动电话和大型高性能计算环境等领域。

dlib库采用68点位置标志人脸重要部位,比如18-22点标志右眉毛,51-68标志嘴巴。使用dlib库的get_frontal_face_detector模块探测出人脸,使用shape_predictor_68_face_landmarks.dat特征数据预测人脸特征数值

要部位,比如18-22点标志右眉毛,51-68标志嘴巴。使用dlib库的get_frontal_face_detector模块探测出人脸,使用shape_predictor_68_face_landmarks.dat特征数据预测人脸特征数值

Linux学习笔记(十三)madiepipe开发_第12张图片

你可能感兴趣的:(笔记,linux,学习,运维)