一、背景
闲鱼是一个为二手商品交易提供服务的平台,闲鱼用户可以通过视频更全面直观的展示商品,于此同时也出现了一些视频拷贝、抄袭等不好的现象。为了解决这个问题,我们采用了很多方案,其中一种方案是将商品视频转换成向量,尝试通过向量检索计算商品视频相似性,进而判断商品是否重复。
闲鱼视频去重本质是高维向量检索,基于闲鱼当前商品规模及业务发展的预估,闲鱼向量检索系统需支持检索亿级别平均时长为20秒,每秒向量维度是1024维的视频。如此庞大的量级给我们的技术选型和实现带来了一定的挑战。
二、挑战
闲鱼向量检索系统的挑战主要在几个方面:
数据量大 闲鱼商品的视频总帧数在亿级别;
单帧维度高 为保证向量召回的准确率,目前单帧向量维度是1024维;
高精度召回 为保证效果,向量召回的准确率在95%以上;
高性能 为保证用户体验,单帧单次召回耗时100ms左右,QPS在1000以上。
高维向量检索需要解决在数据维度增加之后导致检索性能急剧下降的问题。高维向量数据的特点主要包括以下三个方面:
稀疏性。随着维度增长,数据在空间分布的稀疏性增强;
空空间现象。对于服从正态分布的数据集,当维数大约增加到10时,只有不到1%的数据点分布在中心附近;
维度效应。随着维数的增加,对索引的维护效率急剧下降,并且高维空间中数据点之间的距离接近于相等。
三、实现方案
基于上述的业务背景及挑战,我们从以下几个方面重新梳理了相关实现。
3.1 视频向量化
向量化是指将视频数据按照一定的算法转换为向量进行表示,转换算法决定了向量表达原始视频数据的准确性。向量化使得对视频数据的检索、去重、计算相似性等操作转化为对向量的求距离或求夹角操作。
视频向量化即在视频中抽取关键帧,对每帧视频进行特征提取,包含局部特征提取和全局特征提取。局部特征提取包含“特征点检测”、“特征点描述”、“特征描述降维”。全局特征提取同样包含多个步骤,我们将这些步骤封装为自定义算子,利用Tensorflow Lite模型将自定义算子组合起来,这样就可以动态更新算子,达到算法实时更新的目的。
将视频转化为向量之后,计算视频的相似性就相当于计算向量的相似性。计算向量相似性有几种方式,分别为计算海明距离、夹角余弦、欧式距离和向量内积等。