本文在比赛结束前将持续更新...
5.23 周星星方案已更新.
多模态短视频分类是视频理解领域的基础技术之一,在安全审核、推荐运营、内容搜索等领域有着十分非常广泛的应用。一条短视频中通常包含有三种模态信息,即文本、音频、视频, 它们在不同语义层面的分类体系中发挥着相互促进和补充的重要作用。
微信产品的内容生态繁荣,创作者覆盖范围大, 导致短视频数据中普遍存在着模态缺失、相关性弱、分类标签分布不均衡等问题,是实际应用中需要着重解决的技术难点。本赛题要求参赛队伍基于微信视频号短视频数据以及对应的分类标签标注,采用合理的机器学习技术对指定的测试短视频进行分类预测。
比赛分为初赛和复赛两个阶段:
- 初赛阶段提供百万量级的无标注数据和十万量级的有标注数据用于训练;-
- 复赛阶段训练数据和初赛相同,主要区别是初赛阶段只提供视频抽帧特征,而复赛阶段提供视频抽帧原始图像。
初赛阶段所有训练数据对参赛队伍开放下载;复赛阶段的训练数据为闭源数据,参赛队伍在腾讯云TI-ONE平台完成训练。
比赛分为初赛和复赛两个阶段:初赛阶段提供百万量级的无标注数据和十万量级的有标注数据用于训练;复赛阶段训练数据和初赛相同,主要区别是初赛阶段只提供视频抽帧特征,而复赛阶段提供视频抽帧原始图像。初赛阶段所有训练数据对参赛队伍开放下载;复赛阶段的训练数据为闭源数据,参赛队伍在腾讯云TI-ONE平台完成训练。
数据格式
字段名 | 类型 | 举例 | 说明 | 备注 |
id | String | 13655102198344648800 | 视频唯一ID | |
category_id | String | 2117 | 人工标注的视频分类ID | category_id 固定为4位字符:前两位为一级分类ID,后两位对应一级分类下的二级分类ID。 |
title | String | 苏炳添刷新亚洲记录小组第一轻松晋级百米决赛#奥运@微信时刻 | 视频标题 | 可能存在空值。 |
frames_feature | float list | [ [0.89, 1.86, -4.67, -4.38, ...], [0.13, 1.11, -2.12, -3.24, ...], ] | 视频帧的特征 | 使用预训练模型提取的视频帧特征。每秒抽取一帧进行提取。每个视频最多提供前32帧的特征,超出的部分不会被使用。 |
frames | String | 13655102198344648800.zip | 视频帧打包的路径 | 视频帧的原始图像。每秒抽取一帧。每个视频最多提供前32帧图像,用zip打包。该字段仅在复赛阶段提供。 |
asr | String | 苏炳添小组第一苏炳添创造了历史,他成为了第一个进入奥运会百米飞人决战的黄种人。创造了中国田径新的纪录。 | 视频的音频转文本识别 | 可能存在空值。 |
ocr | dict list | [{"time": 0, "text": "苏炳添创造新纪录荣获小组第一"}, ...] | 视频的OCR识别 | 该字段为一个列表,记录了不同时刻的OCR识别结果。相邻帧的重复识别已被去除。最多提供前32秒的OCR结果。可能存在空值。 |
比赛提供的数据集有三个类别:无标注训练数据集、有标注训练数据集、测试数据集。各类数据集具体包含字段如下表所示。
提交结果格式
参赛者需要提交所有测试集的category_id,具体要求如下:
- 测试结果写入到一个 csv 文件中进行提交。
- csv文件中包含两列:id 和 category_id,中间用逗号分隔。
- csv文件的行数应与测试集的样本数量相同。视频 id 顺序可以不同。
官方baseline代码中 inference.py 有生成提交文件的样例。
分类的评估指标采用F1,由于有多个类别,而且类别不均衡,所以同时采用F1 micro和F1 macro,取平均值。同时,分类体系包含一级分类和二级分类,在评测中会分别计算并取平均值。
考虑实际使用,我们希望参赛选手使用的模型是简单而高效的,不鼓励使用超大模型和各种复杂ensemble。所以在复赛阶段,我们将限定模型大小并对运行时间做出限制,要求选手提供docker,包含测试代码,由官方调用。
这里简单介绍一下如何达到0.65分数的baseline,框架如下图所示,首先将文本(title,asr,ocr)全部拼接起来,然后过一个embedding layer得到文本的embedding。
然后视频特征经过一个线性层+激活函数,映射到和文本embedding一样的维度(768),得到视频的embedding。之后将文本和视频的embedding拼接起来,过一个BERT。这里要注意的是文本的embedding layer和BERT都是使用huggingface上已经预训练好的模型作为初始化,如hfl/chinese-roberta-wwm-ext。最后做一下mean pooling在经过一个MLP做200分类即可。剩下的就是调学习率和epoch了。
思考:这是目前比较直接的一个方案,也没做其他框架的尝试。不过文本只是简单的暴力拼接,我相信应该还有更好的模型框架来处理不同的文本。
模型方案其实很简单
- title,ocr,asr均是裁剪前64、后64个字扔入原版bert中
- framefeature部分采用vlad + fv + dbow + rvlad
- 因为有很多词没有利用上,引入tfidf特征保证所有词语利用上
- 融合部分采用dense后融合,简单修改了senet的attention部分
我们的方法主要有以下几点:
- 加入尚未用到的特征,title+asr+ocr提关键词
- 视频+文本embedding拼接,过largebert再过分类器
- mlm,mfm预训练
- 还尝试了一些其他的数据预处理思路,比如数据清洗(去停用词),简单的过采样等等,不过没有特别显著的提升
参考资料
- 参赛直达:https://algo.weixin.qq.com
- https://developers.weixin.qq.com/community/minihome/article/doc/000e82980dc0d877a0fde9c4451013
- https://developers.weixin.qq.com/community/minihome/article/doc/000c82736b45e0b7a3fdea74d5bc13
- https://developers.weixin.qq.com/community/minihome/article/doc/000e22f25e0cc026a4fd55bce51013