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

前提条件

在开始执行操作之前,请确认您已经完成以下准备工作:
  • 已开通PAI(Designer、DSW、EAS)后付费,详情请参见开通
  • 已开通并创建工作空间,且添加了DLC计算资源,详情请参见开通并创建默认工作空间
  • 已创建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路径。
    配置视频分类训练的参数。视频分类训练组件的配置详情请参见下文的表 1
    配置实验的测试数据集,即配置读OSS数据组件的OSS数据路径为存放测试数据标签文件的OSS路径。
    配置视频分类预测的参数。通用视频预测组件的配置详情请参见下文的表 2
    表 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),进入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. 在调试页面在线调试请求参数区域的Request 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. 服务监控,查看模型服务调用的指标水位。
      服务监控