华为Atlas Python多进程应用开发
收藏回复举报
华为Atlas Python多进程应用开发
发表于2023-11-02 10:28:16
0 查看

常规多进程视频处理

假设你要开发一款视频分析应用,需要同时接入两路视频,且两路画面都需要人脸检测功能。为了充分利用设备资源,视频解码要在昇腾芯片上实现。一种可能的应用设计如下:

ascend_mp_diagram_o-1.jpg

该设计包含了两个进程,进程1负责接入视频与图像解码;进程2负责人脸检测。两个进程通过队列在内存中交换数据。在不使用昇腾硬件的环境下,你可以使用这段代码实现:

"""Template code for video frame processing.""" 
import multiprocessing as mp 
import cv2 

BUFFER_SIZE = 12 
RUNNING = mp.Value("i", 1) 


def get_frames(srcs, q: mp.Queue): 
    """子进程对象。用于视频流解码,并将解码后的图像填充到队列中。""" 
    caps = [cv2.VideoCapture(src) for src in srcs] 
    print("Opening streams...") 
    while RUNNING.value == 1: 
    	for i, cap in enumerate(caps): 
        	_, frame = cap.read() 
            q.put((frame, i)) 
            print("Streaming stopped.") 


def main(): 
    # 设定视频源 
    video_srcs = ['/home/robin/Videos/pose.mp4', '/home/robin/Videos/mask.mp4', ] 
    
    # 构建用于交换数据的队列 
    frame_q = mp.Queue(maxsize=BUFFER_SIZE) 
    
    # 构建进程并启动它 
    p = mp.Process(target=get_frames, args=(video_srcs, frame_q,)) 
    p.start() 
    
    # 预览图像。 
    while RUNNING.value == 1: 
        frame, cap_id = frame_q.get() 
        frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5) 
        cv2.imshow('{}'.format(cap_id), frame) 
        if cv2.waitKey(1) == 27: 
            RUNNING.value = 0 
            
    print("Closing queue...") 
    frame_q.close() 
    
    print("Joining process...") 
    p.terminate() 
    
    print("All done.") 

if __name__ == "__main__": 
    main()

硬件加速的视频解码

视频解码是典型的CPU繁重型任务。昇腾310芯片中有专门的硬件模块可以实现H.264/265硬件加速解码。我们可以借助该硬件模块来减轻CPU负担,加快应用运行速度。

在上一篇关于图像裁切的文章中,你已经通过昇腾应用开发的Python SDK pyACL实现了图像的区域裁切。视频解码的开发过程与其非常类似,充斥着大量有着“奇怪”名字的API。在这里我们将引入一款由华为FAE工程师进一步封装后的Python SDK:AscendFly。它将常用功能封装为模块,然后对外提供类似OpenCV风格的接口,可以有效提升开发效率。

我要发帖子