使用深度學(xué)習(xí)為您的圖片構(gòu)建功能強(qiáng)大的圖像搜索引擎
幾天前,我有一種想要回顧一張我記憶猶新的舊照片的愿望,但我不知道在哪里可以找到…自從這張照片被拍攝后,我換了兩次手機(jī),換了一次筆記本電腦,我很確定我當(dāng)時(shí)已經(jīng)通過Messenger把它發(fā)給了某人,但是是誰呢?如果能用一個(gè)簡(jiǎn)單的描述性查詢搜索我所有的圖片并找到它,那該有多方便啊!…
計(jì)算機(jī)視覺的最新進(jìn)展提高了圖像嵌入(密集矢量表示)的相關(guān)性,使用最近的剪輯模型,為我的本地圖片實(shí)現(xiàn)類似Google的圖像搜索現(xiàn)在很容易實(shí)現(xiàn)。
無需深入研究細(xì)節(jié)(更多信息,請(qǐng)參閱博客帖子和論文:https://openai.com/blog/clip/),Clip是一個(gè)神經(jīng)網(wǎng)絡(luò),旨在通過自然語言監(jiān)督來學(xué)習(xí)圖像特征。基本上,它使用互聯(lián)網(wǎng)上帶有相關(guān)字幕的公共圖像,將文本嵌入類似Bert的語言模型,并將圖像嵌入視覺轉(zhuǎn)換器。請(qǐng)注意,所使用的技術(shù)可以應(yīng)用于其他NLP和CV模型體系結(jié)構(gòu)。利用多個(gè)圖像/文本嵌入對(duì),可以通過批量負(fù)對(duì)比訓(xùn)練來微調(diào)視覺和文本嵌入模型,類似于在信息檢索的NLP領(lǐng)域中可以做的事情。基本上,目標(biāo)是使圖像嵌入與其關(guān)聯(lián)的文本嵌入相對(duì)應(yīng)(點(diǎn)積),并且與其他圖像的所有標(biāo)題(1)不同。
剪輯通常用于“零鏡頭”分類;給定圖像和字幕列表,它會(huì)推斷圖像的最佳字幕是什么。在上面的例子(2)中,與“飛機(jī)的照片”、“鳥的照片”、“汽車的照片”相比,“狗的照片”是最好的圖片說明。…
我對(duì)圖像搜索引擎的想法(這里并不新鮮)是顛覆這一點(diǎn),而不是基于圖像對(duì)字幕進(jìn)行分類,而是基于文本查詢對(duì)圖像進(jìn)行分類。該過程將如下所示:
- 找到給定目錄中的所有圖像
- 使用預(yù)先訓(xùn)練的剪輯視覺轉(zhuǎn)換器計(jì)算每個(gè)圖像的嵌入,并將它們與圖像路徑一起存儲(chǔ)以供將來參考。https://openai.com/blog/clip/
- 在運(yùn)行時(shí),使用剪輯文本轉(zhuǎn)換器將用戶查詢轉(zhuǎn)換為文本嵌入。
- 計(jì)算文本嵌入與所有存儲(chǔ)的圖像嵌入的點(diǎn)積,根據(jù)其獲得的分?jǐn)?shù)對(duì)所有圖像進(jìn)行排序,并返回排名最高的N個(gè)圖像的路徑。
這個(gè)過程以及一些額外的特性是在我的Github存儲(chǔ)庫中實(shí)現(xiàn)的:https://github.com/ManuelFay/ImageSearcher. https://github.com/ManuelFay/ImageSearcher
在索引階段,代碼使用oslibrary查找給定目錄和子目錄中的所有圖片,使用轉(zhuǎn)換器和Pickle庫嵌入和存儲(chǔ)矢量化表示。在運(yùn)行時(shí),將加載酸洗過的嵌入,并根據(jù)嵌入的查詢進(jìn)行匹配,然后返回排名第n位的圖像。提供了Flask/Gunicorn API,以便能夠高效地使用具有外部接口的搜索引擎。還提供了一個(gè)簡(jiǎn)單的Google Image Search,類似于Vue.js構(gòu)建的Web界面。
示例
為了獲取大量的圖片,我從Facebook下載了我的Messenger檔案,獲得了過去幾年里我發(fā)送和接收的大約1萬張圖片。
搜索引擎允許進(jìn)行非常描述性的查詢。排名靠前的圖像排在第一位。請(qǐng)注意,這些圖片都是從我的大約10,000張本地圖片中提供的,因此選項(xiàng)池是有限的。
元查詢也是可能的。在這里,我們請(qǐng)求無人機(jī)拍攝的照片:
這是一個(gè)很快的下午項(xiàng)目,但剪輯模型的精確度給我留下了深刻的印象。要自己測(cè)試它,請(qǐng)使用https://github.com/ManuelFay/ImageSearcher.中的代碼歡迎對(duì)改進(jìn)和額外功能的貢獻(xiàn)! https://github.com/ManuelFay/ImageSearcher