深度学习之视频分类项目小记

写在前面,最近一阵在做视频分类相关的工作,趁有时间来记录一下。本文更注重项目实战与落地,而非重点探讨多模/视频模型结构的魔改

零、背景

  1. 目标:通过多模态内容理解技术,构建视频层级分类体系
  2. 原技术方案:
    a. 分别用 inception-Resnetv2/bert/vggish处理视觉/文本/音频特征,再用 netvlad 处理时序特征,再用 AFM/self-attention融合各模态信息
    b. 方案缺点很明显,1)模块太多,维护成本太高;2)各模块独立训练,用每个模块最优的模型组合起来未必效果最好,如何选择各合适的模块不好确定
  3. 新技术方案:
    a. attenion 一把梭,各种模态的信息直接送入类 bert 去处理,利用对比学习模型 cn-clip 提升视觉与文本对齐能力,采用 mlm、itc 、itm、mmm等多种预训练任务增强模态间交互,结合 rdrop、fgm等训练算法提升泛化性能,使用知识蒸馏与难例挖掘等手段提升样本标出率,借助 class balance 与 label smoothing 改善类别不均衡问题
    b. 新方案效果提升明显,模块也少,维护起来成本也低
    c. 新方案为 2022 某视频分类比赛第 8 名

一、技术手段

1、模型方面

在这里插入图片描述

1)单流模型

  1. 结构:模型一

    1. 文本过embedding层,视频过zn_clip的vit,然后拼接起来送入bert,最后mean pooing后接分类层
  2. 优点:

    1. 架构简单、预训练好做,参数少

    服务性能:a10卡,vit + bert 的 qps =9 左右

2)双流模型:

  1. 结构:
    1. 模型二:文本过bert,视频过clip,然后将视频向量和文本向量拼接起来,再过一个transformer,mean pooing后接分类层
    2. 模型三,文本过bert,视频过clip,得到视频向量和文本向量,然后做cross attention,即对于视频向量,用文本向量作为Q进行注意力加权,而对于文本向量,用视频向量作为Q进行注意力加权,最后mean pooing后接分类层
  2. 优点:
    1. 相当于一种后融合,先让每个模态单独学更好的特征,再去做融合,效果理论上也会更好

3)训练 tricks

  1. 训练手段

    1)r-drop: acc 上升 71%—>71.7%

    2)swa:平均最高 3 个 checkpoints权重,模型准确率略有提升(71.7%->71.8%)

    4)ema:acc 71.879% -> 71.975%

    5)fgm对抗训练,acc 71.975% -> 72.206%

    6)word-base:acc 72.206% -> 72.4%

    7)ensemble:model1(72.638%) + model2(72.785%)—> acc 73.601%

    8)训练帧数增加:帧数从 10—>30,acc 67.308 -> 67.782

    9)图片尺寸:resize224x224 —> centercrop,acc 72.4—>73

  2. loss 改进

    1. 类别不均衡问题:label smoothing 和 class balanced loss 融合,acc 71.750% -> 71.879%
    2. 层级分类问题:细粒度分类+粗粒度分类、细粒度分类映射、hmc los

4)预训练

  1. mlm、mfm、itm、itc、mmm、mma
    在这里插入图片描述

2、数据方面

1)数据准备

  1. 类别关系映射 + 大量人标注,累计积累了 103 w 数据
  2. 基于初版模型,根据top1&top2 的预测分数,捞取边界数据,提升标出率

2)数据清洗

  1. N 折交叉验证
  2. 训练早停,筛选 diff 数据

3)伪数据构造

  1. 知识蒸馏
    1. 标注数据上,使用更多帧、更大模型(clip-large)、不同模型架构,训练n 个模型
    2. 使用 i 得到的 n 个模型ensemble 为无标注数据打伪标签
    3. 在 ii 的伪标签数据上做预训练,预训练任务及伪标签分类,预训练时随机使用10/30帧的视频,以缓解预训练和微调过程不一致
    4. 重复 ii、iii,用最后得到的模型做微调初始化
    5. 在有标注数据上进行微调
  2. 基于检索的伪标签
    1. 标注数据上,训练 DML 模型并提取特征
    2. 无标记数据检索有标记数据,对 top10 样本进行类别投票,生成伪标签

3、后处理方面

  1. 不同类别给予不同的缩放系数,大类为 1,效率大于 1,使用粒子群优化算法pso搜一个也行
  2. 模型能力总归是有限的,根据业务需要,结合人审,制定合适的送审策略也是重要的

4、外部信号

1)结合先验特征,比如作者主垂类信息、作者兴趣点、作者认证信息、同作者发布内容等

2)结合后验信号,视频评论,点赞、完播率等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/95670.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.1 树和二叉树的定义

思维导图: 问题 为什么有树和二叉树? "树" 和 "二叉树" 都是数据结构中常用的结构,它们分别有其独特的应用和优点。我们可以从它们的定义和特性中理解为什么它们都存在。 1. **树 (Tree):** - **定义**:…

Unity中Shader的面剔除Cull

文章目录 前言一、Unity中Shader的面是否剔除,是由我们自己决定的二、暴露一个属性来控制 剔除模式三、如何区分正反面 前言 Unity中Shader的面剔除 Cull Off | Back | Front 一、Unity中Shader的面是否剔除,是由我们自己决定的 使用 Cull Off | Back |…

创建2个线程并执行(STL/Windows/Linux)

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun1(void) {cout << "one STL thread 1!" << endl; }void thread_fun2(void) {cout << "one STL thread 2!" <…

Vue——vue3+element plus实现多选表格使用ajax发送id数组

代码来源: Vue 3结合element plus&#xff08;问题总结二&#xff09;之 table组件实现多选和清除选中&#xff08;在vue3中获取ref 的Dom&#xff09;_multipletableref.value.togglerowselection()打印出来的是u_子时不睡的博客-CSDN博客 前言 为了实现批量删除功能的功能…

Langchain使用介绍之outparser 和memory

上一篇博客中对Langchain中prompt进行了详细的介绍&#xff0c;此篇博客将介绍Langchain中的outparser和memory。当调用大模型生成内容时&#xff0c;返回的内容默认是string类型&#xff0c;这对于我们获取response中的某些内容信息可能会带来障碍&#xff0c;例如返回的内容本…

golang-bufio 缓冲写

1. 缓冲写 在阅读这篇博客之前&#xff0c;请先阅读上一篇&#xff1a;golang-bufio 缓冲读 // buffered output// Writer implements buffering for an io.Writer object. // If an error occurs writing to a Writer, no more data will be // accepted and all subsequent…

【python爬虫】批量识别pdf中的英文,自动翻译成中文上

不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。本文提供批量识别pdf中英文的方法,后续文章实现自…

无涯教程-Android - RadioGroup函数

RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…

verilator——牛刀小试

verilator——牛刀小试 安装verilator可见&#xff1a;https://blog.csdn.net/qq_40676869/article/details/132648522?spm1001.2014.3001.5501 正文开始 编写一个异或的电路模块如下&#xff1a; top.v module top(input a,input b,output f );assign f a ^ b; endmodul…

Python3 条件控制

Python3 条件控制 Python 条件语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 代码执行过程&#xff1a; if 语句 Python中if语句的一般形式如下所示&#xff1a; if conditi…

c++入门一

参考&#xff1a;https://www.learncpp.com/cpp-tutorial/ When you finish, you will not only know how to program in C, you will know how NOT to program in C, which is arguably as important. Tired or unhappy programmers make mistakes, and debugging code tends…

离散数据编码方式总结(OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies、DictVector

写在前面 在机器学习的特征选择的时候&#xff0c;往往有一些离散的特征不好计算&#xff0c;此时需要对这些特征进行编码&#xff0c;但是编码方式有很多&#xff0c;不同的包也会有不同的编码方式。&#xff08;明白OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummi…