0%

腾讯实习项目总结

腾讯实习工作总结

AI 在视频生产流程里的应用。首先是是智能拆条,视频进来之后,把片头、片尾和广告去掉,其次是标注,就像把所有的商品打上标签一样,根据这个标签进行推荐和搜索。然后是审核,过滤盗版、情色等内容。最后是播放处理,比如自动生成封面和动态海报图,帮助对剪辑不熟悉的自媒体用户选取魅力封面图,也提高了海量视频的分发效率。
视频标注为视频打上时间 - 语义标签,是 AI 视频理解的关键。标签有不同类别、层次和粒度,例如识别不同人物、行为、场景、物品等等,还可以用于对内容和用户的精细化分析,例如年龄、表情、服装款式,手机品牌等,更好地进行搜索推荐,实现精准的内容分发。
AI 应用在文字识别,可以对字幕进行文字识别和语义理解,对审核图片、视频中的不合规文字信息进行识别和反垃圾过滤。

视频分类

广电场景下的海量短视频剧名分类:在算法流程中,我们首先把视频的图片进行解码,凑齐N帧,保证每个视频都有相同的采样帧,然后采用resnet网络提取视觉特征,采用NetVlad提取融合时间特征,最后融合多张图片得到视频的分类结果。
我们在总共有957万个短视频,只取出现频次在50-3000类别的短视频总共有552万,剧名类别有8740种,对其进行训练,分类的top1的准确率只到0.18。因此,我们考虑从关键帧和多级分类器方面提高算法的准召率。
抽取关键帧的思路也很简单:我们知将两帧图像进行差分,得到图像的平均像素强度可以用来衡量两帧图像的变化大小。因此,基于帧间差分的平均强度,每当视频中的某一帧与前一阵画面内容产生大的变化,我们便认为它是关键帧,并将其提取出来。
我们可以使用如下三种方法中的一种来提取关键帧,这都是基于帧间差分的:
(1)使用差分强度顺序:我们对所有帧按照平均帧间差分强度进行排序,选择平均帧间差分强度最大的若干张图片作为视频的关键帧。
(2)使用差分强度阈值:我们悬着平均帧间差分强度高于预设阈值的帧作为视频的关键帧。
(3)使用局部最大值:我们选择具有平均帧间差分强度局部最大值作为视频的关键帧。这种方法的提取结果在丰富度上表现更好,提取结果均匀分散在视频中。
在抽帧方面,每个视频里的关键帧数目不同,如果一个视频只有四帧,我们如何取八帧呢?有两个方法,第一个办法是再补尾帧,后面重复实现。还有一个办法是均匀插帧,经评测,均匀补帧比插尾帧效果好很多,因为插尾帧的时候,相当于把最后第四帧插了很多帧无效的信息。如果第四帧是黑帧,或者是无意义的帧,它会带来负面的影响。
除了在每个短视频中提取关键帧获取视频更具判别性的视觉特征外,在全类目的视频分类效果差的原因在于,每个视频的内容、风格差异非常大,从历史题材到都市生活、从科幻大片到动漫题材,模型很难去拟合出有效的高层语义信息对剧名进行分类。因此,我们考虑训练多级分类器,为每个题材的内容训练对应的分类模型,能有效提高模型的分类效果。我们首先利用每个视频的一级标签(电影、电视剧、动漫、综艺、体育、军事、纪录片、游戏)等8个一级类目训练一级分类器,然后对每个类目下的视频分别训练各自的剧名分类器模型。即网络会先判断该短视频是属于电影、电视剧类别,然后判断该短视频的剧名。在实验数据集中,一级分类器的准召率为0.82/0.71,但在看点、企鹅号和ugc数据中,模型分类的准召率分别为0.6/0.46,0.57/0.51以及0.47/0.5。而二级的剧名分类像电影、电视剧的准召率为0.86/0.79、0.75/0.54,而像军事、体育的准召率可达0.96/0.94。对实验结果进行分析,我们可以看到,每个像一些内容单一、题材近似的视频类别,如军事、体育等单独训练的分类模型具有较高的准确性,因此通过多级分类器对视频剧名进行分类方案是可行的。但是我们认为简单的将剧名分为8个一级标签,一级分类器的准召率一般,且模型的泛化性不行。我们认为是由于像电影、电视剧这种标签类别过于宽泛,视频题材丰富,模型很难去拟合有效的特征。
因此,我们最终考虑采用视频多标签技术,对每个视频提取语义标签,然后通过聚类和人工筛选,提取了近20个的二级标签(都市生活、娱乐综艺、历史文化、科幻战争等),然后通过这些类别标签训练多级分类器,在全类目的剧名分类模型中,算法的最终准召率为0.58/0.52,分类效果得到有效的提升。

NetVlad模型

VLAD(Vector of locally aggregated descriptors,局部聚合向量)是一种类似于BOF(bag-of-feature)的描述图像的特征方法,可以理解是将局部特征表示成全局特征的编码方法。在这之前,BoF(词袋模型)通常用来描述基于Sift局部特征,在图像检索和分类模型中有着广泛的应用。相比于BoF,VLAD更加能够对于图像的准确表达,得到更具有判别力的特征,并且便于降维(PCA),同时降维对于准确率的影响也较小。
NetVLAD是将传统的VLAD结构嵌入到CNN网络结构中,得到一个新的VLAD层。NetVLAD可以很容易的运用到任何的CNN结构中,并且可以使用反向传播进行优化。局部聚合向量(VLAD)能够抓取图像中局部特征在图像中聚合的统计信息,视觉词袋聚合是记录每个词的数目,而VLAD是记录每个词的残差和。
给定$N$个D维局部图像描述子$x_i$作为输入,$K$个聚类中心作为$c_k$作为VLAD的参数,VLAD的输出是一个$K\times D$的矩阵,但是这个矩阵被转换成向量表示,然后再进行归一化,计算公式如下:

其中,$xi(j)$和$c_k(j)$表示是第$i$个局部描述子和第$k$个聚类中心的第$j$个特征值。$a_k(X_i)$我们可以简单理解为第i个局部特征属于第k个聚类的权重,也就是说,如果它的值等于1就说明它属于这个聚类的簇。如果是传统的VLAD,那么这个值只能是1或0.直观上看,$V$表征着所有局部特征在每一个聚类簇上的残差$(x_i-c_k)$和。
在传统的VLAD中,由于$a_k(X_i)$是一个不连续的值,取值为1或0,并且满足$\sum
{i=1}^Ka_k(X_i)=1$,使其不能进行反向传播。而NetVLAD采用一种近似的方式,来对$a_k(X_i)$来做软分配(soft assignment)如下式:

这个权重的分配可以把它当做一个模糊聚类的分配方式,根据每个局部特征到聚类中心的距离来产生一个概率函数权重。对于一个局部特征描述$X_i$在每个聚类簇下的权重的范围在0~1之间,权重最高的可以理解为该特征离聚类簇中心的聚类最近,权重低说明其离簇中心较远。我们将上式进行平方展开,可得到VLAD特征向量为:

NetVLAD通过这种在不同聚类簇上的软分配(soft-assignment)方式,能够有效的聚合了局部特征空间中不同部分(聚类)的一阶残差的统计量。另外我们可以注意到,NetVLAD中包含着三个参数,$W_k$,$b_k$和$c_k$,原始VLAD中只有一个参数$c_k$,这使得NetVLAD相对于传统的方法更具有灵活性,并且所有的参数在特定的任务下可以通过端到端的方式来学习。
由图可看出,NetVLAD层可以直接接在卷积网络中的最后一层$(H\times W\times D)$上,把最后一层的特征图看作$N$个密集的$D$维局部描述子。soft-assignment过程可分为两个步骤:1)通过K个滤波器$W_k$将$N\times D$矩阵来学到$s_k(X_i)=W_k^TX_i+b_k$;2)卷积输出然后经过一个soft-max函数来生成$\overline{a_k}(X_i)$。

视频多标签

视频多标签是为视频标注出语义标签,是视频理解的关键,但在视频多标签领域仍存在很多问题和难点。我们先看一下视频多标签实验的数据集分布,在总共2000万个短视频中,标签出现频次大于100的标签类别有18916种。在这里我列举了部分标签及其出现的频次,我们可以看到标签的分布及其不均衡,像内地综艺出现的频次高达2194775次,而像“芒果讲”、“行车视线”出现的频次只有100次。还有一些标签,如“创业”、“聊天”、“恶搞”标签定义的过于抽象,模型很难学习这类标签的特征。当然,标签中还存在一些标签语义非常近似,如“内地综艺”和“综艺片段”,“宝宝秀”和“天真萌娃”,这类标签问题和数据标注有很大关系,我们暂且不考虑。为了更直观的看到标签的分布情况,我统计了标签出现的频次发现,在标签出现频次大于5000的类别,只占所有类别总数的10%,但这部分标签出现频次之和占所有标签出现频次之和的84%。在标签频次小于500的标签类别占所有标签类别的56%,但由于每个标签出现的频次较少,该部分标签频次之和只占所有标签频次和的3%。标签的类别严重不均衡,使得模型在训练的过程中更容易去拟合频次出现过的标签的特征,而很难去学习绝大部分的出现频次较少的标签特征。面对这个问题,我们决定重构模型的loss函数,使得标签能够去学习那些少量样本的特征。我们认为,模型无法有效地学习标签之间的特征,主要在于标签的正负样本的之间差距过大,以及每个标签之间的相对的差距过大导致的。因此,我们要调整每个标签的正负样本之间的权重,调整每个标签之间相对的权重,通过均衡每个样本在参数更新过程中的贡献来训练更好的模型。我们设负样本数为$N_2$,正样本数为$P_2$,负样本权重为$W_2^n$,正样本权重为$W_2^p$,标签整体的样本权重为$W_2$,其中$W_2^p=1$,则

对于正负样本间的权重,我们认为负样本数超过正样本数一定阈值,我们就将其倒数乘上相应阈值作为正负样本的权重;对于每个样本间的权重,为了简化计算,我们选择和最小频次的样本进行比较,当然为了防止最小频次的标签的样本数过小,拉低了标签的整体贡献,我们设置最小频次的标签样本数为1000。每个标签的调整的负样本数和正样本数之和就是该标签对在loss计算中的贡献,将其和最小的频次标签的贡献进行对比,就可以得到标签的整体分布权重$W_2$,则损失函数:

我们绘制了每个标签调整后的频次占比,发现大于5000的频次占比为42%,小于500的标签占比为28%,标签分布得到有效的均衡。
基于梯度均衡的损失函数,是2019年AAAI的论文提出的思想,作者认为影响单阶段检测器训练的本质问题,其根本原因是由于不同难度的样本的分布不均衡导致。我们随机统计了一批不同标签的训练样本中的梯度模长,发现大部分样本是十分容易预测的,这些可被准确预测的样本所占的比重也很大,而梯度g接近于1的样本的比例也相对较大,我们认为这是一些离群样本,可能是由于数据标注本身不准确或样本比较特殊难学习造成。对于一个已收敛的模型,强行学习这些离群样本可能会导致模型参数的较大偏差,反而影响模型的准确率。我们利用论文中提出的梯度均衡的概念,即根据样本模长分布的比例对不同样本产生的梯度进行加权,使得各类型的样本对模型参数有更均衡的贡献,而这种加权在损失函数上也可以达到同样的效果。在重构的loss函数中,我们将梯度模长的取值范围划分为若干区域,统计梯度模长g落在每个区域内的样本数量,而密度就是其所在的单位区域内的样本数量除以该单位区域的长度,而梯度密度的倒数就是样本计算loss要乘的权重。不过在多分类任务中,类别标签的onehot编码中,只有属于该类别的位置值为1,其余的均为0。因此在每个batch中计算梯度密度是只需要统计label为1的那个类别的梯度。而在多标签分类中,onehot编码的每个位置都是一个类别的二分类,label为0或1对loss均有影响,因此我们需要分别取统计每个类别的梯度分布,计算每个类别的权重去调整loss函数中每个标签的贡献。
原始的视频多标签的mAP指标为0.2306,添加权重分布的loss函数策略后,mAP指标为0.2742;添家梯度均衡策略的mAP指标为0.2676,最终的mAP指标为0.3284。

mAP的计算

voc2010的AP计算方法是:假设N个样本中有M个正例,那么我们会得到M个recall值(1/M,2/M,…,M/M),对于每个recall值r,我们可以计算出对应(r’>r)的最大precision,然后对这M个precision值取平均即得到最后的AP值。
把recall当场横坐标,precision当场纵坐标,即可得到常用的precision-recall曲线,曲线下的面积也是AP值。
AP衡量的是学出来的模型在每个类别上的好坏,mAP衡量的是学出的模型在所有类别上的好坏,得到AP后,取所有AP的平均值就是mAP。

片段层标题提取

OCR检测器

PSENet是一种基于语义分割的方法检测任意方向的文本,采用渐进式尺度扩展的方法区分邻近的文本块。
网络模型
网络结构类似于FPN的形式,先采用CNN提取四层不同level的feature map,分别是$P_2,P_3,P_4,P_5$,解决文本块尺度变换剧烈的问题,early-stage可用于预测小的文本块,late-stage可用于预测大的文本块,然后通过2倍上采样进行concate来融合特征,得到最后的特征图F。特征图F送入$3\times 3$大小的卷积中输出通道数为256的特征图,将次特征图再送入到$1\times 1$大小卷积层输出n个最终结果,这n个结果用$S_1,S_2,…,S_n$表示,最后通过渐进的尺度扩展算法PSE进一步得到最终的文字检测结果。这里的$S_1,S_2,…,S_n$, $S_i$是图像分割的文字检测框结果,不同之处在于每个结果对应的文字区域大小不一样。如$S_1$对应最小文字分割的结果,$S_n$是最大的文字分割的结果。
渐进式尺度扩展算法
渐进尺度扩展算法(PSE):首先看$S_1$,图中有四个不同的分割区域($C_1,C_2,C_3,C_4$),通过CC(CC是一个寻找连接区域的函数,就是给不同的pixel设置不同的label)将不同分割区域合并得到图b(四个连通域使用不同颜色标记,不同文本行之间的margin很大,很容易区分开),然后合并$S_2$中像素,将属于$S_2$在的kernel但不属于$S_1$中的kernel的像素点分配,将b图所找到的连通域的每个pixel以BFS的方式,逐个上下左右扩展,即相当于把$S_1$中预测的文本行的区域逐渐边框(简单来说,就是讲$S_2$中的每个像素点都分别分配给$S_1$中的某个连通域)。重复上述过程,知道发现最大的核作为预测结果。

OCR识别器

现今基于深度学习的端到端OCR技术有两个主流技术:CRNN OCR和attention OCR。其实这两个方法主要区别在于最后的输出层,即怎么将网络学习到的序列特征信息转化为最终的识别结果。这两大主流技术在其特征学习阶段都采用CNN+RNN的网络结构,CRNN OCR在对齐时采取的方式是CTC算法,,而attention OCR采取的方式则是attention。
网络模型
网络结构包含三部分,从上到下依次为:
(1)卷积层,使用CNN,作用是从输入图像中提取特征序列;
(2)循环层,使用RNN,作用是预测从卷积层获取的特征序列的标签分布;
(3)转录层,使用CTC,作用是从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果。
端到端OCR的难点在哪儿呢?在于怎么处理不定长序列对齐问题!CRNN算法输入100*32归一化高度的词条图像,基于7层CNN(普遍使用VGG16)提取特征图,把特征图按列切分(Map-to-Sequence),每一列的512维特征,输入到两层各256单元的双向LSTM进行分类。在训练过程中,通过CTC损失函数的指导,实现字符位置与类标的近似软对齐。LSTM有256个隐藏节点,经过LSTM后变为长度为T × nclass的向量,再经过softmax处理,列向量每个元素代表对应的字符预测概率,最后再将这个T的预测结果去冗余合并成一个完整识别结果即可。
CRNN算法最大的贡献,是把CNN做图像特征工程的潜力与LSTM做序列化识别的潜力,进行结合。它既提取了鲁棒特征,又通过序列识别避免了传统算法中难度极高的单字符切分与单字符识别,同时序列化识别也嵌入时序依赖(隐含利用语料)。
我们现在要将 RNN 输出的序列翻译成最终的识别结果,RNN进行时序分类时,不可避免地会出现很多冗余信息,比如一个字母被连续识别两次,这就需要一套去冗余机制。

比如我们要识别上面这个文本,其中 RNN 中有 5 个时间步,理想情况下 t0, t1, t2 时刻都应映射为“a”,t3, t4 时刻都应映射为“b”,然后将这些字符序列连接起来得到“aaabb”,我们再将连续重复的字符合并成一个,那么最终结果为“ab”。
这似乎是个比较好的方法,但是存在一个问题,如果是book,hello之类的词,合并连续字符后就会得到 bok 和 helo,这显然不行,所以 CTC 有一个blank机制来解决这个问题。
我们以“-”符号代表blank,RNN 输出序列时,在文本标签中的重复的字符之间插入一个“-”,比如输出序列为“bbooo-ookk”,则最后将被映射为“book”,即有blank字符隔开的话,连续相同字符就不进行合并。即对字符序列先删除连续重复字符,然后从路径中删除所有“-”字符,这个称为解码过程,而编码则是由神经网络来实现。引入blank机制,我们就可以很好地解决重复字符的问题。

标题提取

对于一段新闻视频,由于每个标题出现的位置固定,因此我们1.0版本的算法中采用规则筛选来提取标题。我们首先采用OCR检测器去获取每一帧图片中文本的位置,通过一些位置规则去除一些文本框;然后利用OCR识别器获取剩下的文本框中的文本信息。在1.0版本的算法中,我们会在前5帧中去搜索视频的四个角的文本信息,通过正则匹配查找电视的台标。然后根据台标在配置文件中找到每个电视的配置信息。基于规则的文本筛选主要有,(1)标题出现在视频帧的区域位置,如在横轴方向的0.1-0.9区间,在纵轴方向的0.67-0.9区间;(2)在可能的区间中先搜索文本框最大的文本作为可能的标题,然后通过该文本块搜索临近的文本块,拼接成段落。我们还会通过一些内容匹配,如“新闻联播”、“记者”、“编辑”等文字的正则匹配过滤无效的文本。在配置文件中,我们对每个电视台的阈值进行调整,通过这些规则过滤后剩下的文本内容就是新闻标题。提测反馈结果,基于规则筛选的标题提取对于符合规则的视频可能有很好的识别效果,如“央视新闻”,但在卫视新闻中,对于配置文件中没有的电视台,默认的配置需求可能满足,导致无法识别正确的标题。同时,由于该版本算法没有对文本的内容进行过滤,经常讲记者姓名、插播广告等识别为标题。面对这种情况,我们在2.0版本的算法中提出基于内容过滤的新闻标题提取算法。虽然基于规则的算法在某些电视台能很好的识别出标题,但是这些规则也严格限制了算法性能。我们考虑能否利用少量的规则甚至不利用规则就能很好的识别出新闻标题,因此,我们利用NLP中的bert模型+FC层进行finetune,训练文本二分类模型,并通过sigmoid函数的阈值划分,过滤那些非标题的文本。我们将每个OCR识别文本送入到二分类模型进行过滤,这样的做法的有点在于可以过滤掉很大部分的受访者信息和记者姓名等文本,而且算法没有严格的规则限制,鲁棒性好。当然,文本分类器也可能会将一部分正确的标题文本过滤,甚至对于段落文本,由于逐行的过滤可能导致标题不完整或没有标题。因此我们考虑结合部分宽松条件的规则和文本分类器进行更好的标题提取。先阶段的算法的在自己的100段测试视频中的准召率为0.95和0.91,相对于1.0版本的算法有很大的提升。