【发布时间】:2020-11-12 15:48:50
【问题描述】:
我目前正在开展一个项目,我必须对视频数据进行一些繁重的分析。基本上我有大约 20 个视频,每个 1-2 小时长,以及执行我的分析的功能。对一个视频执行分析会产生大约 30 FPS 的处理性能,所以我希望在多处理方法中同时评估多个视频时达到 30 FPS,但是这并不成立,我宁愿在每个视频上获得约 5 FPS。我有 20 多个 CPU 内核可用,因此理论上计算机应该有足够的功率。 我的代码基本结构如下:
class Task:
def __init__(videos):
self.videos = videos
def execute(self):
jobs = []
for video in self.videos:
worker = VideoWorker(video=video)
jobs.append(worker)
worker.start()
for j in jobs:
j.join()
class VideoWorker(multiprocessing.Process):
def __init__(self, video):
self.video = video
def run(self):
self.eval_video()
def eval_video(self)
cap = cv2.VideoCapture(video.path_to_video)
while cap.isOpened():
frame = cap.read()
"""
... processing
"""
im = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
resized_im = im.resize((8, 8))
"""
... further processing
"""
Task 类管理多处理,VideoWorker 进行评估。我在分析代码时注意到调整图像大小(使用 PIL)占用的 CPU 时间最多,但是在是否采用多处理时计算时间存在很大差异。与多处理方法中一个进程所需的时间相比,在没有多处理的情况下,调整大小的速度要快 5 到 10 倍。
有什么办法可以加快速度或“正常”吗?我的假设是每个进程都将在其中一个内核上运行,因此与仅使用一个 CPU 相比,性能不会下降太多。这些进程不相互通信,我还没有实现某种形式的结果收集。
【问题讨论】:
-
不确定为什么要使用 PIL 和 OpenCV?如果您已经构建并安装了 OpenCV,那么您不妨将其用于所有处理,因为它通常比 PIL、恕我直言优化得多。
-
@MarkSetchell 调整大小实际上是在我使用的一个库中使用的,而不是在我自己的实现中。我可以肯定地修改库并用 cv2.resize 替换 PIL。
-
您的代码非常粗略/模糊,无法发表很多评论。如果这就是你能展示的全部,我认为你将不得不做一些仔细的基准测试来弄清楚发生了什么。
-
@MarkSetchell 是的,我同意它的模糊性,但从分析结果来看,其他步骤似乎确实产生了合理的影响。我看看能不能从 PIL resize 切换到 cv2.resize
标签: python opencv computer-vision multiprocessing python-imaging-library