Jetson Nano结合MediaPipe实现

2 篇文章 0 订阅
2 篇文章 0 订阅

前言

Jetson Nano是NVIDIA出品的一款小型AI计算机,与Raspberry PI这种开发板相比,它上面安装了NVIDIA Maxwell GPU,显然更适合于运行计算机视觉方面的AI应用。根据我之前的一篇博客,也可以很轻松地配置好一台具有计算机视觉AI开发环境的Jetson Nano。

但Jetson Nano毕竟也只有信用卡大小,直接运行一些很成熟的CV模型,如YOLO、OpenPose等,都会遇到诸如too many resources requested for launch的问题。NVIDIA论坛上也有好多提问指出了类似的问题,有大佬指出这种嵌入式系统中的4G内存是不够用的,运行深度学习的模型也都必须是优化后的轻量级模型。

此时了解到Google前两年就推出了一款称为MediaPipe的开源机器学习框架,该框架主要就提供了处理视频流的跨平台深度学习优化功能。其核心使用C++开发,可以通过自定义计算图,实现数据预处理、后处理以及组合应用各种TensorFlow Lite模型进行推断等。使用MediaPipe框架运行计算图的同时,会自动进行合适的优化,使生成的应用能够最大化地利用各种计算资源,并运行在轻量级的设备上。同时MediaPipe官方已经提供了十几个常用的案例程序,如物体识别、手势识别、面部识别、身体姿态识别等。于是就尝试在Jetson Nano上安装运行MediaPipe的示例程序,记录在这篇博客中。

安装MediaPipe

首先克隆下来MediaPipe的GitHub库,之后按照官方的说明文档中的Installation部分安装配置MediaPipe运行所需要的环境。

安装Bazel

For Nvidia Jetson and Raspberry Pi devices with aarch64 Linux, Bazel needs to be built from source:

既然MediaPipe是Google开发的,那构建工具自然还是要用Google自家的——Bazel。谷歌应该也考虑到了Jetson玩家对MediaPipe的需求,安装说明中就指明了如果是Jetson和Raspberry Pi设备,其架构为ARM64位(aarch64),因此需要从源码编译安装。从GitHub上下载Bazel源码,然后依次运行如下命令:

# 安装依赖包
> sudo apt-get install build-essential openjdk-8-jdk zip unzip

# 解压源码
> mkdir $HOME/bazel-3.7.2
> cd $HOME/bazel-3.7.2
> unzip bazel-3.7.2-dist.zip

# 编译
> env EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh

# 将生成的bazel文件放在PATH目录中
> sudo cp output/bazel /usr/local/bin/

# 确认安装结果以及版本号
> bazel --version

安装OpenCV和FFMpeg

OpenCV和FFMpeg都已经在Jetson上安装过,由于MediaPipe是Bazel项目,因此重要的也就是将MediaPipe中第三方库的路径配置修改一下就好。在MediaPipe官网上说明只需要使用如下命令:

> sed -i "s/x86_64-linux-gnu/aarch64-linux-gnu/g" third_party/opencv_linux.BUILD
> sed -i "s/x86_64-linux-gnu/aarch64-linux-gnu/g" third_party/ffmpeg_linux.BUILD

也就是将third_party/opencv_linux.BUILDthird_party/ffmpeg_linux.BUILD文件中所有的x86_64-linux-gnu更换为aarch64-linux-gnu,即将OpenCV和FFMpeg的库路径定义在/usr/lib/aarch64-linux-gnu下。在我的Jetson上,FFMpeg的库已预装,在/usr/lib/aarch64-linux-gnu目录下确实都有相关的.so文件,运行上述命令的第二句就行。但OpenCV是从源码编译安装的,编译安装后的lib文件和头文件都拷贝至/usr/local下,因此需要结合修改WORKSPACE文件以及third_party/opencv_linux.BUILD两个文件以定位OpenCV库路径:

# WORKSPACE文件
new_local_repository(
    name = "linux_opencv",
    build_file = "@//third_party:opencv_linux.BUILD",
    path = "/usr/local",
)

# third_party/opencv_linux.BUILD文件
cc_library(
    name = "opencv",
    srcs = glob(
        [
            "lib/libopencv_core.so",
            "lib/libopencv_calib3d.so",
            "lib/libopencv_features2d.so",
            "lib/libopencv_highgui.so",
            "lib/libopencv_imgcodecs.so",
            "lib/libopencv_imgproc.so",
            "lib/libopencv_video.so",
            "lib/libopencv_videoio.so",
        ],
    ),
    hdrs = glob([
        # For OpenCV 3.x
        "include/opencv2/**/*.h*",
        # For OpenCV 4.x
        # "include/opencv4/opencv2/**/*.h*",
    ]),
    includes = [
        # For OpenCV 3.x
        "include/",
        # For OpenCV 4.x
        # "include/opencv4/",
    ],
    linkstatic = 1,
    visibility = ["//visibility:public"],
)

安装GPU加速支持库——OpenGL ES

> sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev
> sudo apt-get install 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

配置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:

> vi /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提出类似问题,但解决方案貌似是需要修改一个中间文件。注意到有评论说目前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摄像头则可以直接使用。

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 要在Jetson Nano上安装Mediapipe,请按照以下步骤操作: 1. 在Jetson Nano上安装OpenCV: sudo apt-get install libopencv-dev python-opencv 2. 下载Mediapipe源代码: git clone https://github.com/google/mediapipe.git 3. 安装Mediapipe依赖项: sudo apt-get install cmake libprotobuf-dev protobuf-compiler libopencv-dev libssl-dev libgtk-3-dev libglfw3-dev 4. 构建Mediapipe: cd mediapipe mkdir build && cd build cmake -GNinja .. ninja 5. 测试安装是否成功: cd ../mediapipe/examples/desktop/demo_run_graphical_overlay bash run_graphical_overlay.sh 完成上述步骤后,您应该已经在Jetson Nano上成功安装了Mediapipe。 ### 回答2: Jetson nano是一个小型的单板电脑,使用NVIDIA的Jetson平台,它可以进行深度学习、AI推理和计算机视觉等各种工作。MediaPipe是Google推出的实时机器学习框架,主要针对计算机视觉任务,例如人脸检测、姿势估计、手势识别等,它可以在不同的设备上运行,包括Jetson nano。 要在Jetson nano上安装MediaPipe,我们需要在终端窗口中执行以下步骤: 1. 安装CUDA 和CuDNN:首先,需要确认Jetson nano上已经安装了CUDA和CuDNN。如果没有安装,可以按照官方文档进行安装。 2. 安装bazel:MediaPipe使用bazel编译器来构建代码。要安装bazel,可以使用以下命令: ``` sudo apt-get update sudo apt-get install wget pkg-config zip g++ zlib1g-dev unzip python3 wget https://github.com/bazelbuild/bazel/releases/download/3.5.1/bazel-3.5.1-installer-linux-x86_64.sh chmod +x bazel-3.5.1-installer-linux-x86_64.sh ./bazel-3.5.1-installer-linux-x86_64.sh --user ``` 这将从bazel官网下载安装程序,并安装bazel到用户目录。 3. 安装MediaPipe:接下来,我们需要克隆MediaPipe的代码库。可以使用以下命令从GitHub上进行克隆: ``` git clone https://github.com/google/mediapipe.git ``` 接着,我们需要进入mediapipe目录,并使用bazel进行编译。可以使用以下命令: ``` cd mediapipe bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=0 mediapipe/examples/desktop/multi_hand_tracking:multi_hand_tracking_gpu ``` 这将使用GPU进行编译,并生成一个可执行文件multi_hand_tracking_gpu。 4. 运行MediaPipe示例:最后,我们需要运行MediaPipe的示例程序。可以使用以下命令: ``` GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_gpu --calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt ``` 这将启动一个窗口,显示摄像头捕获的画面,并进行手部跟踪。 总之,Jetson nano上安装MediaPipe需要先安装CUDA和CuDNN,然后安装bazel,克隆MediaPipe代码库,使用bazel编译代码,并运行示例程序。这样就可以在Jetson nano上使用MediaPipe进行计算机视觉任务。 ### 回答3: Jetson Nano是一款小型的AI计算机,可以用于各种深度学习应用,如物体检测、人脸识别等。而MediaPipe是Google推出的一个跨平台、轻量级的多媒体框架,它能够实现各种复杂的人体姿势识别、手部姿势识别等,非常适合用于Jetson Nano上的开发。 要在Jetson Nano上安装MediaPipe,需要执行以下步骤: 第一步:准备工作 在安装MediaPipe之前,需要在Jetson Nano上安装CUDA、cuDNN、TensorRT等支持开发深度学习应用的库。可以在NVIDIA的官网上下载对应版本的安装包进行安装。 第二步:下载MediaPipe 下载MediaPipe的源代码并解压缩,然后在终端中进入解压缩后的目录。执行以下命令: ``` cd mediapipe ``` 第三步:安装依赖项 在Jetson Nano上安装MediaPipe需要一些依赖项,如TensorFlow Lite、OpenCV等。可以使用以下命令安装这些依赖项: ``` sudo apt-get install -y libopencv-dev python-opencv libatlas-base-dev python3-dev python3-pip python3-setuptools python3-wheel ``` 第四步:构建MediaPipe 执行以下命令,构建MediaPipe的代码: ``` gclient sync gn gen out/mediapipe_aarch64 --args="build_examples=false target_cpu=\"arm64\"" ninja -C out/mediapipe_aarch64 ``` 这个过程可能需要一些时间,需要等待完成。 第五步:测试MediaPipe 构建完成后,可以测试MediaPipe的功能。例如,可以在Jetson Nano中运行人体姿势检测的demo应用程序。将以下代码复制到终端中: ``` #设置环境变量 export GLOG_logtostderr=1 #运行demo ./out/mediapipe_aarch64/build_run.sh mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt ``` 运行后,就可以看到摄像头捕捉到的图像,并检测出手的姿态。 安装MediaPipeJetson Nano上是一项相对简单的任务,只需要按照以上步骤执行即可。注意,在Jetson Nano上运行MediaPipe可能需要较高的计算能力,因此需要使用优化的代码和算法,以保证具有良好的响应速度和性能。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值