更新时间:2021-03-18 GMT+08:00
分享

离线视频推理(InferOfflineVideo)

本demo主要实现离线视频推理功能,针对输入的H264/H265数据,实现视频解码、图片格式转换、目标检测、抠图与缩放、属性检测、JPEG编码,主要涉及VDEC、VPC、JPEGE、模型推理等功能,业务流程如图1所示,demo的使用指导请参考功能根目录的Readme。

图1 业务流程图

输入的H264/H265数据可来源于摄像头或通过ffmpeg解封装的视频文件(MP4文件),本样例以H264文件为样例。

获取方式

离线视频推理(InferOfflineVideo)获取地址:https://gitee.com/HuaweiAtlas/samples

功能解析

本demo的Graph业务流由7个Engine组成,使用了目标检测(vgg_ssd)和属性识别(resnet50)两个模型。Engine间的输入与输出端口连接关系如图2所示。

图2 处理流程
  • StreamPuller

    StreamPuller的数据来源主要包括以下两个方面:

    1. H264/H265格式的离线视频

      通过文件系统函数打开视频文件,读取H264/H265数据到buff后发送给VDecEngine进行硬件解码。

    2. MP4、AVI等封装格式离线视频

      通过ffmpeg命令行或API代码将MP4、AVI等封装格式解封装为H264/H265格式。

      • 通过ffmpeg命令行:

        ffmpeg -i infile.mp4 -an -vcodec libx264 -crf 23 outfile.h264

        若通过命令行方式将MP4解封装为H264/H265文件,则后面解码流程与上面第1点处理流程相同。

      • 本样例代码还实现了通过ffmpeg API代码将MP4、AVI等封装格式解封装为H264/H265文件。

        主要涉及以下几个步骤,将读取出的H264/H265数据发送给vdec进行解码,ffmpeg的API接口调用流程如下:

        1. av_register_all
        2. avformat_open_input
        3. avformat_find_stream_info
        4. av_find_best_stream
        5. av_init_packet
        6. h264_mp4toannexbav_read_frame
  • VDecEngine

    VDecEngine主要用于完成H264/H265视频流的解码,主要由初始化和周期解码两部分组成。

    • 初始化:资源申请和创建,例如CreateVdecApi,创建H26*解码句柄,同时由于VDEC输出的是HFBC的格式,创建VPC句柄,用于将HFBC转换成YUV。
    • 周期解码:周期性对发送过来的H264/H265进行解码,VDEC解码采用异步方式解码,调用VdecCtl传入原始数据,Matrix框架完成解码后,调用回调函数vdec_frame_return,将解码后的数据返回给用户,用户在vdec ctrl的入参中将回调函数注册给vdec模块。

      本样例在回调函数中实现HFBC格式到YUV格式的转换,并将转换后的数据发送给下一个Engine。

  • SSDDetection

    实现SSD检测的推理和结果输出,包括分类ID,置信度和框位置。

  • ObjectClassification

    将目标检测的结果进行进一步详细分类,输出包括分类ID和置信度。

  • JpegEncode

    负责将解码过的YUV图片编码成JPEG图片。

  • DstEngine

    将Device侧的处理结果数据保存为文件和图片。

分享:

    相关文档

    相关产品