相似视频搜索—Opera 的 Milvus 实践

2021-04-12 16:55:32 浏览数 (2)

✏️ 作者介绍:

李兆星,Opera News 高级工程师

场景介绍

Opera 成立于 1995 年,总部位于挪威奥斯陆,是全球领先的浏览器提供商及数字内容发现和推荐平台领域的先驱。20 多年来,数百万名用户通过 Opera 网页浏览器访问网站、阅读、进行创作以及使用其他网络娱乐功能。

由于大量视频内容高度重复,为提升视频内容推荐的体验,多媒体处理平台需要在视频审核时过滤内容过于相似的视频。

通常在搜索相似视频时,多媒体处理平台会抽取多个关键帧的特征向量并融合成单个向量进行搜索。但是,Opera ⽬前暂时不具备融合多个特征向量的能⼒,因此采用另一种方法——将视频视作图⽚的集合。先计算图⽚相似度,再计算图⽚集间的相似度,最终得出视频间的相似度。对于图片间的相似度计算,可以将图片通过深度学习模型转化为特征向量,然后利用 Milvus 向量搜索引擎来计算图片特征向量的相似度。

项目要点

1. 将视频转化为图片集

FFprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。[1]我们在本项目中调⽤ FFprobe 命令获取视频时⻓信息。

代码语言:javascript复制
ffprobe -show_format -print_format json -v quiet input.mp4

FFmpeg 是一个开源音视频软件,可以运行音频和视频多种格式的录制、转换、流功能[2]。我们在本项目中使用 FFmpeg ⼯具,按照固定间隔从视频中抽取 10 帧。假设视频时⻓为 100 秒,每隔 10 秒抽取⼀帧,则⽐例为 0.1 。

代码语言:javascript复制
ffmpeg -i input.mp4 -r 0.1 ./images/frames_d.jpg

2. 将图片转化为特征向量

先对图⽚进⾏预处理,包括裁剪、缩放、调节灰度等。利⽤预先训练好的深度学习模型 VGG 或 ResNet 模型,将图片转化为 1000 维的特征向量。

代码语言:javascript复制
# Use the nativeImageLoader to convert to numerical matrix
File f=new File(absolutePath, "drawn_image.jpg");
NativeImageLoader loader = new NativeImageLoader(height, width, channels);
# put image into 
INDArrayINDArray image = loader.asMatrix(f);
# values need to be scaled
DataNormalization scalar = new ImagePreProcessingScaler(0, 1);
# then call that scalar on the image dataset
scalar.transform(image);
# pass through neural net and store it in output array
output = model.output(image);

3. 计算图片集间的相似度

定义如下规则以计算图⽚集间的相似度:

  • 图⽚与图⽚的相似度——图片特征向量的内积 ;
  • 图⽚与图⽚集的相似度——图⽚与图⽚相似度的最⼤值 ;
  • 图⽚集与图⽚集的相似度——图⽚与图⽚集的相似度的平均值。

4. 利用 Milvus 向量搜索引擎搜索 TopK 个相似视频结果

Milvus 是一款开源的分布式向量相似度搜索引擎。通过集成业界成熟的向量相似度搜索技术和大幅度优化高性能计算框架,Milvus 支持针对 TB 级向量的增删改操作和近实时查询,具有高度灵活、稳定可靠以及高速查询等特点。Milvus 集成了 Faiss、NMSLIB、Annoy 等广泛应用的向量索引库,提供了一整套简单直观的 API,用户可以针对不同场景选择不同的索引类型。

Milvus 适用于多种场景,与深度学习相融合的架构如下图所示:

采用 Milvus 的数据处理流程包括以下几个步骤:

  1. 与深度学习模型相结合,将非结构化数据转化为特征向量。
  2. 将特征向量存储到 Milvus 并建立索引。  
  3. 返回向量相似性搜索结果。  

在本项目中,利用 Milvus 搜索 TopK 的相似视频需要进行如下步骤:

  1. 将图片特征向量及对应的视频 ID 存储在 Milvus 数据库中。
  2. 将视频转换为 10 个图片向量后,向 Milvus 发起批量相似搜索,得到相似图片以及图片相似度。
  3. 利用上述提到的图片集间相似度的计算方式,计算视频相似度,过滤返回 TopK 的结果。

系统流程

根据上述四个项目要点,我们设计了以下系统流程:

  • 将视频上传至服务器,保存视频元信息,同时将视频持久化存储,随后在消息队列中发布事件。
  • 视频处理任务被触发时,对视频进行预处理、抽帧,将图片转化为特征向量后导入 Milvus 库中。
  • 上传待查重视频或视频 ID,将视频转化为多个特征向量。在 Milvus 库中搜索相似向量,通过上文中的图片集相似度计算方法得出视频相似度,返回 TopK 个结果。

后续优化

基于相似视频搜索系统目前的设计,我们考虑未来在以下几个方面进行优化:

  • 优化抽帧策略,抽取更具代表性的镜头;
  • 减小视频时长等因素对视频相似度的影响;
  • 进行相似度加权平均,为持续时间较长的镜头增加权重。

结语

通过结合深度学习模型和 Milvus 向量相似性搜索引擎,我们搭建了一套视频相似搜索的系统。Milvus 的性能不断持续优化,能够高效检索相似向量。此外,Milvus 的用户交流群十分活跃,用户互相交流工程问题和项目思路,提问也会得到及时反馈。在搭建这个相似视频搜索系统时,我受到了 Milvus 以图搜图教程的启发。官网上还有许多其他成功案例可以参考。

在当前这个文本、图像、音频等非结构化数据爆炸式增长的时代,通过 embedding 技术将非结构化数据映射成多维向量后再进行检索已成为趋势。Milvus 作为分布式向量检索引擎,具有高性能、易部署的特性。Milvus 极大地节省了项目开发成本,显著提高了系统检索性能,并很好地满足了本项目的技术和业务需求。

参考文献

[1] FFprobe使用指南:https://developer.aliyun.com/article/311898

[2] FFmpeg:https://zh.wikipedia.org/wiki/FFmpeg

[3] Milvus 教程:https://www.zilliz.com/solutions

[4] Milvus 用户案例:https://www.zilliz.com/user-stories

0 人点赞