1461521844lijin / trt_yolo_video_pipeline

TensorRT+YOLO系列的 多路 多卡 多实例 并行视频分析处理案例
MIT License
197 stars 35 forks source link

请问支持跳帧分析,来提高并发分析数量吗? #15

Closed lwll closed 1 month ago

1461521844lijin commented 1 month ago

可以的,修改输入节点的逻辑进行抽帧就可以了;不过还要显示推流输出的话就需要修改对应的输出参数的帧率了

lwll commented 1 month ago

可以的,修改输入节点的逻辑进行抽帧就可以了;不过还要显示推流输出的话就需要修改对应的输出参数的帧率了

我在m_decoder->send(pkt); 前添加跳帧逻辑,发现跳30帧分析一次,和跳150帧分析一次,显存的占用差不多的,同时解码的路数并没有变多(不考虑编码推流的情况,单纯解码)。是我添加的位置不对吗?

1461521844lijin commented 1 month ago

可以的,修改输入节点的逻辑进行抽帧就可以了;不过还要显示推流输出的话就需要修改对应的输出参数的帧率了

我在m_decoder->send(pkt); 前添加跳帧逻辑,发现跳30帧分析一次,和跳150帧分析一次,显存的占用差不多的,同时解码的路数并没有变多(不考虑编码推流的情况,单纯解码)。是我添加的位置不对吗?

你在使用硬件解码吗? 一般来说硬件解码器和trt推理模型占用的显存都是初始化时预分配好的,跟分析输入频率无关,和硬件解码器数量和模型推理实例数量有关;这个项目中的数据拷贝(内存到显存)使用了显存池,也是降循环利用固定显存空间的; 因此跳帧并不会减少显存开销,只会减少输入频率,减少GPU利用率(你可以看自己的资源利用率),所以理论上可以通过跳帧来增加分析路数。

其次,在解码前丢帧的做法是不正确的,这可能会导致解码失败,建议进行I帧判断只解码I帧或者在视频解码后再进行抽帧处理

lwll commented 1 month ago

可以的,修改输入节点的逻辑进行抽帧就可以了;不过还要显示推流输出的话就需要修改对应的输出参数的帧率了

我在m_decoder->send(pkt); 前添加跳帧逻辑,发现跳30帧分析一次,和跳150帧分析一次,显存的占用差不多的,同时解码的路数并没有变多(不考虑编码推流的情况,单纯解码)。是我添加的位置不对吗?

你在使用硬件解码吗? 一般来说硬件解码器和trt推理模型占用的显存都是初始化时预分配好的,跟分析输入频率无关,和硬件解码器数量和模型推理实例数量有关;这个项目中的数据拷贝(内存到显存)使用了显存池,也是降循环利用固定显存空间的; 因此跳帧并不会减少显存开销,只会减少输入频率,减少GPU利用率(你可以看自己的资源利用率),所以理论上可以通过跳帧来增加分析路数。

其次,在解码前丢帧的做法是不正确的,这可能会导致解码失败,建议进行I帧判断只解码I帧或者在视频解码后再进行抽帧处理

感谢回复。 是的我在用硬件编码,目前根据源码中的src/ffmpeg/core/Decoder.cpp自己写了解码demo,在多线程同时处理rtsp码流的解码工作时,通过nvidia-smi查看显卡进程(显卡是rtx 3060),确实发现显存在逐步增加,不知道你所说的显存在初始化时预分配好指的是什么? 另外,我看源码中将AVFrame对象转成cv::Mat对象,好像是在内存里进行操作的?