mediapipe 官网:https://google.github.io/mediapipe/
dlib 官网:http://dlib.net/
dlib github:https://github.com/davisking/dlib
MediaPipe是一款由Google开发并开源的数据流处理机器学习应用开发框架。它是一个基于图的数据处理管线,用于构建使用了多种形式的数据源,如视频、音频、传感器数据以及任何时间序列数据。 MediaPipe是跨平台的,可以运行在嵌入式平台(树莓派等),移动设备(iOS和Android),工作站和服务器上,并支持移动端GPU加速。 MediaPipe为实时和流媒体提供跨平台、可定制的ML解决方案。
MediaPipe 的核心框架由 C++ 实现,并提供 Java 以及 Objective C 等语言的支持。MediaPipe 的主要概念包括数据包(Packet)、数据流(Stream)、计算单元(Calculator)、图(Graph)以及子图(Subgraph)。
MediaPipe的特点:
MediaPipe中的深度学习解决方案
Face Detection | Face Mesh | Iris | Hands | Pose | Holistic |
---|---|---|---|---|---|
Hair Segmentation | Object Detection | Box Tracking | Instant Motion Tracking | Objectron | KNIFT |
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 | ✅ |
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
下载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 文件
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
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
首先确认各种库(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_cuda
和build: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摄像头则可以直接使用。
MediaPipe Hands是一款高保真的手和手指跟踪解决方案。它利用机器学习(ML)从一帧中推断出21个手的3D坐标。
在对整个图像进行手掌检测后,根据手部标记模型通过回归对检测到的手区域内的21个3D手关节坐标进行精确的关键点定位,即直接坐标预测。该模型学习一致的内部手姿势表示,甚至对部分可见的手和自我遮挡也具有鲁棒性。
为了获得地面真实数据,用了21个3D坐标手动注释了约30K幅真实世界的图像,如下所示(从图像深度图中获取Z值,如果每个对应坐标都有Z值)。为了更好地覆盖可能的手部姿势,并对手部几何体的性质提供额外的监督,还绘制了各种背景下的高质量合成手部模型,并将其映射到相应的3D坐标。
MediaPipe Pose是一个用于高保真身体姿势跟踪的ML解决方案,利用BlazePose研究,从RGB视频帧推断出33个3D坐标和全身背景分割遮罩,该研究也为ML Kit姿势检测API提供了动力。
MediaPipe姿势中的地标模型预测了33个姿势坐标的位置(参见下图)。
对应的案例是人脸特效。
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特征数据预测人脸特征数值