入选 App Store 的本周编辑推荐
在上周,「识图 App」入选了 App Store 的本周编辑推荐,真好啊!感谢 App Store 官方给这款小工具的认可。
新版更新:把温馨回忆放在桌面
在上一篇介绍「识图 App」的文章里,尝试解决我们日常在使用 iOS 系统相簿和照片里面的最高频的场景,如何快速地找到照片,通过文字、时间、地点的不同组合可以精确地定位到我们想找的那张照片,或分享给朋友、或收藏起来:
但是,除了用文字去搜索之外,我们还怎么能发掘我们照片里的宝藏呢?相信我们大家都拍了许多的照片,有那些美美的自拍照,有和恋人当时牵手的摸样,有和家人在一起的温馨瞬间,有曾到过另一座城市的随手抓拍,有猫猫狗狗的呆呆萌萌,甚至还有那些回不去的时光。如果,我们能把相框放在手机桌面,每次点亮屏幕,都能看到那些差点被遗忘的老照片,或许能给我们带来一点点温暖,让回忆的阳光洒到今天。
如果只是桌面相框,iOS 系统自带的 ”回忆 Widget“ 就能满足需求,但是只是照片,我们常常会忘了是在哪里拍的,在什么时候拍的,甚至忘记了照片里的内容。而文字,是照片最美的标签,如果在展示照片的同时,也能自动配上文字,会不会更有温度呢,更感人呢。所以「识图 」尝试给图片配上最优美的文字,并支持在桌面添加小组件,就像这样:
如果您的手机升级到了 iOS 17,也可以添加「识图 」锁屏小组件。大箭同学有个闲置的 iPhone 手机,他用「识图 Widget 」把它改造成了一个电子相框:
配文:照片的最美标签
我们想给照片配上最优美的文字,希望「识图 」能看懂照片的内容,能用文字把照片的内容进行总结、提炼和修饰,希望那些文字能打动人心,能给你的照片打上最美的标签。
给宠物配文
这只可爱的狗狗是宋老师家的,名字叫 Hard,别看他照片里很是乖巧,拆家的时候能把宋老师气的双手发抖。这两张照片是上周六宋老师带他踏秋时候拍的,第一张照片配文 “笑逐颜开” 用来形容狗狗的表情确实令人惊艳,因为通常这个词用来形容人的开心。而第二张照片的配文更是绝妙,一个 “傲” 字把狗狗的状态准确刻画了出来,而 “秋叶黄” 也抓到了季节。
给事件配文
今年五月,妹妹结婚,照片分别拍摄于婚礼现场和新娘子的婚房。「识图 」从上千张的照片中推荐了这两张,我们看第一张的配文 “花香萦绕的婚礼现场”,AI 大模型确实正确地识别出来了场所是 “婚礼现场”,而且能营造出欢喜氛围用 "花香萦绕"。再看第二个配文"闺阁佳人共庆瑞祥",依然准确描述了是女孩子的房间是 “闺阁”,新娘子和伴娘们是 “佳人”,而“瑞祥”也恰当好处的表达了婚礼的祝福。
风景与人物
对于风景和人物照片,「识图 」同样体现出来了强大的图片内容识别和文字生成能力。它即能够识别出来第一张照片拍摄的地点是海边由 "赏海景",也能分辨出来花朵的颜色由 "橙黄橘绿"。如果你喜欢识图的配文,可以点击 "分享" 按钮,方便分享给朋友或者自己收藏。如果想找这张照片的原图,可点击 "个人收藏" 按钮,之后便可到手机的 “个人收藏” 相簿方便地找到原图。
我们如何实现配文功能
隐私问题
要实现根据照片的内容来生成优美的文字,目前的技术在手机端纯离线去做,还几乎不可能完成。因为要让图生文的 AI 大模型跑在手机上无论对手机硬件还是模型本身都是不小的挑战。纯离线方案行不通的话,我们就想尝试半离线的方案,一部分在手机上做,一部分在云端做。
值得明确说明的是,「识图 」十分尊重用户的隐私,在任何情况下都不会把用户的照片上传到云端,这也是我们实现照片配文(图生文)要遵循的基本原则:
不上传照片到云端
把大象放进冰箱
要把大象放进冰箱,拢共分为三步:
1、通过「识图 App」本地的推荐算法找到最值得回味的照片回忆;
2、在本地通过大模型计算照片的图片特征(image embeddings),并上传到云端;
3、云端的大模型根据图片的特征,生成照片的配文(文字);
提取图片特征
「识图 App」在手机端使用 image encoder 离线计算图片特征。从 OpenAI 开源的 CLIP 项目中,我们把视觉侧的基于 Transformer 架构的 ViT-B/16 的 imager encoder 单独拆分了出来,嵌入到了「识图 App」的安装包里面,size 大概是 150M 左右。对于想进行图生文操作的照片,在手机侧本地「识图」经过 ViT-B/16 image encoder 的计算,计算这张图片的特征向量(image features)。
图片的特征向量(image features)是一个 (1, 196, 768) 三维数组,如示例:
# Image Features(1*196*768)
[
[
[-0.7495, 0.2676, ..., -0.5010],
[-0.3372, 0.2209, ..., -0.4490],
[-0.7695, 0.1975, ..., -0.8037],
...,
[-0.2617, -0.1320, ..., -0.5288],
[-0.6738, 0.0533, ..., -0.7158],
[-0.6689, 0.0749, ..., -1.1162]
]
]
识图只会把计算过的图片的特征向量上传到云端的服务器,借由大模型的能力来生成和图片内容想符合的文字。图片特征向量的计算过程如下(x1, x2 表示图片的尺寸,y 表示图片的颜色模式):
# 图片预处理
img = Image.open(f"{image_path}/{image_name}").resize((x1, x2)).convert(y)
# 调用 image encoder 生成特征向量
img_features = image_ml.predict({'image': img})
通过上传图片的特征向量,而不是上传原图,充分保护了用户的隐私。因为通过图片的特征向量是无法还原出原图的。
生成文字
当「识图 App」把待生成文字的照片的图片特征向量上传到云端之后,面临的下一个任务是如何把矩阵表示的图片特征转换成文字。最终影响我们的技术方案的选择包含以下原则:
- 此架构的输入不需要图片原图,可以通过图片的特征向量即可生成文字;
- 此架构的输出文字能够尽量全面、尽量从多维度客观描述图片的内容;
- 在图生文效果可接受的范围内,对 CPU/GPU 计算资源尽可能少;
在一众的图生文技术架构中, 比如 Flamingo、BLIP、 BLIP-2、MiniGPT-4和LENS等等。经过数次技术调研、实验和验证,我们最终采用了目前在大型多模态模型(LMM)的 11 个基准上达到 SOTA 的 LLaVA 架构(Large Language and Vision Assistant),一个能够进行视觉和语言多模态转换的模型。有兴趣的童鞋,这里是论文链接:
LLaVA 架构在自然指令遵循和视觉推理能力方面表现出了令人印象深刻的结果。同时也适用于不同的下游任务和领域,包括区域级和像素级理解、生物医学助理、图像生成、对抗性研究。如下图,在 LLaVA 的架构中,Z_v 是我们通过识图客户端的 vision encoder 计算出的图片特征向量,经过一个可训练的投影矩阵 W 将 Z_v 转换为语言嵌入标记 H_v,这些标记具有与语言模型中的单词嵌入空间相同的维度。
自训练大模型
在 Language Model 这一层我们没有找到合适的大模型,受限于为了满足「识图 App」特殊的运行时需求和可生成更简洁、优美的配文,我们不得不自己训练了「识图 」专属 LLM 大模型:XSmart-bear7b,用来把图片的特征向量最终生成生动的文字。这只可爱的白熊是我们自训练大模型的图标(也是由大模型生成)。
告一段落
随着「识图 App」发布了第二个版本,基于照片的搜索和推荐可能稍微会稍微告一段落。让工具回归工具,让「识图 」更懂你的照片!