同时对四路视频进行目标识别,如何提高执行效率?
收藏回复举报
同时对四路视频进行目标识别,如何提高执行效率?
t('forum.solved') 已解决
发表于2024-07-10 14:09:10
0 查看

如题:在板块上写了个程序,同时获取4路视频(RTSP流),使用yolov5进行目标识别,然后基于quart实现对分析画面对实时查看。

实现过程:

1.在主进程完成,acl初始化和设备对指定

def init_acl(device_id):
     '''acl初始化函数'''
    ret = acl.init()    # 0-成功,其它失败
    if ret:
        raise RuntimeError(ret)

    ret = acl.rt.set_device(device_id) 
    if ret:
        raise RuntimeError(ret)
    print('ACL init Device Successfully')
    return True

2.创建4个线程,在各个线程中分别创建一个context,并分别捕获对画面进行模型推理。 这块是参考yolo_acl_sample例程的代码

self.context, ret = acl.rt.create_context(device_id)  # 显式创建一个Context
if ret:
    raise RuntimeError(ret)
def execute(self, input_list):
    '''创建输入dataset对象, 推理完成后, 将输出数据转换为numpy格式'''
    self._gen_input_dataset(input_list)  # 创建模型输入dataset结构
    ret = acl.mdl.execute(self.model_id, self.input_dataset, self.output_dataset)  # 调用离线模型的execute推理数据
    if ret:
        self.mylogger.error(f"acl.mdl.execute fail!--{ret}")
        self._release_dataset(self.input_dataset)  # 失败时释放dataset  --创建输入空间失败时会释放。
        return None
    out_numpy = self._output_dataset_to_numpy()  # 将推理输出的二进制数据流解码为numpy数组, 数组的shape和类型与模型输出规格一致
    self._release_dataset(self.input_dataset)  # 释放dataset
    return out_numpy

3.基于quart异步框架实现分析画面对实时查看。

websocket + img传输

存在的问题:

1.有时acl.mdl.execute会执行失败,返回ret为507011。 出现的比较随机,有时一路画面一直都执行失败,需要重启程序,有时零星报几个后能恢复,但还是比较常见。

画面分辨率是 :640*480

分析帧率控制在了:10帧

2.执行模型推理会造成quart异步阻塞的告警。

正常来说线程里面执行是不会影响到主线程对事件循环的,打印了执行时间的输出,大部分“execute”函数执行的时间在0.05秒左右,个别会到0.1。

outputs = None
start_time = time.time()
outputs = self.execute([img,])#创建input,执行模型,返回结果 --失败返回None
#time.sleep(1)
end_time = time.time()
print(f"1Processing time: {end_time - start_time} seconds")

但是就是会产生异步的告警,我用time.sleep(1)来代替execute的执行,就不会产生异步告警。

是模型推理函数中有一些IO阻塞类似对操作? 是否有办法解决或优化?

cpu和内存对占用率都不太高,CPU在60%左右(4核--将AI CPU 的数量配置为 了0),内存使用2.2G

3.我执行ACL资源申请对过程是否正确? 主线程中初始化acl和device,然后子线程中各自申请context,再各自执行推理。是否有更加稳定和高性能对方案?

我要发帖子