NodeOutputManage逻辑

官方人体检测和跟踪demo中

https://github.com/HorizonRDK/mono2d\_body\_detection/blob/develop/src/mono2d\_body\_det\_node.cpp#L104

对异步调用采用了NodeOutputManage对推理结果进行排序,其中Feed函数如下:

问题如下:

1. 当cache_frame_.begin() 时间戳和cache_node_output_.begin()的时间戳不相等时,for循环仍会继续,但循环已无意义?

2. 红框中的break似乎永远不会执行?

问题1:

有意义,例如L156到L160的逻辑是首个推理结果和首帧图像数据的时间戳相差大于阈值,说明存在推理丢帧,需要删除首帧图像数据,然后继续下一个循环判断时间戳是否匹配。

举个例子:图像缓存的时间戳序列是[1, 2, 3],输出的推理结果时间戳序列是[2, 3],第一次循环时时间戳序列为1的图像没有推理输出,第一次循环会删除这个缓存(加入时间差大于阈值);第二次循环时图像缓存的时间戳序列是[2, 3],时间戳为2的推理结果匹配成功,对外输出结果。

问题2:

break永远不会执行,其实就是上一层if的情况。

明白了,谢谢

这里直接使用当前帧输出的逻辑是什么?

这块逻辑是有问题,相当于排序失效了。

这里主要是考虑两个特殊情况:未启用输出排序功能;消息不完整(没有时间戳)导致无法排序。

正确的逻辑应该如下(今天会提交到github,10月份版本正式发布):