Pine 发自 凹非寺量子位 | 公众号 QbitAI
重度互联网爱好者们福利来了!
你是否遇到过这种情况:一个梗图寻遍全网都还没找到。
现在外网一位小哥搞出了一个互联网规模的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