我正在开发一个手部跟踪脚本,该脚本利用 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 加速吗?
谢谢您的帮助!
最初,我提供了一个用于运行 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)
进行处理。我无法确认这是否正常工作。此外,由于您尚未使用 CUDA 和 cuDNN 构建 OpenCV,因此无法检测您的 CUDA 安装,从而导致消息: CUDA 不可用。
import cv2
if cv2.cuda.getCudaEnabledDeviceCount() > 0:
print("CUDA is available!")
else:
print("CUDA is not available.")
最后,我没有用CUDA编译的OpenCV版本,所以我无法测试你的代码。