Firefly开源社区

标题: ffmedia如何设置帧等待时间 [打印本页]

作者: chenll    时间: 2023-9-19 16:46
标题: ffmedia如何设置帧等待时间
我的需求是每秒钟采集一张图像识别

目前是Cv2Display里面做一个判断
  1.     def run(self):
  2.         while not self.is_stop:
  3.             with self.lock:
  4.                 while not self.frame_complete:
  5.                     self.condition.wait()
  6.                 try:
  7.                     if self.last < (time.time() * 1000) - 1000:
  8.                         self.last = time.time() * 1000
  9.                         input_para = self.module.getOutputImagePara()
  10.                         data = self.frame.getActiveData()
  11.                         # 帧数据转换为数组形式
  12.                         img = data.reshape((input_para.vstride, input_para.hstride, 3))
  13.                         print('--------------------------')           
  14.                 except ValueError as e:
  15.                     print("Invalid image resolution!")
  16.                     resolution = find_two_numbers(data.size // 3, input_para.hstride, input_para.vstride)
  17.                     print("Try the recommended resolution: -o {}x{}".format(resolution[0], resolution[1]))
  18.                     break
  19.                 self.frame_complete = False
  20.                 self.condition.notify()
复制代码
采集一个rtsp的留CPU使用了百分之8

有什么好的解决办法


tchip_askquestions

微信图片_20230919164611.rar

43.6 KB, 下载次数: 0, 下载积分: 灯泡 -1 , 经验 -1


作者: dengkx    时间: 2023-9-20 09:56
回调不出去,那模块就无法处理下一帧,所以你可以在回调等待1秒,或者你用个定时器一秒再去拿帧
作者: chenll    时间: 2023-9-20 12:44

作者: chenll    时间: 2023-9-20 12:47
dengkx 发表于 2023-9-20 09:56
回调不出去,那模块就无法处理下一帧,所以你可以在回调等待1秒,或者你用个定时器一秒再去拿帧
  1. def cv2_call_back(obj, VideoBuffer):
  2.     time.sleep(1)
  3.     with obj.lock:
  4.         while obj.frame_complete:
  5.             if not obj.condition.wait(timeout=1):
  6.                 return
  7.         vb = obj.module.exportUseMediaBuffer(VideoBuffer, obj.frame, 0)
  8.         if vb is not None:
  9.             obj.frame = vb
  10.             obj.frame_complete = True
  11.         obj.condition.notify()
复制代码

我在回调函数中做了等待,但是有时候会出现报错,请问这个是什么原因
作者: dengkx    时间: 2023-9-20 16:10
chenll 发表于 2023-9-20 12:47
我在回调函数中做了等待,但是有时候会出现报错,请问这个是什么原因

你的是rtsp实时流,如果你阻塞了链路,那么rtsp会因为缓冲区满而丢帧,导致解码器就无法解出p帧,p帧需要参考前一帧才能解出来。如果是实时流,就不能阻塞,可以使用过滤或者隔帧推理
作者: chenll    时间: 2023-9-20 16:53
dengkx 发表于 2023-9-20 16:10
你的是rtsp实时流,如果你阻塞了链路,那么rtsp会因为缓冲区满而丢帧,导致解码器就无法解出p帧,p帧需要 ...

请问 过滤或者隔帧推理这个有demo吗,ffmedia_release 如何隔帧推理
作者: dengkx    时间: 2023-9-20 17:24
chenll 发表于 2023-9-20 16:53
请问 过滤或者隔帧推理这个有demo吗,ffmedia_release 如何隔帧推理

隔帧推理,每过几帧推理一帧. 最新的ffmedia初步支持了rknn,可以看下
作者: chenll    时间: 2023-9-20 19:15
dengkx 发表于 2023-9-20 17:24
隔帧推理,每过几帧推理一帧. 最新的ffmedia初步支持了rknn,可以看下

https://gitlab.com/firefly-linux/ffmedia_release

我在这里的主分支的demo.py文件中没有看到隔振推理的参数
不是在参数里面吗

  1. parser.add_argument("-i", "--input_source", dest='input_source', type=str, help="input source")
  2.     parser.add_argument("-f", "--save_file", dest='save_file', type=str, help="Enable save dec output data to file, set filename, default disabled")
  3.     parser.add_argument("-o", "--output", dest='output', type=str, help="Output image size, default same as input")
  4.     parser.add_argument("-b", "--outputfmt", dest='outputfmt', type=str, default="NV12", help="Output image format, default NV12")
  5.     parser.add_argument("-e", "--encodetype", dest='encodetype', type=int, default=-1, help="Encode encode, set encode type, default disabled")
  6.     parser.add_argument("-m", "--enmux", dest='enmux', type=str, help="Enable save encode data to file, Enable package as mp4, mkv, or raw stream files depending on the file name suffix. default disabled")
  7.     parser.add_argument("-M", "--filemaxframe", dest='filemaxframe', type=int, default= 0, help="Set the maximum number of frames that can be saved. The default number is unlimited")
  8.     parser.add_argument("-p", "--port", dest='port', type=int, default=0, help="Enable push stream, default rtsp stream, set push port, depend on encode enabled, default disabled\n")
  9.     parser.add_argument("--push_type", dest='push_type', type=int, default=0, help="Set push stream type, default rtsp. e.g. --push_type 1\n")
  10.     parser.add_argument("--rtsp_transport", dest='rtsp_transport', type=int, default=0, help="Set the rtsp transport type, default 0(udp)")
  11.     parser.add_argument("-s", "--sync", dest="sync", type=int, default=-1, help="Enable synchronization module, default disabled. e.g. -s 1")
  12.     parser.add_argument("-a", "--aplay", dest='aplay', type=str, help="Enable play audio, default disabled. e.g. -a plughw:3,0")
  13.     parser.add_argument("-r", "--rotate", dest='rotate',type=int, default=0, help="Image rotation degree, default 0" )
  14.     parser.add_argument("-d", "--drmdisplay", dest='drmdisplay', type=int, default=-1, help="Drm display, set display plane, set 0 to auto find plane")
  15.     parser.add_argument("-c", "--cvdisplay", dest='cvdisplay', type=int, default=0, help="OpenCv display, set window number, default 0")
  16.     parser.add_argument("-x", "--x11display", dest='x11display', type=int, default=0, help="X11 window displays, render the video using gles. default disabled")
复制代码

作者: dengkx    时间: 2023-9-21 10:01
chenll 发表于 2023-9-20 19:15
https://gitlab.com/firefly-linux/ffmedia_release

我在这里的主分支的demo.py文件中没有看到隔振推 ...

demo在rknn/src下,py的只添加了接口,还没写出demo。你可以认为推理时间大于视频帧间隔,可以跳过一帧或多帧再推理一帧,后面跳过的帧继续使用这帧的推理结果直到再次推理
作者: chenll    时间: 2023-9-21 12:17
dengkx 发表于 2023-9-21 10:01
demo在rknn/src下,py的只添加了接口,还没写出demo。你可以认为推理时间大于视频帧间隔,可以跳过一帧或 ...

等不能说一下py的接口是哪个,我看了demo.cpp 但是没有找到是哪里使用的,因看不懂C
作者: chenll    时间: 2023-9-21 17:14
dengkx 发表于 2023-9-21 10:01
demo在rknn/src下,py的只添加了接口,还没写出demo。你可以认为推理时间大于视频帧间隔,可以跳过一帧或 ...

我在ffmedia_api.pdf 这个文档里面也没有看到跳帧或者是间隔帧
作者: dengkx    时间: 2023-9-22 15:42
chenll 发表于 2023-9-21 12:17
等不能说一下py的接口是哪个,我看了demo.cpp 但是没有找到是哪里使用的,因看不懂C

看demo/Readme.md 在使用rknn推理的例子是仓库下的rknn/src/demo_rknn.cpp。你可以按照demo/Readme.md 编译出demo_rknn,然后按照文档运行他

作者: chenll    时间: 2023-9-22 19:42
dengkx 发表于 2023-9-22 15:42
看demo/Readme.md 在使用rknn推理的例子是仓库下的rknn/src/demo_rknn.cpp。你可以按照demo/Readme.md 编 ...

我对照demo_rknn.cpp写了一个py版本的但是加载rknn 模型时候出现了问题
  1. setModelData(): incompatible function arguments. The following argument types are supported:
  2.     1. (self: ff_pymedia.ModuleInference, arg0: capsule, arg1: int) -> int

  3. Invoked with: <ff_pymedia.ModuleInference object at 0x7fa664f0f0>, <ff_pymedia.ModuleInference object at 0x7fa664f0f0>, 'iot_firefly.rknn', 0
复制代码



========================
  1. dec.setModelData('iot_firefly.rknn', 0)
  2.             ret = dec.init()
  3.             if ret < 0:
  4.                 print("dec init failed")
  5.                 raise Exception
  6.             else:
  7.                 print("dec int done")
复制代码


=============demo代码=============
  1. input_para = dec->getOutputImagePara();
  2.         inf = make_shared<ModuleInference>(input_para);
  3.         inf->setProductor(dec);
  4.         inf->setInferenceInterval(1);
  5.         if (inf->setModelData(argv[2], 0) < 0) {
  6.             ff_error("inf setModelData fail!\n");
  7.             break;
  8.         }
  9.         ret = inf->init();
  10.         if (ret < 0) {
  11.             ff_error("inf init failed\n");
  12.             break;
  13.         }
复制代码

作者: dengkx    时间: 2023-9-26 16:56
chenll 发表于 2023-9-22 19:42
我对照demo_rknn.cpp写了一个py版本的但是加载rknn 模型时候出现了问题

setModelDatac的参数类型没有转换处理,下个版本修复该问题
作者: dengkx    时间: 2023-10-8 14:45
chenll 发表于 2023-9-22 19:42
我对照demo_rknn.cpp写了一个py版本的但是加载rknn 模型时候出现了问题

新版本可以推理了,就是不知道py那边需要的数据类型是什么,暂时将c++的推理结果数据(uint8)实例成py数组,再把这些数组合成list,所以使用模块的getOutputList()获取推理结果
作者: chenll    时间: 2023-10-12 10:36
dengkx 发表于 2023-10-8 14:45
新版本可以推理了,就是不知道py那边需要的数据类型是什么,暂时将c++的推理结果数据(uint8)实例成py数 ...

好的,我用新版本的测试一下
作者: chenll    时间: 2023-10-17 10:32
dengkx 发表于 2023-10-8 14:45
新版本可以推理了,就是不知道py那边需要的数据类型是什么,暂时将c++的推理结果数据(uint8)实例成py数 ...
  1. rga_api version 1.8.1_[4]
  2. E RKNN: [02:31:33.993] parseRKNN: rknn model is too small!
  3. E RKNN: [02:31:33.993] parseRKNN from buffer: Invalid RKNN format!
  4. E RKNN: [02:31:33.993] rknn_init, load model failed!
  5. ERROR: ff_media: setModel: rknn_init fail! ret=-6
  6. ERROR: 15ModuleInference: init: model input height=0, width=0 is incorrect
复制代码



我这里出现说rknn 的模型太小了,我试了几个20Mb的也不行
作者: dengkx    时间: 2023-10-17 11:16
要传模型路径,他应该是没找到你输入的模型文件,把他当做模型数据了。检测一下你输入的模型路径对不对,或者使用绝对路径
作者: chenll    时间: 2023-10-17 11:25
dengkx 发表于 2023-10-17 11:16
要传模型路径,他应该是没找到你输入的模型文件,把他当做模型数据了。检测一下你输入的模型路径对不对,或 ...

这个是设置的路径dec.setModelData('/home/firefly/project/iot_firefly.rknn', 1)

fireflyÄfirefly:ü/project$ pwd
/home/firefly/project
fireflyÄfirefly:ü/project$ ls
ffmedia_release  iot_firefly1.rknn  iot_firefly2.rknn  iot_firefly.rknn  main.py

用的是绝对路径路径应该是没有问题的
作者: dengkx    时间: 2023-10-17 11:26
chenll 发表于 2023-10-17 11:25
这个是设置的路径dec.setModelData('/home/firefly/project/iot_firefly.rknn', 1)

fireflyÄfire ...

使用文件大小要设置0
作者: chenll    时间: 2023-10-17 11:30
dengkx 发表于 2023-10-17 11:26
使用文件大小要设置0

好的,可以了,后面有什么问题在请教你
作者: chenll    时间: 2023-10-17 12:13
dengkx 发表于 2023-10-17 11:26
使用文件大小要设置0
  1. def cv2_call_back(obj, VideoBuffer):
  2.     with obj.lock:
  3.         while obj.frame_complete:
  4.             if not obj.condition.wait(timeout=1):
  5.                 return
  6.         print(obj.module.getOutputList())
  7.         # vb = obj.module.exportUseMediaBuffer(VideoBuffer, obj.frame, 0)
  8.         # if vb is not None:
  9.         #     obj.frame = vb
  10.         #     obj.frame_complete = True
  11.         obj.condition.notify()
复制代码


  1. terminate called after throwing an instance of 'pybind11::error_already_set'
  2.   what():  ModuleNotFoundError: No module named 'numpy'
复制代码

我打印getOutputList 出现了少引入了numpy
作者: chenll    时间: 2023-10-17 12:31
dengkx 发表于 2023-9-22 15:42
看demo/Readme.md 在使用rknn推理的例子是仓库下的rknn/src/demo_rknn.cpp。你可以按照demo/Readme.md 编 ...
  1. dec.setInferenceInterval(1000)
复制代码


这个设置的没有效果,还是每一帧都在做推理
作者: dengkx    时间: 2023-10-17 15:56
本帖最后由 dengkx 于 2023-10-17 16:02 编辑
chenll 发表于 2023-10-17 12:31
这个设置的没有效果,还是每一帧都在做推理

回调是每一帧都会调用的,设置了隔帧推理间隔那里面就会间隔多少帧再去推理,如果你设置了1000,那么推理结果会过一千帧才会改变,你可以打印一下结果。像我们的demo_rknn 如果设置隔帧越大,现象就是画框跟不上人的移动越明显,因为他当前帧没有推理,还是使用之前帧的推理结果去画框,所以画框跟不上人移动

作者: chenll    时间: 2023-10-17 16:40
dengkx 发表于 2023-10-17 15:56
回调是每一帧都会调用的,设置了隔帧推理间隔那里面就会间隔多少帧再去推理,如果你设置了1000,那么推理 ...
  1. 1537069 firefly    1 -19 1042024 128440 108180 S  23.9   3.2   0:27.87 python3
复制代码

好的,还有一个问题需要请教你一下,这个是我一路使用的CPU 到了23.9 可以设置没有解析的不解码吗,就是和上次你说的在cv2_call_back设置休眠差不多的效果
作者: dengkx    时间: 2023-10-17 17:03
chenll 发表于 2023-10-17 16:40
好的,还有一个问题需要请教你一下,这个是我一路使用的CPU 到了23.9 可以设置没有解析的不解码吗,就 ...

什么是没有解析的不解码吗??
作者: chenll    时间: 2023-10-17 17:20
dengkx 发表于 2023-10-17 17:03
什么是没有解析的不解码吗??

就是说一个摄像头的解码用了25的CPU,因为我只需要一秒识别一次,其他时候我都不需要解码,有什么办法可以处理吗
作者: chenll    时间: 2023-10-17 17:27
dengkx 发表于 2023-10-17 17:03
什么是没有解析的不解码吗??
  1. def cv2_call_back(obj, VideoBuffer):
  2.     time.sleep(1)
复制代码

就是之前设置在回调函数中做一秒的延迟,可以减少很多CPU的负载,有什么办法可以实现吗




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1