通用视频打标解决方案
为了帮助您更好的理解视频、检索视频、查找视频,PAI提供了通用视频打标解决方案。该解决方案通过构建并训练视频打标模型、将模型部署为EAS服务、调用服务来实现视频分类。本文为您介绍通用视频打标的解决方案。
前提条件
在开始执行操作之前,请确认您已经完成以下准备工作:
已开通PAI(Designer、DSW、EAS)后付费,详情请参见开通。
已开通并创建工作空间,且添加了DLC计算资源,详情请参见开通PAI并创建默认工作空间。
已创建OSS存储空间(Bucket),用于存储原始数据、标签列表文件及训练获得的模型文件。关于如何创建存储空间,详情请参见控制台创建存储空间。
已创建PAI-EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,详情请参见创建专属资源组。
使用流程
基于阿里云机器学习PAI平台,视频打标解决方案的流程如下。
将视频数据及标签文件上传到OSS存储空间,用于后续的模型训练。若数据未标注可基于智能标注(iTAG)进行原始数据标注,详情请参见智能标注(ITAG)。
在可视化建模平台PAI-Designer上,通过视频分类训练组件构建模型。该组件支持视频帧输入和视频帧组合文本的多模态输入两种形式;输出支持单标签和多标签两种形式。
完成模型训练后,您可以通过通用视频预测组件,对视频数据进行离线批量打标。
您可以将训练好的视频打标模型部署为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)作为分隔符。
说明文本输入是视频对应的描述文本。通过引入额外的文本描述作为输入,可以大幅提升模型的预测精度。
标签文件的示例如下表所示。
任务类型 | 示例 |
视频帧输入和单标签预测组合形式 | |
视频帧输入和多标签预测组合形式 | |
视频帧输入、文本输入和单标签预测组合形式 | |
视频帧输入、文本输入和多标签预测组合形式 |
步骤二、构建视频打标模型及离线批量预测
进入PAI-Designer页面,并创建空白工作流,具体操作请参见操作步骤。
在工作流列表,选择已创建的空白工作流,单击进入工作流。
在工作流页面,分别拖入以下组件,并配置组件参数。
区域
描述
①
配置实验的训练数据集,即配置读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
通过连线将上图各组件节点组织构建为模型工作流。单击画布上方的运行。
实验运行成功之后,即可查看预测结果文件。
预测完成后的输出文件out.txt包含三列,各列描述信息如下所示:
视频数据名称。
预测标签。
每个标签类别的置信度。
步骤三:模型部署及调用模型服务
您可以将训练好的视频打标模型部署为PAI-EAS在线服务,并在实际生产环境中调用模型服务,从而进行在线推理。
首先将训练得到的模型及其他相关配置文件打包为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
进入PAI-EAS 模型在线服务页面。
登录PAI控制台。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择 ,进入PAI-EAS 模型在线服务页面。
部署模型服务。
在PAI-EAS 模型在线服务页面,单击部署服务。
在部署服务页面,配置服务名称、Processor种类、模型文件、资源组种类参数,其中资源组种类选择已创建的专属资源组,参数配置详情请参见控制台上传部署。
在对应配置编辑面板,配置部署信息,具体配置信息如下所示。
{ "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路径。
单击部署,等待一段时间即可完成模型部署。
模型服务在线调试。
在PAI-EAS 模型在线服务页面,单击目标服务操作列下的在线调试。
在调试页面在线调试请求参数区域的Body处,输入以下内容。
{ "content" : "一个人的旅行可以说走就走", "video" : { "url":"http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyMM/video_test/12.mp4" } }
单击发送请求,即可在调试信息区域查看预测结果。预测结果中会给出item_result字段,包含模型预测的标签信息和对应的置信度。
查看模型服务的公网地址和访问Token。
在PAI-EAS 模型在线服务页面,单击目标服务服务方式列下的调用信息。
在调用信息对话框的公网地址调用页签,查看公网调用的访问地址和Token。
使用脚本批量调用模型服务。
创建调用模型服务的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)
将eas_video_text_label.py上传至您的环境,并在脚本上传的当前目录执行如下调用命令。
python <eas_video_text_label.py>
其中,<eas_video_text_label.py>需要替换为实际的Python脚本名称。
监控服务指标。
调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。
在PAI-EAS 模型在线服务页面,单击目标服务服务监控列下的
图标。
在服务监控,查看模型服务调用的指标水位。