陈室余, Zilliz 数据工程师,毕业于西安电子科技大学计算机学系。自加入 Zilliz 以来,致力于在音视频分析、化学分子式检索等各领域为 Milvus 开源项目探索解决方案,目前也在持续探索更多有趣的方案。为了好好生活、延年益寿,平时非常热爱运动。
周末在看《失控玩家》时,觉得巴迪保安眼熟,演过什么却说不上来,脑子里想的全是“这?人?谁?啊?” 隐隐约约有印象,越着急越想不出来 💢
还有一次,视频中男主喝的饮料是自己之前很喜欢的,想下单却忘了品牌。
呼之欲出,总也不出。“啪”,我的脑子像是断网了。
这种话到嘴边说不出的“舌尖现象”(Tip of the tongue),在看影片的时候真是太令人抓狂了,我特别希望有一个类似于“以图搜图”系统,让我搜索视频、分析视频。
以前,我用 Milvus 搭建过一个以图搜图系统。视频分析和图片分析多少有些类似,于是,我搭建了一个基于 Milvus 的视频分析系统 🚀
物体检测
概述
首先,要想分析视频中的物体,得先进行目标检测。如何高效、准确地识别视频中的物体是这项任务的主要挑战。
从早期的传统图像算法到当前的深度神经网络,主流的目标检测(Object Detection)方法包括:RCNN、FRCNN、SSD、YOLO 等。本文介绍的基于 Milvus 的视频分析系统,可以通过结合深度学习模型,智能并快速地识别目标。
实现方案
为了实现视频中的物体检测和识别,首先需要对视频截帧,利用目标检测技术识别图片上的物体,再对检测到的物体图片做特征提取,通过特征向量分析其是否包含该目标,最终得出结论。
- 视频截帧
视频分析问题通常会利用截帧技术获取单帧画面,转换为图像分析问题。目前截帧技术十分成熟,FFmpeg、OpenCV 等都可以按照一定的时间来截取视频帧。本文将利用 OpenCV 对视频按每秒进行截帧。
- 目标检测
目标检测的任务是希望在截取到的图片帧中找到物体,同时根据该物体的位置提取出相应的截图。如下图所示,可以检测出自行车、狗和汽车三个物体,并提取出它们的图像。本文将利用 YOLOv3 网络做目标检测,这也是目前比较流行的网络检测方式。
- 图像特征提取
特征提取是指将机器难以识别的非结构化数据转化为容易识别的特征向量。比如,图像可以通过深度学习神经网络模型转换为多维特征向量,目前比较流行的图像识别 AI 模型有 VGG、CNN、ResNet 等。本文将利用 ResNet50 模型对视频中的目标物体图片进行特征提取。
- 特征向量分析
将提取到的图像特征向量与图像库进行相似度比较,找出与检测到的物体图像最相似的结果,最终得出物体检测的相关信息。
当特征向量数据规模较大时,向量计算将会是一个巨大的挑战。本文将采用 Milvus 向量数据库来分析特征向量数据。
关键技术
OpenCV
OpenCV 是一个跨平台的计算机视觉库, 它实现了图像处理和计算机视觉方面的很多通用算法,在计算机视觉领域使用十分广泛。以下将使用 Python 编程,用 OpenCV 按一定间隔截取视频帧,并保存为图片:
import cv2
cap = cv2.VideoCapture(file_path)
framerate = cap.get(cv2.CAP_PROP_FPS)
allframes = int(cv2.VideoCapture.get(cap, int(cv2.CAP_PROP_FRAME_COUNT)))
success, image = cap.read()
cv2.imwrite(file_name, image)
YOLOv3
YOLOv3 是近年来提出的单阶段检测器,该检测器与达到同样精度的传统目标检测方法相比,推断速度能达到近两倍。本文使用 PaddlePaddle 实现的 YOLOv3 增强模型,在该版本中使用了多种优化方法,推断速度更快。
ResNet50
ResNet 模型曾在 ImageNet 比赛中夺得图像分类任务第一名。由于它简单与实用并存,之后很多图像分析方法都会在 ResNet50 或者 ResNet101 的基础上实现。图像检测、分割、识别等领域都纷纷使用 ResNet,可以看出 ResNet 确实十分受欢迎。
Milvus
Milvus 是一款开源的向量数据库,支持使用多种 AI 模型将非结构化数据向量化,并为向量数据提供搜索服务,可广泛应用于计算机视觉、自然语言处理、语音识别、推荐系统以及新药发现等。具体实现方式是:
- 通过深度学习模型将非结构化数据转化为特征向量,并导入 Milvus 库。
- 对特征向量进行存储并建立索引。
- 接收到用户的向量搜索请求后,返回与输入向量相似的结果。
系统实现
通过前面的介绍,相信你对基于 Milvus 的视频分析系统已经有所了解。如下图所示,该系统主要分为两部分:
- 红色箭头表示的数据导入过程:利用 ResNet50 模型提取图像数据集的特征向量,然后将特征向量导入 Milvus 向量数据库。
- 黑色箭头表示的视频分析过程:首先将视频截帧,然后把截取到的图片利用 YOLOv3 进行目标检测提取出物体图像,然后再通过 ResNet50 模型提取图像的特征向量,最后在 Milvus 中检索物体图像的特征向量,找出视频中出现的物体信息。
关于系统的具体实现过程和源码,请参考我们的 bootcamp 项目。
数据导入
数据导入过程十分简单,首先将待导入的数据转化为 2048 维向量数据,然后把向量数据导入 Milvus。
vector = image_encoder.execute(filename)
entities = [vector]
collection.insert(data=entities)
视频分析
正如前面所介绍的,视频分析需要先进行视频截帧,然后对每帧图片做目标检测,将检测到的物体图像通过提取,得到特征向量数据,最后在 Milvus 中使用欧氏距离(“L2”)进行相似度计算,返回检测到的结果。
images = extract_frame(filename, 1, prefix)
detector = Detector()
run(detector, DATA_PATH)
vectors = get_object_vector(image_encoder, DATA_PATH)
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(vectors, param=search_params, limit=10)
总结
越来越多的 AI 平台集成了目标检测技术和图像处理技术,实现了很多可以落地的应用场景。
比如,以图搜图,声纹识别,还有……本文实现的基于 Milvus 向量数据库的视频识别系统✨
看视频失忆抓狂?有 Milvus 在手,你就可以快速识别视频信息,妈妈再也不用担心我看剧暴走啦!
参考文献
Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。
Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。Milvus 目前是 LF AI & Data 基金会的毕业项目,能够管理大量非结构化数据集。我们的技术在新药发现、计算机视觉、推荐引擎、聊天机器人等方面具有广泛的应用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。