我今天做了类似的事情,并且在我的 Jetson NX 上运行在 NVP 模型 2 模式(15W,6 核)上得到了相同的结果。
使用 CPU 将图像大小调整 10,000 次比使用 GPU 将同一图像调整 10,000 次要快。
这是我的 CPU 代码:
cv::Mat cpu_original_image = cv::imread("test.png"); // 1400x690 RGB image
for (size_t count = 0; count < number_of_times_to_iterate; count ++)
{
cv::Mat cpu_resized_image;
cv::resize(cpu_original_image,cpu_resized_image,desired_image_size);
}
这是我的 GPU 代码:
cv::cuda::GpuMat gpu_original_image;
gpu_original_image.upload(cpu_original_image);
for (size_t count = 0; count < number_of_times_to_iterate; count ++)
{
cv::cuda::GpuMat gpu_resized_image;
cv::cuda::resize(gpu_original_image,gpu_resized_image,desired_image_size);
}
我的计时代码(上面未显示)仅用于 for()
循环,不包括 imread()
和 upload()
。
当在循环中调用 10K 次时,我的结果是:
- CPU:5786.930 毫秒
- GPU:9678.054 毫秒(加上
upload()
的额外 170.587 毫秒)
然后我对每个循环进行了 1 次更改。我将“调整大小”的垫子移到循环之外,以防止它在每次迭代时被创建和销毁。我的代码看起来像这样:
cv::Mat cpu_original_image = cv::imread("test.png"); // 1400x690 RGB image
cv::Mat cpu_resized_image;
for (size_t count = 0; count < number_of_times_to_iterate; count ++)
{
cv::resize(cpu_original_image,desired_image_size);
}
...对于 GPU:
cv::cuda::GpuMat gpu_original_image;
gpu_original_image.upload(cpu_original_image);
cv::cuda::GpuMat gpu_resized_image;
for (size_t count = 0; count < number_of_times_to_iterate; count ++)
{
cv::cuda::resize(gpu_original_image,desired_image_size);
}
for()
循环计时结果现在是:
- CPU:5768.181 毫秒(基本不变)
- GPU:2827.898 毫秒(从 9.7 秒到 2.8 秒)
这看起来好多了! GPU 调整大小现在比 CPU 调整速度更快……只要您使用 GPU 进行大量工作而不是一次调整大小。只要您不不断地重新分配临时 GPU 垫,因为这似乎非常昂贵。
但毕竟这一切,回到你最初的问题:如果你所做的只是一次调整单个图像的大小,或者每次调整多张图像的大小,GPU 调整大小不会帮助你,因为将每个图像上传到 GPU mat 将花费比原始调整大小更长的时间!这是我在 Jetson NX 上尝试的结果:
- 单个图像在 CPU 上调整大小:3.565 毫秒
- 将 mat 上传到 GPU:186.966 毫秒
- 分配第二个 GPU 垫和调整 GPU 大小:225.925 毫秒
因此,在 CPU 上,NX 可以在
本文链接:https://www.f2er.com/3132742.html