在 GPU 上使用 MediaPipe 的手部跟踪脚本不利用 GPU 加速

问题描述 投票:0回答:1

我正在开发一个手部跟踪脚本,该脚本利用 MediaPipe 进行手部标志检测和手势识别。我想优化脚本以在 GPU 上运行以获得更快的性能。但是,我遇到了几个问题。

检查GPU分配: 当我运行代码片段 import cv2.cuda,然后创建 cv2.cuda_GpuMat(),并使用 isContinously() 检查图像是否分配在 GPU 上时,我得到 False 作为输出。这表明该图像未在 GPU 上分配。我已验证我的 GPU 支持 CUDA 并已安装必要的 CUDA 驱动程序。

这是在我的终端中运行 nvidia-smi 的输出:

Sun Jul 16 09:46:38 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 536.40                 Driver Version: 536.40       CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                     TCC/WDDM  | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 2060      WDDM  | 00000000:2B:00.0  On |                  N/A |
|  0%   49C    P8              10W / 170W |    785MiB /  6144MiB |      2%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

TensorFlow Lite XNNPACK 委托: 此外,我还看到消息“信息:为 CPU 创建了 TensorFlow Lite XNNPACK 委托”。在我的控制台输出中。我想确保脚本利用我的 GPU 进行加速,而不是退回到 CPU 执行。

这是我的项目的文件夹结构:

- README.md
- main.py
- models/
  - gesture_recognizer.task
  - hand_landmark_full.tflite
  - hand_landmarker.task
  - palm_detection_full.tflite

main.py脚本(密码:NDRmVaqqAd)

main.py
脚本包含手部跟踪实现。我已经在
use_gpu
初始化中将
True
标志设置为
mp_hands.Hands

我还运行了代码片段

import cv2
,然后运行
cv2.cuda.getCudaEnabledDeviceCount()
,它输出
0
,表明CUDA不可用。这是代码和输出:

import cv2

if cv2.cuda.getCudaEnabledDeviceCount() > 0:
    print("CUDA is available!")
else:
    print("CUDA is not available.")

输出

CUDA is not available.

我正在虚拟环境中工作,这里是已安装的软件包和版本的列表:

absl-py==1.4.0
asttokens==2.2.1
attrs==23.1.0
backcall==0.2.0
cffi==1.15.1
colorama==0.4.6
comm==0.1.3
contourpy==1.1.0
cycler==0.11.0
debugpy==1.6.7
decorator==5.1.1
EasyProcess==1.1
entrypoint2==1.1
executing==1.2.0
flatbuffers==23.5.26
fonttools==4.41.0
ipykernel==6.23.1
ipython==8.14.0
jedi==0.18.2
jupyter_client==8.2.0
jupyter_core==5.3.0
kiwisolver==1.4.4
matplotlib==3.7.2
matplotlib-inline==0.1.6
mediapipe==0.10.2
MouseInfo==0.1.3
mss==9.0.1
nest-asyncio==1.5.6
numpy==1.25.1
opencv-contrib-python==4.8.0.74
opencv-python==4.8.0.74
packaging==23.1
parso==0.8.3
pickleshare==0.7.5
Pillow==10.0.0
platformdirs==3.5.1
prompt-toolkit==3.0.38
protobuf==3.20.3
psutil==5.9.5
pure-eval==0.2.2
PyAutoGUI==0.9.54
pycparser==2.21
PyGetWindow==0.0.9
Pygments==2.15.1
PyMsgBox==1.0.9
pyparsing==3.0.9
pyperclip==1.8.2
PyRect==0.2.0
pyscreenshot==3.1
PyScreeze==0.1.29
python-dateutil==2.8.2
pytweening==1.0.7
pywin32==306
pyzmq==25.1.0
six==1.16.0
sounddevice==0.4.6
stack-data==0.6.2
tornado==6.3.2
traitlets==5.9.0
wcwidth==0.2.6

如果您能提供有关如何在 GPU 上正确配置和运行脚本以提高性能的指导或建议,我将不胜感激。我可以采取哪些步骤来确保正确利用 GPU 加速?我需要使用 TensorFlow Lite 执行什么特定操作才能启用 GPU 加速吗?

谢谢您的帮助!

python tensorflow opencv mediapipe
1个回答
0
投票

最初,我提供了一个用于运行 Mediapipe 地标检测的解决方案,如下所述:Mediapipe GPU 使用情况。要使 Mediapipe 检测器能够在 GPU 上运行,您可以使用

python.BaseOptions.Delegate.GPU
:

激活它
base_options = python.BaseOptions(
    model_asset_path="pose_landmarker.task", delegate=python.BaseOptions.Delegate.GPU
)

接下来,您似乎希望将图像加载到

cuda_GpuMat
中,然后再使用
hands.process(d_frame_rgb)
进行处理。我无法确认这是否正常工作。此外,由于您尚未使用 CUDAcuDNN 构建 OpenCV,因此无法检测您的 CUDA 安装,从而导致消息: CUDA 不可用。

import cv2

if cv2.cuda.getCudaEnabledDeviceCount() > 0:
    print("CUDA is available!")
else:
    print("CUDA is not available.")

最后,我没有用CUDA编译的OpenCV版本,所以我无法测试你的代码。

© www.soinside.com 2019 - 2024. All rights reserved.