使⽤AnalyticDB轻松实现以图搜图和⼈脸检索
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获取⾮结构化数据分析的结果.
4. 以图搜图系统演⽰
我们使⽤AnalytcDB搭建了两套演⽰系统, ⼀套是通⽤的以图搜图的系统另⼀套是⼈脸检索系统. 演⽰系统的源码已经全部开源, 只需要下载源码(代码地址见章节6)并开通AnalyticDB就可以⼀键启动演⽰系统. 为了⽅便⽤户体验, AnalyticDB 推出了1元购活动, 只需1元就可以开通. 演⽰的架构如下图所⽰, 可以看到整提架构⾮常简单, AnalyticDB负责图像的识别和数据的存储, 查询, 不需要依赖其他的诸如深度学习推理之类的服务.
4.1 以图搜图系统
以图搜图的演⽰界⾯如下图所⽰, ⽤户可以将本地图⽚批量的导⼊AnalyticDB作为搜索的⽬标相册. ⽤户可以通过选择本地图⽚或填写⽹络图⽚的URL来进⾏以图搜图. 同时, ⽤户可以选择需要返回最相似的图⽚数⽬。
我们提前向AnalyticDB中导⼊了近50000张图⽚. 如下图所⽰, 我们使⽤⼀张鸟类的图⽚进⾏以图搜图(右侧图⽚预览), 可以看到返回的全部都是相似的鸟类的照⽚. 每张照⽚下⽅显⽰了与查询图⽚的特征的距离, 距离越近表⽰越相似。
4.2 ⼈脸检索系统
我们还可以⽤AnalyticDB搭建⼈脸检索系统, 可以通过⼈脸照⽚在相册中查询⽬标⼈物的记录.⼈脸检索演⽰的架构与以图搜图⼏乎相同, 差别是使⽤了的是⼈脸特征提取的算法pipeline. 我们在底库中导⼊了13000多张⼈脸照⽚, 然后使⽤⼈脸照⽚进⾏查询,可以看到返回结果前3张都是与查询⽤户是同⼀个⼈, 向量的距离都⽐较⼩, 因为我们设置了返回前10相近个结果, 但是相册中只有3张查询⽬标的照⽚, 所以返回的后7个结果与查询⽬标不是同⼀个⼈, 我们也可以看到这7个⼈与查询⽬标的向量距离都远远⼤于前3张。
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 建索引
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)是阿⾥云上的⼀种⾼并发低延时的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就可以完成图像⽂本内容的分析.
7. 结语
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).
本⽂为阿⾥云内容,未经允许不得转载。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。