有极客事故来得猝不及防。有天,女友问我:“你还记得有一年去海边玩的那个夜晚吗?我们一起牵着手,吹着海风……”“记得,还拍了照呢,等我找找。”半个小时过去了,任凭我怎么翻手机相册,也没找到那张照片。“算了,找不到就别找了。”她这句话让流动的空气瞬间凝固。原本甜蜜腻歪的“故事”就这样,演变成一场“事故”。我只有发散思路,一心想着补救。手机上照片太多,自带相册的分类、搜索功能又过于简单,不够智能。
就像《钢铁侠》里呈现的那般,主力利用AI助手“贾维斯”搜索资料并瞬间得到结果。这两年,高高在上的AI“下凡”了,人们拿画画AI批量生成二次元形象,沉迷和ChatGPT对话,甚至还怀疑它是不是真有意识……既然AI如此强大,检索个相册应该不难吧?一番搜索后,我惊奇地发现竟没人做过这类应用。要么在互联网哭嚎诉苦“在线等”,要么……干脆自己写一个app?我的脑洞冷静后的想法AI那么行,有啥能帮上忙?
在苹果的iOS相册里,我们有这么一张照片:示例照片“一条穿红色衣服的狗”:编辑提供如果直接搜“一条穿红色衣服的狗”,一般会显示“无结果”,你只能在“狗”这个大类里一张张滑,直到看到目标;要么只能努力回想拍摄照片的时间、地点,然后以此为线索,缩小范围,再一张张滑……我现在的诉求很简单,搜“一条穿红色衣服的狗”等有具体细节的文字描述,系统能瞬间帮我找到图片。
不妨一想,Midjourney、DALL·E等画画AI仅凭用户的几个提示词,就能生成不可思议的画作,它们是如何接收并“理解”人们指定啥的呢?这要归功于OpenAI2021年年初推出的一个叫CLIP的模型。(对,就是发布ChatGPT和DALL·E2的那家公司。
)它能实现的功能很关键:人们给CLIP任何一张照片,它返回对应的文本描述,反过来,你给它一段具体的文本描述,CLIP也能给你返回一张对应的图片。请注意,这里CLIP返回的文本和照片都是相关性最高的。CLIP将4亿组从互联网上收集的“文本-图片对”抓来训练,从而实现文本和图片的映射(mapping)。但4亿对哪里够!你永远不知道人类会往AI里输入什么奇怪的东西!
所以这里就不得不提CLIP的另一强大之处了,它会模仿人的“推理”能力,对从没见过的输入样本分类。举个例子,就算CLIP并不知道斑马啥样,但它会依靠之前所学,拆解这个没见过的物种,比如“外观像马”+“毛发如老马”+“颜色似熊猫”,然后在海量图片中推测出斑马。
以上能力让CLIP非常会找图,具体到相册找图场景里,CLIP在收到文字描述后,就会把关联度最高的照片推到面前,这非常符合我们找照片的逻辑:先想到具体细节,而非确切的时间、地点。到时候我再搜索“和女朋友牵手的夜晚”,岂不是非常轻松?
说干就干,我在Linux上先做了试验,传了七十多张手机上的照片,通过CLIP进行批处理……果然,在英文搜索后发现得到的结果排序中,文本和图像距离更短的,确实就是相关度更高的,且丝滑程度堪比“热刀切黄油”,我无比自信地认为这在手机上也能有类似效果。如果将CLIP封装成一个app,就能让更多人用上这个更智能,也更符合直觉的工具了,甚至,直接用它接管手机相册。
人人都怕相册隐私被偷窥开发一款app的过程有点枯燥,我更想和大家讲讲产品设计的“取舍”——我最终让它不联网运行,只在手机本地计算。实际上,很多第三方相册提供的服务都是联网的,这样做有很多好处,app得以压缩体积,安装包可以做到十几兆或者几十兆,对用户友好;还能在免费提供基础功能的同时,向有进阶需求的用户提供“内购解锁”选项……但联网会多多少少让用户感觉他们的隐私不安全。
我自己就是个“隐私洁癖”,注册账号时尽量用假名,不暴露自己的信息。当我和其他团队聊天,他们认为像我这类用户在国内只是少数,主动选择“离线”的app也只能吸引和服务一小部分受众。对此我非常不认同,如果能够保护隐私,谁愿意暴露信息给别人?这一点,一定不是小众用户的需求,大部分人不是不在乎隐私,而是没得选择,我希望市面上能有不暴露隐私的选择。
还有一点,如果app做成联网,它会在用户开启联网服务时自动弹窗。我讨厌一切弹窗,坚定地把它做成离线app。要把CLIP做成离线app,并不是直接在手机上调用这个模型的API就可以了。因为存储格式不同,我用Swift语言把它重写了一遍。做一款工具类app,两三百兆的占用空间基本上是极限,所以我用的是精简后的CLIP模型。以后如果条件允许,我会尝试用2.5G的模型,能够同时支持90种语言的输入。
就这样一番捣鼓,大功告成。当用户打开后,app会加载相册内容并构建索引,加载时间取决于手机处理器以及照片数量。根据我的测试,在我的iPhone12mini上,构建索引的速度大概是2000张/分钟,在最新的iPhone上,30000张照片3分多钟就能构建完成。接着,你就可以愉快地搜图了!
例如这样搜索小猫:这样搜索瓶子:或者这样搜索云朵:如果你想提升搜索效果,最好用有细节的描述,可以是颜色,可以是具体的某个物品,也可以是特色鲜明的时间。你也可以凭“和女朋友牵手的夜晚”、“头上有朵花的狗”等等好玩的描述,找到目标照片。至于搜索速度,你感受不到什么延迟。
AI工具之间在连接,人和AI也是也有一些朋友反馈搜“奥特曼”、“史努比”这些形象时,往往得不到想要的结果,因为CLIP未必学习到了这些专有名词,同时我选取的模型也是精简版。你可以换个思路,搜索“身穿蓝色和红色相间皮套的人”,这句话把奥特曼换成了一个具体的描述。你搜“黑色耳朵的狗”,没准就能找到“史努比”。如果模型足够强大,并且能够不断更新,你未来没准就能搜到你相册里的“悲伤蛙”。
我了解到,很多大科技公司内部拿CLIP当服务器上数据库中的图片、文字检索工具,但如果想把它装到手机上,还是不够直接,手机不是电脑,两者之间差别很明显。当然,我认为这次开发能够成功,如今手机软硬件的强大是前提之一。在iOS16上,苹果就对CoreML的性能做了优化,让跑CLIP模型变得更容易了。
加上最近一两年,iPhone的性能也有不小的提升,特别是普通消费者感知不强的AI计算能力,这些都让app只在本地计算成为可能。榨干CLIP能力的下一步,也许就是用文字来搜索视频。其实,视频搜索和图像搜索没有本质区别,视频就是图像的连续帧,可以通过抽帧来进行搜索。不过,假如1个视频抽出10个关键帧,那么,100个视频就有1000个关键帧。
这样下来,搜索100个视频的结果,会比搜100个图片的结果慢10倍……另外,按照关键帧来搜索视频,可能得到的结果并不代表视频的含义,比如“A打了B一巴掌”,也许这个动作只有一两帧那么短,并且抽帧过程中没有被收录,那就相当是无效搜索。所以,如果要做视频方面的搜索,纯截取帧这个方法就是简单粗暴,换作我来做的话,会倾向于做帧之间连续性的语义理解。
我去年12月才开始接触Swift开发,用一个多月时间完成了app的开发、调试、上线,得到了很多人的关注,很有成就感。最近,我又有了一个新想法,就是点开搜索结果的一张照片,然后可以上划用这张照片再做进一步搜索,有点像Google的“以图搜图”。很多人会替我担心,说这种用户“刚需”app迟早会被苹果整合进iOS里,像此前的抠图、OCR识别app,最后苹果都亲自“下场”,做成了系统级功能。
我觉得利用CLIP更智能地搜图,用不了多久苹果也会自己做。虽然从目前来看,苹果官方还是会保持谨慎,因为多语言模型还有“种族歧视”之类的遗留问题,比如当人们搜索“黑猩猩”时可能会出来黑人照片等等。总结来说,我认为这款app的成功离不开三个方面:第一,市面上已经有不少AI工具,在掌握相关原理的同时,我还积极学了Swift语言。
多种技术的混合,是它成型的第一步;第二是iOS16的发布,还有这两年手机在AI方面的性能提升,为类似CLIP这样的模型在手机上运行带来了可能性;第三,大胆尝试才能验证可行性。在这之前,并没有人尝试在手机上跑,并证明它的实用性,我做到了。
这有点像ChatGPT,它验证了大模型是可以疯狂“怼”到人类理想中可能的通用人工智能(AGI)的水平,但是从理论到最终实现,需要有人验证可行性,OpenAI就是那个大胆投入的团队。人骑在自行车上,平稳的向前运动出现了,这在今天的我们看来,并不稀奇。但在骑手和自行车没有发生互动之前,啥都没有发生。
当CLIP接上艺术生成器后,它就能画画了,AI工具之间的互动,人和AI工具之间的互动,可能也正在酝酿出下一场向前运动。故事的最后,当我再和女友聊到往事时,总能第一时间找到那些老照片:开发者供图我希望有更多人在这款app的帮助下,解决类似难题。只需要最朴实的语言,便能找到相册中那些珍贵时刻。