使用AnalyticDB轻松实现以图搜图和人脸检索

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: 作者: 末土, 汉朝

1. 背景

以图搜图在生活中有着广泛的应用, 当我们在电视上看到有人穿着一件美丽的裙子或者帅气的球鞋也想拥有时, 我们可以拍张照片然后打开淘宝然后上传照片就可以快速的找到这个商品. 我们看到一张电影截图想知道出处的时候只要将图片粘贴到百度或者谷歌的图搜框中就可以找到相关电影的信息. 以图搜图还可以通过照片在海量的人物相册中快速的找到想要找的目标. 当您在使用百度谷歌等搜索引擎的以图搜图功能的时候的时候是否觉得这种"黑科技"遥不可及呢? 其实通过AnalyticDB提供的深度学习算法和高效向量检索, 我们只需要使用SQL就可以轻松的搭建一套以图搜图系统, 不需要掌握tensorflow, pytorch等深度学习框架, 也不需要学习OpenCV之类的视觉算法库. 本文将介绍如何通过AnalyticDB来快速搭建一套以图搜图系统. 内容包括: 以图搜图原理介绍, AnalyticDB以图搜图演示, 以图搜图代码实现, AnalyticDB的产品介绍, 总结和演示系统的源码分享.

2.以图搜图原理介绍

以图搜图又被称为反向图搜(Reverse image search)是一种基于内容的图像检索(Content-based Image Retrieval) 技术. 以图片作为查询的对象, 以图搜图系统会在大量的图像记录中返回与查询图像内容最相关的记录. 例如, 商品图搜会返回与查询图片中主体物品相同或相似的图片信息. 人脸的图搜会根据图片中人脸特征返回目标人物的记录. 如下图所示是一个以图搜图的流程图. 以图搜图应用的核心模块有两个, 其中特征提取模块主要负责从图像中提取视觉特征, 从而获得一个高维的特征向量, 在这个高维特征空间中越相似的图像距离越近. 向量检索模块负责在海量的图像特征向量集中查找与查询图片特征最接近的前k个记录, 并返回.

2.1 图像特征提取

当前主流的特征提取算法主要使用深度学习模型里如VGG[1], ResNet[2] , MobileNet[3], SqueezeNet[4]等模型作为主干网络, 然后使用不同的方法生成特征. 最简单的方法是直接将分类模型例如VGG模型的分类层前一层输出作为图像的特征. 这种算法在以图搜图场景中往往召回率不是很高. 第二种方法是将模型的中间层的特征经过特殊的的方法池化如RMAC[5], GeM[6] 和降维从而得到. 第三种方法是将模型在目标数据集上使用专门设计的损失函数进行前一训练. 例如商品以图搜图特征提取模型通常需要在商品数据集上进行迁移学习, 才能更加准确的提取不同商品的视觉特征。


AnalyticDB提供的通用以图搜图模型采用了阿里云自研的特征提取模型.AnalyticDB模型使用海量图片训练并且使用了先进的特征后处理方法. 与常用的VGG分类模型特征提取模型相比, AnalyticDB利用了多个尺度的特征,更好的平衡图像的局部特征和高层次特征, 在多样的图像场景中有更好的泛化能力。


AnalyticDB还提供了阿里云自研的人脸特识别模型, 基于大量数据训练, 模型已经在多个城市的安防和新零售场景大规模使用. 在百万人脸ID的相册中千分之一误识率下召回率可以达到99%.

2.2 向量检索

向量检索又称为最近邻( Nearest Neighbor Search, NN)检索, 主要负责在海量特征向量中快速的查找与查询向量距离最近的k个记录, 虽然暴力的计算查询向量与数据库中所有向量的距离然后再进行排序可以找到最相近的记录, 但是这种方法的时间复杂度在大规模数据场景下无法满足需求的. 在实际应用场景中, 通常使用近似最近邻检索(Approximate Nearest Neighbor, ANN)的方法, ANN主要是利用向量数据分布的特性以牺牲一定检索精度为代价,快速的返回可能是查询目标最近邻的记录. 常见的ANN的方法有基于局部敏感哈希(LSH)的方法[7], 基于乘积量化的方法[8]和基于图的方法[9].

3. AnalyticDB 非结构化分析工具OpenAnalytic

OpenAnalytic是AnalyticDB上的非结构化分析工具, OpenAnalytic 提供了丰富的图像, 视频, 文本分析的AI算法算子, 如人脸检测, 人脸识别, 人脸性别,年龄识别, 商品属性识别, 图像目标检测, 声纹识别, 文本特征提取等. 用户可以根据实际需求来任意的使用这些AI算子来自由的编排自己的算法pipeline. 例如, 本问中使用的图像特征提取pipeline和人脸特征提取pipeline如下图所示. 用户只需要通过pipeline_create UDF创建pipeline, 就可以在AnalyticDB集群上分布式的运行这些已创建的pipeline获取非结构化数据分析的结果.

image.png

4. 以图搜图系统演示

我们使用AnalytcDB搭建了两套演示系统, 一套是通用的以图搜图的系统另一套是人脸检索系统. 演示系统的源码已经全部开源, 只需要下载源码(代码地址见章节6)并开通AnalyticDB就可以一键启动演示系统. 为了方便用户体验, AnalyticDB推出了1元购活动, 只需1元就可以开通. 演示的架构如下图所示, 可以看到整提架构非常简单, AnalyticDB负责图像的识别和数据的存储, 查询, 不需要依赖其他的诸如深度学习推理之类的服务.

image.png

以图搜图系统

以图搜图的演示界面如下图所示, 用户可以将本地图片批量的导入AnalyticDB作为搜索的目标相册. 用户可以通过选择本地图片或填写网络图片的URL来进行以图搜图. 同时, 用户可以选择需要返回最相似的图片数目。

image.png

我们提前向AnalyticDB中导入了近50000张图片. 如下图所示, 我们使用一张鸟类的图片进行以图搜图(右侧图片预览), 可以看到返回的全部都是相似的鸟类的照片. 每张照片下方显示了与查询图片的特征的距离, 距离越近表示越相似。

image.png

5. 使用AnalyticDB搭建以图搜图系统

下面我们来介绍如何使用AnalyticDB来实现上一章节介绍的以图搜图和人脸检索系统。

5.1 创建插件

分别创建AnalyticDB的非结构化分析插件OpenAnalytic和向量检索插件fastann

CREAT EXTENSION IF NOT EXISTS open_analytic;
CREAT EXTENSION IF NOT EXISTS fastann;

5.2 建表

我们可以使用如下sql语句建表, 表中保存了图片的名称, 二进制文件和图像的特征向量(用户也可以将图片的文件保存至阿里云的OSS对象存储服务上.这里不做详细介绍)

CREATE TABLE image_search_table (
        image_name TEXT NOT NULL,  # 图像文件名
        image_data BYTEA NOT NULL, # 图像二进制文件
        feature REAL[] NOT NULL, # 图像特征
        PRIMARY KEY (image_name)
);

5.3 建索引

为图像的特征向量列构建ANN索引加快查询速度.

CREATE INDEX image_search_feature_index 
ON image_search_table USING ann (feature) WITH (dim = 1024);

5.4 创建特征提取算法pipeline

通过以下sql可以执行4.3创建的pipeline。 这个UDF的输入是pipeline名称和图像的byte array。 输出是包含图像特征向量的JSON串

SELECT open_analytic.pipeline_run_dist_random('general_feature_extractor', 
                                              <image_byte_array>);

5.5 提取图片特征向量

通过以下sql可以执行4.3创建的pipeline. 这个UDF的输入是pipeline名称和图像的byte array. 输出是包含图像特征向量的JSON串

SELECT open_analytic.pipeline_run_dist_random('general_feature_extractor', 
                                              <image_byte_array>);

5.6 图像数据导入

在获取图像特征以后, 可以将图像数据导入4.1创建的 image_search_table表中。

INSERT INTO image_search_table VALUES (<image_name>, 
                                       <image_byte_array>, <image_feature>);

5.7以图搜图查询

通过以下sql可以检索与查询图片向量最相似的前10条记录。

SELECT image_name, image_data, l2_distance(feature,  <feature_vector>) 
FROM image_search_table 
ORDER BY feature <-> <feature_vector>
LIMIT 10;

5.8 人脸检索系统

以上我们介绍了如何使用Analytic来实现以图搜图, 搭建人脸检索系统的逻辑与以图搜图系统几乎是一样的 只需要将5.1-5.6章节中使用的的pipeline名称从 'general_feature_extractor' 替换为 'face_feature_extractor' 就可以将以图搜图系统变成一个人脸检索系统. 非常的方便.

6. AnalyticDB介绍

分析型数据库(AnalyticDB)是阿里云上的一种高并发低延时的PB级实时数据仓库,可以毫秒级针对万亿级数据进行即时的多维分析透视和业务探索。AnalyticDB for MySQL 全面兼容MySQL协议以及SQL:2003 语法标准, AnalyticDB forPostgreSQL 支持标准 SQL:2003,高度兼容 Oracle 语法生态。

向量检索和非结构化数据分析是AnalyticDB的进阶功能. 目前两款产品都包含向量检索功能, 可以支持人脸, 人体, 车辆等的相似查询和推荐系统。AnalyticDB在真实应用场景中可以支持10亿级别的向量数据的查询, 毫秒级别的响应时间. AnalyticDB已经在多个城市的重大项目中大规模部署。

在一般的包含向量检索的的应用系统中, 通常开发者会使用向量检索引擎(例如Faiss)来存储向量数据, 然后使用关系型数据库存储结构化数据. 在查询时也需要交替查询两个系统, 这种方案会有额外的开发工作并且性能也不是最优. AnalyticDB支持结构化数据和非结构化数据(向量)的检索,仅仅使用SQL接口就可以快速的搭建起以图搜图或者图片+结构化数据混合检索等功能. AnalyticDB的优化器在混合检索场景中会根据数据的分布和查询的条件选择最优的执行计划,在保证召回的同时,得到最优的性能。AnalyticDB向量版采用了多项创新性技术, 这些技术在我们的论文 AnalyticDB-V: A Hybrid Analytical Engine Towards Query Fusion for Structured and Unstructured Data 中有详细介绍介绍. 目前论文已经被数据库三大顶会之一的VLDB接受, 具有技术领先性.

结构化信息+非结构化信息(图片)混合检索在实际应用中被广泛使用的. 例如人脸门禁系统被部署在多个小区时, 我们使用一张表存储了所有小区的人脸特征, 在人脸检索时我们只需要检索当前小区的人脸特征. 在这种情况下, 使用AnalyticDB我们只需要在SQL中增加where 小区名 ='xxx' 就可以轻易实现。AnalyticDB同时提供了先进的图像文本分析算法, 能够提取非结构化数据的特征和标签, 用户仅仅需要使用SQL就可以完成图像文本内容的分析.

更多信息可以参考文章: https://zhuanlan.zhihu.com/p/82284704

7. 结语

本文介绍了如何使用AnalyticDB来搭建以图搜图, 人脸识别系统. 演示系统的源码可以在https://github.com/aliyun/alibabacloud-AnalyticDB-python-demo-AI 下载. AnalyticDB还支持其他多种多样人工智能算法如目标检测, 商品识别, 声纹识别, 基因识别等等. 下一期我们将介绍如何使用AnalyticDB做更加复杂的图像分析. 想了解更多请扫码加入AnalyticDB向量版交流群.

image.png

References

[1] Simonyan, Karen, and Andrew Zisserman. "Very deep convolutional networks for large-scale image recognition." arXiv preprint arXiv:1409.1556 (2014).

[2] He, Kaiming, et al. "Deep residual learning for image recognition." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

[3] Howard, Andrew G., et al. "Mobilenets: Efficient convolutional neural networks for mobile vision applications." arXiv preprint arXiv:1704.04861 (2017).

[4] Iandola, Forrest N., et al. "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size." arXiv preprint arXiv:1602.07360 (2016).

[5] Gordo, Albert, et al. "Deep image retrieval: Learning global representations for image search." European conference on computer vision. Springer, Cham, 2016.

[6] Radenović, Filip, Giorgos Tolias, and Ondřej Chum. "Fine-tuning CNN image retrieval with no human annotation." IEEE transactions on pattern analysis and machine intelligence 41.7 (2018): 1655-1668.

[7] Indyk, Piotr, and Rajeev Motwani. "Approximate nearest neighbors: towards removing the curse of dimensionality." Proceedings of the thirtieth annual ACM symposium on Theory of computing. 1998.

[8] Jegou, Herve, Matthijs Douze, and Cordelia Schmid. "Product quantization for nearest neighbor search." IEEE transactions on pattern analysis and machine intelligence 33.1 (2010): 117-128.

[9] Malkov, Yury A., and Dmitry A. Yashunin. "Efficient and robust approximate nearest neighbor search using hierarchical navigable small world graphs." IEEE transactions on pattern analysis and machine intelligence (2018).

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
SQL 存储 人工智能
AnalyticDB向量检索+AI 实战: 声纹识别
分析型数据库(AnalyticDB)是阿里云上的一种高并发低延时的PB级实时数据仓库,可以毫秒级针对万亿级数据进行即时的多维分析透视和业务探索,向量检索和非结构化数据分析是AnalyticDB的进阶功能。本文通过声纹识别的例子展示如何快速搭建一套端对端的非结构数据搜索服务。
1701 0
AnalyticDB向量检索+AI 实战: 声纹识别
|
SQL 存储 人工智能
AnalyticDB向量检索+AI 实战: 声纹识别
分析型数据库(AnalyticDB)是阿里云上的一种高并发低延时的PB级实时数据仓库,可以毫秒级针对万亿级数据进行即时的多维分析透视和业务探索,向量检索和非结构化数据分析是AnalyticDB的进阶功能。本文通过声纹识别的例子展示如何快速搭建一套端对端的非结构数据搜索服务。
2873 0
AnalyticDB向量检索+AI 实战: 声纹识别
|
2月前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
5月前
|
数据采集 运维 Cloud Native
Flink+Paimon在阿里云大数据云原生运维数仓的实践
构建实时云原生运维数仓以提升大数据集群的运维能力,采用 Flink+Paimon 方案,解决资源审计、拓扑及趋势分析需求。
18529 54
Flink+Paimon在阿里云大数据云原生运维数仓的实践
|
2月前
|
人工智能 分布式计算 数据管理
阿里云位居 IDC MarketScape 中国实时湖仓评估领导者类别
国际数据公司( IDC )首次发布了《IDC MarketScape: 中国实时湖仓市场 2024 年厂商评估》,阿里云在首次报告发布即位居领导者类别。
|
2月前
|
SQL 分布式计算 数据挖掘
加速数据分析:阿里云Hologres在实时数仓中的应用实践
【10月更文挑战第9天】随着大数据技术的发展,企业对于数据处理和分析的需求日益增长。特别是在面对海量数据时,如何快速、准确地进行数据查询和分析成为了关键问题。阿里云Hologres作为一个高性能的实时交互式分析服务,为解决这些问题提供了强大的支持。本文将深入探讨Hologres的特点及其在实时数仓中的应用,并通过具体的代码示例来展示其实际应用。
241 0
|
3月前
|
存储 机器学习/深度学习 监控
阿里云 Hologres OLAP 解决方案评测
随着大数据时代的到来,企业面临着海量数据的挑战,如何高效地进行数据分析和决策变得尤为重要。阿里云推出的 Hologres OLAP(在线分析处理)解决方案,旨在为用户提供快速、高效的数据分析能力。本文将深入探讨 Hologres OLAP 的特点、优势以及应用场景,并针对方案的技术细节、部署指导、代码示例和数据分析需求进行评测。
138 7
|
3月前
|
运维 数据挖掘 OLAP
阿里云Hologres:一站式轻量级OLAP分析平台的全面评测
在数据驱动决策的今天,企业对高效、灵活的数据分析平台的需求日益增长。阿里云的Hologres,作为一站式实时数仓引擎,提供了强大的OLAP(在线分析处理)分析能力。本文将对Hologres进行深入评测,探讨其在多源集成、性能、易用性以及成本效益方面的表现。
167 7
|
4月前
|
分布式计算 安全 OLAP
7倍性能提升|阿里云AnalyticDB Spark向量化能力解析
AnalyticDB Spark如何通过向量化引擎提升性能?
|
4月前
|
人工智能 分布式计算 数据管理
阿里云位居 IDC MarketScape 中国实时湖仓评估领导者类别
国际数据公司(IDC)首度发布《IDC MarketScape: 中国实时湖仓市场 2024 年厂商评估》,阿里云荣登领导者地位。报告评估了13家厂商,涵盖互联网、云服务及大数据领域。阿里云凭借其在实时湖仓领域的创新能力,特别是Apache Paimon及与Flink的集成,实现了高效流批处理和AI增强功能,为企业提供了一体化的湖仓解决方案,支持多种数据管理和AI应用场景,展现出了强大的市场领导力和技术实力。
143 8

相关产品

  • 云原生数据仓库AnalyticDB MySQL版
  • 下一篇
    DataWorks