【问题标题】:How to loop faster over a large image dataset using opencv and python?如何使用 opencv 和 python 在大型图像数据集上更快地循环?
【发布时间】:2017-11-30 06:03:06
【问题描述】:

我有一个包含 100000 张图像的随机数据集。

我在同一个数据集上使用了以下代码,但处理速度非常慢(在 AWS GPU 实例中)。

import cv2
from progressbar import ProgressBar
pbar = ProgressBar()
def image_to_feature_vector(image, size=(128, 128)):
    return cv2.resize(image, size).flatten()
imagePath = #path to dataset
data = []
#load images
for i in pbar(range(0,len(imagePath))):
   image = cv2.imread(imagePath[i])
   image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
   features = image_to_feature_vector(image)
   data.append(features)

如何提高处理速度?

【问题讨论】:

  • 需要多长时间?
  • @ElisByberi 1 小时
  • ~ 28 张图像/秒。你试过没有ProgressBar()吗?也许它会更快! GPU 不会加速 ProgressBar()!
  • 通常出于优化目的,您应该首先分析您的瓶颈是什么,然后尝试优化最慢的部分。使用profiler 找出哪个部分消耗后处理时间
  • 你实际上需要在同一个输入上运行多少次?假设您保存结果,我的猜测只会是一次。如果是这样,优化它可能不是很有价值。最多您可能只想在较小的块上并行运行它,最后合并结果。

标签: python numpy opencv


【解决方案1】:

真正的解决方案取决于瓶颈分析。

无论如何,图像读取(加载)时间是您可以使用的宝贵资源。

你的过程是连续的:

在这样的场景中,我使用称为 IO 管道或并行管道的东西。这个想法是使用一个线程来串行加载图像并将它们提供给多个处理线程。因此,当您的输入线程正在读取时,一个或多个线程正在使用 CPU 来处理以前的图像。也可以使用单线程串行写出数据:

不幸的是,我没有太多使用 python 来编写示例。这种模式已经在 python 线程框架中实现。

我使用这种方法来抓取相机帧并高速处理它们,但我使用 C++。如果您对 C++ 编程不感兴趣,您会在 impressive answer 中找到一些鼓舞人心的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2021-06-29
    • 2016-10-12
    • 2017-06-28
    • 2021-06-23
    相关资源
    最近更新 更多