首页 机器学习平台 PAI 实践教程 通用方案 通用视频打标解决方案

通用视频打标解决方案

更新时间: 2023-08-23 15:02:26

为了帮助您更好的理解视频、检索视频、查找视频,PAI提供了通用视频打标解决方案。该解决方案通过构建并训练视频打标模型、将模型部署为EAS服务、调用服务来实现视频分类。本文为您介绍通用视频打标的解决方案。

前提条件

在开始执行操作之前,请确认您已经完成以下准备工作:

  • 已开通PAI(Designer、DSW、EAS)后付费,详情请参见开通

  • 已开通并创建工作空间,且添加了DLC计算资源,详情请参见开通PAI并创建默认工作空间

  • 已创建OSS存储空间(Bucket),用于存储原始数据、标签列表文件及训练获得的模型文件。关于如何创建存储空间,详情请参见控制台创建存储空间

  • 已创建PAI-EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,详情请参见创建专属资源组

使用流程

基于阿里云机器学习PAI平台,视频打标解决方案的流程如下。使用流程

  1. 步骤一:准备数据

    将视频数据及标签文件上传到OSS存储空间,用于后续的模型训练。若数据未标注可基于智能标注(iTAG)进行原始数据标注,详情请参见智能标注(ITAG)

  2. 步骤二、构建视频打标模型及离线批量预测

    在可视化建模平台PAI-Designer上,通过视频分类训练组件构建模型。该组件支持视频帧输入和视频帧组合文本的多模态输入两种形式;输出支持单标签和多标签两种形式。

    完成模型训练后,您可以通过通用视频预测组件,对视频数据进行离线批量打标。

  3. 步骤三:模型部署及调用模型服务

    您可以将训练好的视频打标模型部署为PAI-EAS在线服务,并在实际的生产环境中调用模型服务,从而进行在线推理。

步骤一:准备数据

首先您需要根据不同的任务类型准备标签文件和视频数据,并将标签文件和视频数据上传到OSS。注意事项如下所示:

  • 在模型训练和推理过程中,会将OSS Bucket挂载为/root/data。您需要将标签文件中的oss://Bucket替换为/root/data。

    /root/data/path/to/video/Z_qZNBiWdlw_000005_000015.mp4 5
  • 对于多标签预测任务,您需要将标签文件内容转换为如下形式。

    /root/data/path/to/video/-fjW8olkBjI_000034_000044.mp4 0 1 0 1 1 1
  • 对于视频帧输入的任务元素之间使用空格作为分隔符,对于包含视频帧和文本输入的任务元素之间使用Tab(\t)作为分隔符。

    说明

    文本输入是视频对应的描述文本。通过引入额外的文本描述作为输入,可以大幅提升模型的预测精度。

标签文件的示例如下表所示。

任务类型

示例

视频帧输入和单标签预测组合形式

videoinput_multiclass.txt

视频帧输入和多标签预测组合形式

videoinput_multilabel.txt

视频帧输入、文本输入和单标签预测组合形式

videotextinput_multiclass.txt

视频帧输入、文本输入和多标签预测组合形式

videotextinput_multilabel.txt

步骤二、构建视频打标模型及离线批量预测

  1. 进入PAI-Designer页面,并创建空白工作流,具体操作请参见操作步骤

  2. 在工作流列表,选择已创建的空白工作流,单击进入工作流

  3. 在工作流页面,分别拖入以下组件,并配置组件参数。

    组件列表

    区域

    描述

    配置实验的训练数据集,即配置读OSS数据组件的OSS数据路径为存放训练数据标签文件的OSS路径。

    配置实验的验证数据集,即配置读OSS数据组件的OSS数据路径为存放验证数据标签文件的OSS路径。

    配置视频分类训练的参数。视频分类训练组件的配置详情请参见下文的视频分类训练参数配置

    配置实验的测试数据集,即配置读OSS数据组件的OSS数据路径为存放测试数据标签文件的OSS路径。

    配置视频分类预测的参数。通用视频预测组件的配置详情请参见下文的通用视频预测参数配置

    表 1. 视频分类训练参数配置

    页签

    参数

    描述

    本案例使用的示例值

    字段设置

    训练所用oss目录

    训练过程中模型和Log保存的OSS路径。

    oss://em-dlc-sh.oss-cn-shanghai-internal.aliyuncs.com/EasyMM/DataSet/videotext/experiments/swin_t_bert/

    说明

    需要修改为您使用的OSS路径。

    训练数据文件oss路径

    存放训练数据标签文件的OSS路径,如果您使用读OSS数据组件作为上游节点,则该参数无需设置。

    无需设置

    评估数据文件oss路径

    存放验证数据标签文件的OSS路径,如果您使用读OSS数据组件作为上游节点,则该参数无需设置。

    无需设置

    预训练模型oss路径

    存放预训练模型的OSS路径,导入预训练模型的权重文件。非必填。

    无需设置

    参数设置

    视频分类模型网络

    视频分类模型类别,其中swin_t_bert为视频帧组合文本的多模态输入,其他类别为视频帧输入。

    swin_t_bert

    是否多标签

    是否使用多标签预测形式。

    True

    分类类别数目

    分类类别数目。

    1206

    初始学习率

    模型训练的初始学习率,默认值为0.1。

    5e-5

    训练迭代轮数

    训练迭代的总轮数,默认值为10。

    1

    warmup初始学习率

    当视频分类模型网络为x3d_xs、x3d_I、x3d_m时,该参数支持设置。

    采用warmup学习策略的初始学习率,默认值为0.01。

    无需设置

    warmup迭代轮数

    当视频分类模型网络为x3d_xs、x3d_I、x3d_m和swin_t_bert时,该参数支持设置。

    采用warmup学习策略的迭代轮数,默认值为35。

    35

    训练batch_size

    训练时使用的批数据量。

    4

    模型保存频率

    保存模型的迭代轮数。

    1

    执行调优

    单机或分布式

    支持单机或分布式训练模式:

    • single_dlc:单机模式。

    • distribute_dlc:分布式训练模式。

    single_dlc

    是否使用GPU

    输入数值每100代表1张GPU卡。例如,800表示8张GPU卡。

    100

    gpu类型选择

    GPU机型选择

    64vCPU+256GB Mem+8xv100-ecs.gn6v-c8g1.16xlarge

    worker个数

    采用分布式训练模式时的机器数量。

    无需设置

    表 2. 通用视频预测参数配置

    页签

    参数

    描述

    本案例使用的示例值

    字段设置

    数据来源

    仅支持输入OSS数据。

    OSS

    模型oss路径

    存放预测模型的OSS路径。如果您使用视频分类训练作为上游节点,则该参数无需设置。

    无需设置

    输入oss文件路径

    存放测试数据标签文件的OSS路径。如果您使用读OSS数据组件作为上游节点,则该参数无需设置。

    无需设置

    输出oss文件路径

    存放预测结果文件的OSS路径。

    oss://em-dlc-sh.oss-cn-shanghai-internal.aliyuncs.com/EasyMM/DataSet/videotext/experiments/swin_t_bert/out.txt

    说明

    out.txt文件存放的路径需要修改为您使用的OSS路径。

    输出oss资源目录

    预测过程产生其他文件存放的OSS目录,对于视频分类任务,该参数无需设置。

    无需设置

    参数设置

    模型类型

    预测模型的类型。

    swin_t_bert

    分类类别数目

    分类任务的分类类别数目。

    1206

    测试batch_size

    测试时使用的批数据量。

    1

    执行调优

    gpu机型选择

    GPU的机型选择。

    64vCPU+256GB Mem+8xv100-ecs.gn6v-c8g1.16xlarge

  4. 通过连线将上图各组件节点组织构建为模型工作流。单击画布上方的运行

    实验运行成功之后,即可查看预测结果文件。预测结果文件

    预测完成后的输出文件out.txt包含三列,各列描述信息如下所示:

    • 视频数据名称。

    • 预测标签。

    • 每个标签类别的置信度。

步骤三:模型部署及调用模型服务

您可以将训练好的视频打标模型部署为PAI-EAS在线服务,并在实际生产环境中调用模型服务,从而进行在线推理。

  1. 首先将训练得到的模型及其他相关配置文件打包为tar.gz格式,并上传至您的OSS Bucket。模型和配置文件的目录结构如下所示。

    video_text_label
    ├── video_text_label_model
    │   ├── chinese-roberta-wmm-ext
    │   │   ├── config.json
    │   │   ├── pytorch_model.bin
    │   │   ├── special_tokens_map.json
    │   │   ├── tokenizer_config.json
    │   │   └── vocab.txt
    │   ├── video_item.py
    │   └── video_text_multiclass.pth
    └── video_text_label_ext.py

    其中:

    • video_text_label_model:放置您训练的视频打标模型和模型配置文件。

    • video_text_label_ext.py:视频打标在线推理的配置文件。

      video_text_label_ext.py的内容示例如下所示。

      import mediaflow
      import media_ops as ops
      import mediaflow.deractor as deractor
      from mediaflow import GraphBuilder
      from mediaflow.data import Video
      from mediaflow.function_data import Context, DataFrame, ImageFrame, AudioFrame, VideoMeta
      from mediaflow.config import ImageDecodeConfig, AudioDecodeConfig, EncodeConfig, window_policy
      import math
      import cv2
      
      @deractor.window
      def short_side_scale(image_frames, ctx):
          new_frames = []
          for i in range(len(image_frames)):
              im = image_frames[i].get_numpy()
              height, width, _ = im.shape
              new_width, new_height = 600, 600
              if width < height:
                  new_height = int(math.floor((float(height) / width) * 600))
              else:
                  new_width = int(math.floor((float(width) / height) * 600))
              im = cv2.resize(im, (new_width, new_height))
              image_frame = image_frames[i]
              image_frame.set_numpy(im)
              new_frames.append(image_frame)
          return new_frames
      
      
      class MyGraphBuilder(GraphBuilder):
          def run_option(self):
              return {
                  "enable_share_memory": False,
                  "share_memory_size": 40000,
                  "worker_threads": 128,
                  "output_from_context": True,
                  "rpc_keepalive": 1000000,
                  "enable_numpy": True,
                  "metric_print": True
              }
      
          def build_graph(self):
      
              image_decode_config = {"use_gpu": "False",'fps':'6'}
      
              video_item_recognition_config ={
                  'model_path' : '/home/admin/docker_ml/workspace/model/video_text_label/video_text_label/video_text_multiclass.pth',
                  'config_path' : '/home/admin/docker_ml/workspace/model/video_text_label/video_text_label/video_item.py',
                  'token_path' : '/home/admin/docker_ml/workspace/model/video_text_label/video_text_label/chinese-roberta-wmm-ext/',
                  'prob_threshold' : '0.5'
              }
      
              image_frames = Video('video').decode_image(ImageDecodeConfig(image_decode_config))
              image_frames = image_frames.window(window_policy.select_all_window(),short_side_scale)
              image_frames_item = image_frames.window(window_policy.count_window(window_count=64), ops.video.apps.video_item_recognition,video_item_recognition_config)
      
      
      GraphBuilder.register(MyGraphBuilder)

      您需要按照以下参数说明,修改以上代码的配置参数。

      参数类型

      参数

      描述

      本案例使用的示例值

      视频解码参数

      use_gpu

      是否使用GPU进行视频解码。

      False

      fps

      视频解码时的采样频率。

      6

      视频标签分类参数

      model_path

      自定义视频分类模型的本地路径。

      /home/admin/docker_ml/workspace/model/video_text_label/video_text_label/video_text_multiclass.pth

      config_path

      模型结构定义文件路径。

      /home/admin/docker_ml/workspace/model/video_text_label/video_text_label/video_item.py

      token_path

      文本token配置文件路径。

      /home/admin/docker_ml/workspace/model/video_text_label/video_text_label/chinese-roberta-wmm-ext/

      prob_threshold

      标签预测阈值取值在0-1之间,当某标签预测概率大于该阈值则进行输出。

      0.5

  2. 进入PAI-EAS 模型在线服务页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型部署 > 模型在线服务(EAS),进入PAI-EAS 模型在线服务页面。

  3. 部署模型服务。

    1. PAI-EAS 模型在线服务页面,单击部署服务

    2. 在部署服务页面,配置服务名称Processor种类模型文件资源组种类参数,其中资源组种类选择已创建的专属资源组,参数配置详情请参见控制台上传部署

      必选参数
    3. 在对应配置编辑面板,配置部署信息,具体配置信息如下所示。

      对应配置编辑
      {
            "cloud": {
              "computing": {
                  "instance_type": "ecs.gn6i-c4g1.xlarge"
              }
          },
          "model_entry": "video_text_label/video_text_label_ext.py",
          "name": "video_text_label",
          "data_image": "registry.cn-shanghai.aliyuncs.com/eas/mediaflow:py36-0.3.3",
          "model_path": "http://pai-vision-data-hz.cn-hangzhou.oss.aliyun-inc.com/VIP/models_ext/video_text_label.tar.gz",
          "generate_token": "true",
          "processor": "mediaflow_py3",
          "model_config" : {
              "graph_pool_size":8,
              "wait_resource":false,
              "worker_threads":16
          },
          "metadata": {
            "eas.handlers.disable_failure_handler" :true,
            "rpc.batching": false,
            "rpc.worker_threads": 2,
            "rpc.enable_jemalloc": true,
            "rpc.keepalive": 500000,
            "rpc.enable_service_hang_detect": true,
            "rpc.service_hang_detect_period": 5,
            "rpc.max_batch_timeout": 500,
            "cpu": 4,
            "instance": 1,
            "cuda": "9.0",
            "rpc.max_batch_size": 64,
            "memory": 20000,
            "gpu": 1
          },
          "requirements":"http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/VIP/VideoOp/release/202202_offline/requirements.txt"
        }

      如果您希望部署自行训练的模型,model_path需要替换为第一步打包的tar.gz文件的OSS Bucket路径。

    4. 单击部署,等待一段时间即可完成模型部署。

  4. 模型服务在线调试。

    1. 在PAI-EAS 模型在线服务页面,单击目标服务操作列下的在线调试

    2. 在调试页面在线调试请求参数区域的Body处,输入以下内容。

      {
          "content" : "一个人的旅行可以说走就走",
          "video" :
            {
              "url":"http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyMM/video_test/12.mp4"
              }
      }
    3. 单击发送请求,即可在调试信息区域查看预测结果。预测结果中会给出item_result字段,包含模型预测的标签信息和对应的置信度。

      在线调试
  5. 查看模型服务的公网地址和访问Token。

    1. 在PAI-EAS 模型在线服务页面,单击目标服务服务方式列下的调用信息

    2. 在调用信息对话框的公网地址调用页签,查看公网调用的访问地址和Token

  6. 使用脚本批量调用模型服务。

    1. 创建调用模型服务的Python脚本eas_video_text_label.py。

      import requests
      import json
      #下面的Token需要替换为实际值。
      headers = {
          "Authorization":"YTllNjxxxxxxxxxxxVlMDliNjdhODExZWIzM2UwYTY5Yg=="
      }
      data = '{"content" : "一个人的旅行可以说走就走","video" :{"url":"http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyMM/video_test/12.mp4"}}'
      data = data.encode('utf-8')
      for i in range(20):
            #下面的requests入参需要替换为实际的访问地址。
          result = requests.get('http://1502xxxxxxxxxxx.cn-shanghai.pai-eas.aliyuncs.com/api/predict/video_text_label_test',headers=headers,data=data).text
          print(result)
    2. 将eas_video_text_label.py上传至您的环境,并在脚本上传的当前目录执行如下调用命令。

      python <eas_video_text_label.py>

      其中,<eas_video_text_label.py>需要替换为实际的Python脚本名称。

  7. 监控服务指标。

    调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。

    1. 在PAI-EAS 模型在线服务页面,单击目标服务服务监控列下的服务监控图标图标。

    2. 服务监控,查看模型服务调用的指标水位。

      服务监控
阿里云首页 机器学习平台 PAI 相关技术圈