lenLRX / Atlas_ACL_E2E_Demo

187 stars 38 forks source link

图像序列输入的推理 #39

Closed nku-zhichengzhang closed 2 years ago

nku-zhichengzhang commented 2 years ago

感谢您的工作!

但在实际部署使用中,通常需要进行实时处理,即单张单张的输入图像。

我尝试基于您的代码进行修改。1)初始化模型参数,获得跟踪器;2)对于输入的单张图像运行跟踪器,获得跟踪结果。大概是去除您代码中的task node之间的关系,重新缕为单线程。方便在总体调用的函数进行多线程的改造,并进行online的实时跟踪。(目前的修改主要修改的是yolox_bytetrack_stream.cpp和yolox_bytetrack_stream.h

但我还是个C的初学者,您看我的思路是可行的吗,有没有可以借鉴参考的例子呢

期待您的回复~

lenLRX commented 2 years ago

你需要更清晰的描述你的需求场景。 首先“单张的输入图像”,camera_input就符合你的要求。 然后,我猜你希望有一个同步的API,调用一个函数,返回结果,但是这样是不能减少延迟的。 因为如果实现一个同步的接口那么整个流程的各个部分都是串行的,这只是让你编程上看起来直观一点,并不能降低延迟。 然后目前这个代码库里面我使用的这种异步的方式,是可以做到各个不同组件之间流水线式的执行,这样可以最大化系统的吞吐率,当然这样也不会减少延迟。 所以从你目前描述的情况来看,我还看不到改成单线程的必要性

nku-zhichengzhang commented 2 years ago

你需要更清晰的描述你的需求场景。 首先“单张的输入图像”,camera_input就符合你的要求。 然后,我猜你希望有一个同步的API,调用一个函数,返回结果,但是这样是不能减少延迟的。 因为如果实现一个同步的接口那么整个流程的各个部分都是串行的,这只是让你编程上看起来直观一点,并不能降低延迟。 然后目前这个代码库里面我使用的这种异步的方式,是可以做到各个不同组件之间流水线式的执行,这样可以最大化系统的吞吐率,当然这样也不会减少延迟。 所以从你目前描述的情况来看,我还看不到改成单线程的必要性

是的是的~ 感谢您的回复,是我之前描述的还不够清晰。

其实现在的需求是想将跟踪功能包装成一个接口,便于其他的程序进行调用,这样就需要将其转换成:1)初始tracker;和2)输入单张图像获取跟踪结果 的形式,所以我才想着进行尝试修改代码。

我目前尝试的是基于camera input的方式进行修改,尝试将单张图像处理的部分剥离出来。但同时由于不太熟悉C++,跟踪器的初始化还在整理中。

您目前基于异步处理的方式确实非常有效的减少了处理时间,这我也通过性能分析复现发现了,视频的处理速度非常快。因此我后续会在调用接口的时候采用类似您的异步方式。

lenLRX commented 2 years ago

如果是给别人封装接口的话可以做一个类,主要实现三个接口就行了

  1. 初始化: 初始化各个task node和task node之间queue的连接关系
  2. 输入图像: 就是简单的往输入的queue插入一张图像的指针就行,类似camera input: https://github.com/lenLRX/Atlas_ACL_E2E_Demo/blob/53d82909b51cd669690bfb98118e07a1268e4c58/src/camera_input.cpp#L115
  3. 输出结果: 就提供一个接口让用户从输出的queue拿一个结果就行了,这个接口可以是阻塞式的,也可以是非阻塞式的。
nku-zhichengzhang commented 2 years ago

如果是给别人封装接口的话可以做一个类,主要实现三个接口就行了

  1. 初始化: 初始化各个task node和task node之间queue的连接关系
  2. 输入图像: 就是简单的往输入的queue插入一张图像的指针就行,类似camera input: https://github.com/lenLRX/Atlas_ACL_E2E_Demo/blob/53d82909b51cd669690bfb98118e07a1268e4c58/src/camera_input.cpp#L115
  3. 输出结果: 就提供一个接口让用户从输出的queue拿一个结果就行了,这个接口可以是阻塞式的,也可以是非阻塞式的。

好嘞~ 感谢您的回复