我正在从事一个计算机视觉项目,其中所有处理或推理都在 GPU 上进行。我需要计算从视频流中获得的实时 FPS。该视频流可以是视频文件或RTSP视频流。
我写了一个简单的逻辑来计算FPS。如下所示:
cap = cv2.VideoCapture(0)
fps_start_time = datetime.datetime.now()
fps = 0
total_frames = 1
while True:
ret, frame = cap.read()
total_frames = total_frames + 1
"""
All the processing and
inferencing happens here
"""
fps_end_time = datetime.datetime.now()
time_diff = fps_end_time - fps_start_time
fps = (total_frames / time_diff.seconds)
fps_text = "FPS: {:.2f}".format(fps)
print(fps_text)
cv2.putText(frame, fps_text, (5, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)
cv2.imshow("Application", frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
为了解释上述逻辑,我在开始推理之前先取
fps_start_time
。推理完成后,我将采用 fps_end_time
,然后用开始时间减去结束时间,并将时间差异除以帧以获得 FPS。如果您在 CPU 上进行所有推理,则此方法效果很好。但如果你的推理发生在 GPU 上,它会显示错误的值。
我有一个定制的硬件,其中 GPU 非常高端,而 CPU 较低,因此在推理时我可以在输出视频中看到,没有滞后/延迟,但 FPS 仍然保持在 6-7 左右,实际上它看起来像25-30。发生这种情况的原因是,推理时的 CPU 使用率始终在 95% 左右,因此 FPS 很低。如果我们使用 GPU 进行 FPS(大多数时候为 50-60%),那么我们可能会得到正确的值。
是否有任何预构建的库或方法可供我们用来获取 GPU 的 FPS?
我想你做得对,所以基本上,FPS = 1/('当前操作时间' - '先前操作时间')。
还要检查您的相机是否确实以 60 fps 进行流传输。您可以使用它在 OpenCV 中完成此操作。
cap = cv2.VideoCapture(0)
fps = cap.get(cv2.CAP_PROP_FPS)
大多数网络摄像头都锁定在 30 fps。
如果您找到解决方案,请告诉我。