✏️ 作者介绍:
李兆星,Opera News 高级工程师
Opera 成立于 1995 年,总部位于挪威奥斯陆,是全球领先的浏览器提供商及数字内容发现和推荐平台领域的先驱。20 多年来,数百万名用户通过 Opera 网页浏览器访问网站、阅读、进行创作以及使用其他网络娱乐功能。
由于大量视频内容高度重复,为提升视频内容推荐的体验,多媒体处理平台需要在视频审核时过滤内容过于相似的视频。
通常在搜索相似视频时,多媒体处理平台会抽取多个关键帧的特征向量并融合成单个向量进行搜索。但是,Opera ⽬前暂时不具备融合多个特征向量的能⼒,因此采用另一种方法——将视频视作图⽚的集合。先计算图⽚相似度,再计算图⽚集间的相似度,最终得出视频间的相似度。对于图片间的相似度计算,可以将图片通过深度学习模型转化为特征向量,然后利用 Milvus 向量搜索引擎来计算图片特征向量的相似度。
1. 将视频转化为图片集
FFprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。[1]我们在本项目中调⽤ FFprobe 命令获取视频时⻓信息。
ffprobe -show_format -print_format json -v quiet input.mp4
FFmpeg 是一个开源音视频软件,可以运行音频和视频多种格式的录制、转换、流功能[2]。我们在本项目中使用 FFmpeg ⼯具,按照固定间隔从视频中抽取 10 帧。假设视频时⻓为 100 秒,每隔 10 秒抽取⼀帧,则⽐例为 0.1 。
ffmpeg -i input.mp4 -r 0.1 ./images/frames_%02d.jpg
2. 将图片转化为特征向量
先对图⽚进⾏预处理,包括裁剪、缩放、调节灰度等。利⽤预先训练好的深度学习模型 VGG 或 ResNet 模型,将图片转化为 1000 维的特征向量。
# 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 的数据处理流程包括以下几个步骤:
在本项目中,利用 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