Pine 發自 凹非寺
重度網際網路愛好者們福利來了!
你是否遇到過這種情況:一個梗圖尋遍全網都還沒找到。
現在外網一位小哥搞出了一個網際網路規模的Meme搜尋引擎,庫裡有近兩千萬個梗圖,涵蓋各種小眾文化。
檢索關鍵詞,或者上傳相似圖片,結果就能秒出!
若遇到Meme庫裡沒有的梗圖,還可共享上傳。

網友六年都沒找到的梗圖,在這個小哥的網站上2分鐘就找到了。

然鵝這樣一個秒秒鐘出梗圖的背後的裝置確實醬嬸兒的:
(這不會有點太簡陋了吧)

這時候可能就有盆友好奇,這個粗糙的裝置是如何做到快速檢索梗圖的?
那不妨一起來看看這個「Meme搜尋引擎」是如何搭建的~
靈感來自iPhone圖片識別
要編寫一個Meme搜尋引擎,最重要也是最先面臨的一個問題就是:如何準確識別梗圖中的文字資訊?
用專業一點的話來講就是:如何擁有一個可伸縮的OCR(光學字符識別 )?
OCR的解決方案倒是有現成的,不過現有的要麼就是遇到比較抽象的梗圖識別效果不太好,要麼就是太貴。
舉個簡單的栗子

,比如說用Tesseract OCR來提取圖像中的文字,測試時,只能用非常標準的字型和配色方案識別Meme圖,不然的話就會出現下面這種情況。
這是原圖:

這是識別出來的文字:
30 BLUE man41;? S4-5?’flew/ — V [IL ‘ . 「,2; g」 .’Sj /B」f;T」EArmDand [red] mvslmunlm: sawmills
emmmmmm
不過靈感很快就來了,小哥偶然間在iPhone給別人發一個驗證碼圖片時。
這是驗證碼圖片:

這是複製過來的文字:

並且iPhone的這個功能已經在iOS Vision框架中公開了,可伸縮OCR的問題這不就有解決辦法了嘛~
不過關於Vision框架目前還沒有現成的開源程式碼外掛,只能自己寫了,具體程式碼小哥目前還沒公佈。
BUT,小哥還是總結了一下自己寫程式碼時的方法經驗,而且是針對一個從未用Swift寫過任何正經東西的小白:
遇事不決Google之
Github上逆向工程各種Swift回購協議
請教懂iOS的朋友解決Xcode問題
……
最終東拼西湊,搞出了一個可行的解決方案:iOS Vision OCR伺服器,僅在一部iPhone上就能運行。

識別文字資訊這趴搞定了,接下來就輪到搜尋環節了,相較於上一趴,這部分就簡單多了。
小哥用的是ElasticSearch(已開源)和Postgres。
ElasticSearch擁有多節點能夠有效避免故障的發生,並且能夠在保證速度的情況下容納數百萬個Meme,不過這都是在犧牲了可靠性之後得到的。
而Postgres能夠保證搜尋結果的可靠性,但在超過一百萬張圖片的範圍時,就會變得特別慢。
一個能保證速度,一個能保證質量,那……

Done!
在這其中,小哥用到了PGSync,它是一件中介軟體,可以用於同步從Postgres到Elasticsearch/OpenSearch的資料,具體的搜尋流程如下:

到這裡,整個搜尋引擎的搭建已初見雛形,但還沒結束……
視訊Meme也能支持
因為Meme不僅僅靠梗圖來傳遞,有時候還會有視訊。
這倒也簡單,直接將視訊分割成截圖集,之後就能像普通的Meme圖一樣被識別了。
具體來說,小哥編寫了一個小型微服務,通過ffmpeg(它可以執行音訊和視訊多種格式的錄影、轉換、串流功能),從視訊中擷取10個均勻間隔的圖片。
然後將截圖檔案發送到iPhone OCR服務,最終視訊檔案中會有每個螢幕截圖OCR後的結果集。
不過擁有視訊檢索功能後,毫無疑問OCR服務的負載就重了,一個視訊OCR的工作量幾乎是一般梗圖的10倍。
雖然說OCR應用伺服器的速度很快,但也禁不住這樣薅,於是iOS OCR服務升級了(多加幾臺手機),於是最終的裝置就變開頭圖中的那樣了。
最終具體的流程圖小哥也貼心地給出來了:

小哥的這個Meme搜尋引擎出來之後,網友們也都直呼太棒了。

當然也有網友給出了一些建議,認為當前的搜尋引擎太文字化了,而很多Meme圖本身就沒多少文字,更多時候都是「意會」。
對此,小哥本人也作出了回應,稱之後還會繼續最佳化搜尋引擎:
考慮將圖像轉換為描述的文字……

不過值得一提的是,目前這個搜尋引擎還不太支持中文,中文的梗圖搜尋效果不是很好,但既然小哥已經將構建方法給出來了,就期待一波萬能的網友吧。(手動狗頭)
如果你對這個項目感興趣的話,可以戳下文連結~
傳送門:
https://findthatmeme.com/
參考連結:
https://findthatmeme.com/blog/2023/01/08/image-stacks-and-iphone-racks-building-an-internet-scale-meme-search-engine-Qzrz7V6T.html