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 建索引
為圖像的特征向量列構建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做更加復雜的圖像分析.