如何解决测量 opencv 相机管道延迟 次要但相关的问题:
如何计算相机帧延迟?
设置
我正在为边缘计算 (Jetson Xavier NX) 制作计算机视觉推理管道
管道:
- 从相机取帧
- 本地化(使用 YOLO 暗网网络)
- 分类(使用 tensorflow keras 网络)
cap = cv2.VideoCapture(0)
def next_frame_infinite(*args):
time_ = time.time()
return time_,cap.read()
@tf.autograph.experimental.do_not_convert
def video_generator():
while True:
yield next_frame_infinite()
# full pipeline with localization and classification
ds = (
tf.data.Dataset.from_generator(video_generator,(tf.float64,tf.uint8))
.map(tf_np_localize_yolo)
.map(tf_np_classify)
)
for x in ds:
frame_cap_time,frame,scores,bboxes = x
delay = time.time() - frame_cap_time
了解处理的延迟对于我的用例至关重要(因为会有基于此延迟的硬件计时),所以这就是我打发时间的原因。
但是 delay
变量没有正确计算,它显示延迟为 0.5 秒,而实际上大约为 1 秒。总是低估。
我尝试了什么
我只用 Tensorflow 尝试了相机生成器,仍然延迟,我尝试删除 Tensorflow 并且只迭代生成器,但延迟仍然是错误的!
# delay is very high and is calculated wrong
for x in video_generator():
frame_cap_time,frame = x
delay = time.time() - frame_cap_time
我尝试了最简单的形式(没有流水线),延迟似乎是正确的:
# delay decreases,more accurate delay
while True:
frame_cap_time= time.time()
frame = cap.read()
delay = time.time() - frame_cap_time
计算延迟
为了找出真正的延迟,我的测试是将相机对准我的显示器,如下图所示,然后我用手机拍下显示器的照片(显示器延迟并不大,大约在5ms)
- 右下角:当前秒表的实际时间(41.52 秒)
- 顶部:处理后秒表的相机视图(由于处理时间为 40.97 秒,因此较旧)
- 左下:程序计算的延迟 0.345 秒
在现实中,实际延迟是
41.520 - 40.970 = 0.55
,它不等于计算的延迟 0.345。并且误差确实会成比例,当实际延迟为 4 秒时,计算出的延迟表示大约为 1 秒(而不是非线性)。
问题
我有很多问题,但让我们坚持一个最普遍的问题:为什么延迟计算错误?如果是相机问题,那么程序会高估而不是低估是有道理的。
次要但相关的问题:
- 我还能如何加速我的管道?我可以使用除
tf.data.Dataset.from_generator
以外的其他东西吗? - 为什么 python 生成器需要这么长时间?
- 除了
tf.data
之外,还有哪些替代流水线方法?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。