对象检测
陈诗雨,Zilliz 数据工程师,毕业于西安电子科技大学计算机专业。加入Zilliz以来,她一直在探索Milvus在音视频分析、分子式检索等多个领域的解决方案,极大地丰富了社区的应用场景。目前,她正在探索更多有趣的解决方案。业余时间,她喜欢运动和阅读。
上周末看《逍遥法外》时,我觉得在哪里见过扮演保安巴迪的演员,但却想不起他的任何作品。我满脑子都是 "这家伙是谁?"我很确定我见过那张脸,却又极力想记起他的名字。类似的情况还有,有一次我看到视频中的男主角在喝一种我以前很喜欢的饮料,但我最终还是想不起品牌名称。
答案就在我的舌尖上,但我的大脑却感觉完全卡住了。
看电影时,舌尖(TOT)现象让我抓狂。要是有一个视频反向图像搜索引擎就好了,它能让我找到视频并分析视频内容。之前,我用 Milvus 构建了一个反向图像搜索引擎。考虑到视频内容分析与图像分析有某种相似之处,我决定在 Milvus 的基础上建立一个视频内容分析引擎。
对象检测
概述
在进行分析之前,首先要检测视频中的物体。有效、准确地检测视频中的物体是这项任务的主要挑战。这也是自动驾驶、可穿戴设备和物联网等应用的一项重要任务。
从传统的图像处理算法发展到深度神经网络(DNN),当今用于物体检测的主流模型包括 R-CNN、FRCNN、SSD 和 YOLO。本专题介绍的基于 milvus 的深度学习视频分析系统可以智能、快速地检测物体。
实施
要检测和识别视频中的物体,系统首先要从视频中提取帧,并使用物体检测法检测帧图像中的物体;其次,从检测到的物体中提取特征向量;最后,根据特征向量对物体进行分析。
- 帧提取
视频分析通过帧提取转换为图像分析。目前,帧提取技术已经非常成熟。FFmpeg 和 OpenCV 等程序支持以指定间隔提取帧。本文将介绍如何使用 OpenCV 从视频中每秒提取帧。
- 对象检测
物体检测是指在提取的帧中查找物体,并根据物体的位置提取其截图。如下图所示,我们检测到了一辆自行车、一条狗和一辆汽车。本主题将介绍如何使用常用于物体检测的 YOLOv3 来检测物体。
- 特征提取
特征提取是指将机器难以识别的非结构化数据转换为特征向量。例如,可以利用深度学习模型将图像转换为多维特征向量。目前,最流行的图像识别人工智能模型包括 VGG、GNN 和 ResNet。本主题将介绍如何使用 ResNet-50 从检测到的物体中提取特征。
- 向量分析
将提取的特征向量与库向量进行比较,并返回最相似向量的对应信息。对于大规模特征向量数据集来说,计算是一个巨大的挑战。本专题介绍如何使用 Milvus 分析特征向量。
关键技术
OpenCV
开源计算机视觉库(OpenCV)是一个跨平台的计算机视觉库,它为图像处理和计算机视觉提供了许多通用算法。OpenCV 常用于计算机视觉领域。
下面的示例展示了如何使用 OpenCV 和 Python 以指定的时间间隔捕获视频帧并将其保存为图像。
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
You Only Look Once, Version 3(YOLOv3 [5])是近年来提出的一种单阶段物体检测算法。与精度相同的传统物体检测算法相比,YOLOv3 的速度快一倍。本主题中提到的 YOLOv3 是 PaddlePaddle [6] 的增强版。它采用多种优化方法,推理速度更快。
ResNet-50
ResNet [7] 因其简单实用而成为 2015 年 ILSVRC 图像分类的冠军。作为许多图像分析方法的基础,ResNet 被证明是专门用于图像检测、分割和识别的流行模型。
Milvus
Milvus是一个云原生的开源向量数据库,用于管理机器学习模型和神经网络生成的 Embeddings 向量。它广泛应用于计算机视觉、自然语言处理、计算化学、个性化推荐系统等场景。
以下程序介绍了 Milvus 的工作原理。
- 通过使用深度学习模型将非结构化数据转换为特征向量,并导入 Milvus。
- Milvus 对特征向量进行存储和索引。
- Milvus 返回与用户查询向量最相似的向量。
部署
现在,您对基于 Milvus 的视频分析系统有了一定的了解。如下图所示,系统主要由两部分组成。
红色箭头表示数据导入过程。使用 ResNet-50 从图像数据集中提取特征向量,并将特征向量导入 Milvus。
黑色箭头表示视频分析流程。首先,从视频中提取帧并将帧保存为图像。其次,使用 YOLOv3 检测和提取图像中的物体。然后,使用 ResNet-50 从图像中提取特征向量。最后,Milvus 通过相应的特征向量搜索并返回对象信息。
更多信息,请参阅Milvus Bootcamp:视频物体检测系统。
数据导入
数据导入过程非常简单。将数据转换成 2,048 维向量,然后将向量导入 Milvus。
vector = image_encoder.execute(filename)
entities = [vector]
collection.insert(data=entities)
视频分析
如上所述,视频分析过程包括捕捉视频帧、检测每帧中的物体、从物体中提取向量、用欧氏距离(L2)度量计算向量相似度,以及使用 Milvus 搜索结果。
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)
结论
目前,80% 以上的数据都是非结构化数据。随着人工智能的快速发展,越来越多的深度学习模型被开发出来用于分析非结构化数据。物体检测和图像处理等技术在学术界和工业界都取得了巨大突破。在这些技术的推动下,越来越多的人工智能平台满足了实际需求。
本专题所讨论的视频分析系统就是利用可以快速分析视频内容的 Milvus 构建的。
作为一个开源向量数据库,Milvus 支持使用各种深度学习模型提取特征向量。Milvus 与 Faiss、NMSLIB 和 Annoy 等库集成,提供了一套直观的 API,支持根据场景切换索引类型。此外,Milvus 还支持标量过滤,提高了召回率和搜索灵活性。Milvus 已应用于图像处理、计算机视觉、自然语言处理、语音识别、推荐系统和新药研发等多个领域。
参考文献
[1] A. D. Bagdanov、L. Ballan、M. Bertini、A. Del Bimbo。"体育视频数据库中的商标匹配与检索"。多媒体信息检索国际研讨会论文集》,ACM,2007 年。https://www.researchgate.net/publication/210113141_Trademark_matching_and_retrieval_in_sports_video_databases。
[2] J. Kleban, X. Xie, W.-Y.Ma."自然场景中标识检测的空间金字塔挖掘"。IEEE 国际会议,2008 年。https://ieeexplore.ieee.org/document/4607625
[3] R. Boia、C. Florea、L. Florea、R. Dogaru。"使用同构类图进行自然图像中的徽标定位和识别"。机器视觉与应用 27 (2), 2016. https://link.springer.com/article/10.1007/s00138-015-0741-7
[4] R. Boia、C. Florea、L. Florea."用于徽标检测的类原型中的椭圆漂移聚集"。BMVC, 2015. http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=5C87F52DE38AB0C90F8340DFEBB841F7?doi=10.1.1.707.9371&rep=rep1&type=pdf
[5] https://arxiv.org/abs/1804.02767
[6] https://paddlepaddle.org.cn/modelbasedetail/yolov3
[7] https://arxiv.org/abs/1512.03385
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word