对于某些光流用例来说,这可能是一种健康的加速方法。
为了确保我们在同一页面上,光流不会直接用作跟踪汽车的主要信息来源。这由另一个模块处理......可能是一些基于深度学习的对象检测器。这个物体检测器可能在计算方面很密集(除非你有一些特殊的硬件,比如专用的 GPU 或 VPU)。
密集流可以是一个很好的补充,以获得关于汽车及其周围发生的事情的低延迟信息,并且可以用作引导后一个检测器的一部分(在连续的检测器中提供先验帧,如卡尔曼滤波器跟踪设置)。
有了这个假设,您可以轻松优化您提到的光流计算。我建议您在这里跳过密集掩码的概念,只需使用检测器中的边界框即可。这将是您对流量计算感兴趣的区域。如果您在检测所在的帧 t 中,并且想要使用来自 2 帧 t 和 t-1 的光流,则对两个帧使用相同的边界框。这将为您提供 2 个 ROI,并将它们馈送到您的密集光流模块。
每个光流算法都有其低级操作的支持区域,并且它们都不能很好地处理图像边界。因此,请确保为边界框提供足够的额外空间(只要它们可以容纳在原始视频帧中)。
为了清楚起见,如果您有用于汽车检测的边界框为 bbox(x,y,w,h),则您需要一个良好的边距 m,以便用于密集流的边界框为 bbox(xm/2,ym /2,w+m,h+m)。边距是您想要根据您的光流方法(及其参数)设置的东西。
编辑:这里给你的代码,你去。请注意,我根本没有测试过这个:
// This is c++, since we are talking optimizations
// I am uncertain of they python wrappers, but below I am fairly certain
// will not make any deep copies outside of the flow module.
// Assume you have INew and IOld, the two frames of the video:
// assume your bounding box from your detector is a cv::Rect b
float m = 4.0; // 4 pixels as an example margin...
Rect boxFlow(b.x - m/2, b.y - m/2, b.width + m, b.height + m);
Mat roiNew(INew (boxFlow));
Mat roiOld(IOld (boxFlow));
Mat uflow;
calcOpticalFlowFarneback(roiOld, roiNew, uflow, 0.5, 3, 15, 3, 5, 1.2, 0);
但是,根据您的设置,这最终可能不会显着加快速度。对于上面的代码,我不知道flow模块内部是如何处理内存的,而在你的python版本中,我更不确定它会如何处理。
考虑在流线型密集光流方法中(您使用相同大小的数据吞吐量),您的管道中的内存缓冲区大小相同。您提到的方法的幼稚实现需要动态分配内存,因为边界框的大小和数量会随着时间而变化。