根据Apple Photos,用SQL查找我最好的鹈鹕照片

2020-05-23 02:28:25

多亏了osxPhots,我自己用于访问Apple Photos元数据的代码的第一次迭代不到100行代码。这给了我几乎免费的地点、人名、相册和地名(地理区域的人名)!

Apple Photos有一个迷人的数据库表,名为ZCOMPUTEDASSETATTRIBUTES,其中有一个令人眼花缭乱的列集合。每个数字都是一个浮点数,大概是通过某种机器学习模型计算出来的。这是一份完整的名单,每一张都链接到我的公共照片,按分数排序:

我对我从这些项目中得到的结果印象不深。它们显然不是为了终端用户的可见性而设计的,而且对它们进行排序甚至可能没有意义。

ZGENERICASSET表提供了另外四个分数,它们似乎提供了更有用的结果:

我的猜测是,这些总分是从ZCOMPUTEDASSETATTRIBUTES的分数中得出的。我已经看到了ZOVERALLAESTHETICSCORE的最佳结果,所以这就是我在“给我看我最好的鹈鹕照片”查询中使用的结果。

我在Dogseam-Phoos.dogsheep.net上运行的演示目前只包含496张照片。我的私人实例有超过40,000个,但我决定只在演示中发布其中的一个子集,这样我就不必仔细过滤掉带有敏感位置之类的私人屏幕截图和照片。在本期中可以找到有关演示如何工作的详细信息(使用Dogseam-PhotosCreate-subset命令创建一个仅包含my Public相册中的照片的子集数据库)。

如今,多亏了卷积神经网络,自动标记照片内容变得出奇地容易。我在自动玩带有迁移学习和快速的科学交流游戏中写了一些关于这些的内容。

苹果将一个机器学习模型下载到你的设备上,并在那里进行标签分类。经过相当长时间的搜索(我最终针对Photoanalysisd进程使用了active Monitor的Inspect->;Open Files and Ports选项),我终于找到了结果的位置:~/Pictures/Photos\Library.photoslibrary/database/search/psi.sqlite数据库文件。

(查看照片分析还把我带到了/System/Library/Frameworks/Vision.framework/Versions/A/Resources/文件夹,这解决了另一个谜团:苹果把机型放在哪里?(里面有一些引人入胜的文件。)。

弄清楚如何将这些标签与其对应的照片相匹配需要一些工作,主要是因为psi.sqlite数据库将照片UUID存储为一对带符号的整数,而Photos.sqlite数据库存储一个UUID字符串。

我现在将标签拉到一个单独的标签表中。您可以在演示中浏览它,以了解它是如何构造的。标签属于数字类别-以下是我对这些类别含义的一些猜测:

1014类只是照片拍摄的月份。1015是年份,2030是季节。

这里有一个查询,它在每张照片旁边显示标签(来自每个类别)。在iPhone上拍摄的照片嵌入了纬度和经度.。这意味着我可以在地图上显示它们!

苹果还对这些照片进行反向地理编码,将它们解析为城市、地区和国家。这非常适合分面浏览:以下是我按国家、城市和州/省进行分面的照片。

关于Apple Photos,我最不喜欢的一点是,要把照片上传到互联网上有多难。如果你启用了iCloud共享,你的图片就可以通过icLoud.com访问--但是它们没有提供公开可访问的URL,所以你不能把它们嵌入到博客条目中,也不能用它们做其他Webby的事情。

我也真的很想“拥有”我的形象。我想把它们放在我能控制的地方。

Amazon S3是图像存储的理想选择。它非常便宜,而且本质上是无限的。

DOGSHEEP-PHOTES Upload命令接受任何目录作为输入,扫描该目录中的图像文件,然后将它们上载到配置的S3存储桶中。

我把它设计成独立于Apple Photos工作,主要是为了保留我在未来切换到替代图像解决方案的能力。

我正在使用内容可寻址存储模式来存储图像。它们的文件名是文件内容的sha256散列。其想法是,由于明智的照片管理软件保持原始文件不变,我应该能够删除我的照片文件的重复数据,无论它们来自哪里,并将所有内容存储在一个存储桶中。

原始图像文件带有隐私问题:它们在EXIF数据中嵌入了精确的纬度和经度数据,因此它们可以用来重建您的准确位置历史记录,甚至可以计算出您的地址。这就是为什么像Google Photos这样的系统很难导出位置数据完好无损的图像。

我已经通过将我的S3存储桶中的内容设为私有来解决这个问题。对映像的访问是通过s3-image-proxy进行的,这是我在Vercel(以前是Zeit Now)上编写并部署的代理服务器。代理对EXIF数据进行条带化,并可以根据查询字符串参数选择调整图像大小。它还为它们提供遥远未来的缓存过期标头,这意味着它们位于Vercel的CDN缓存中,而不是每次被访问时都调整大小。

iPhone默认将照片保存为HEIC格式,这无法在我测试的浏览器中与<;img src=";>;标签一起显示。代理使用pyheif将这些文件转换为JPEG。

下面是一个示例HEIC图像,由代理调整大小并转换为jpeg:https://photos.simonwillison.net/i/59854a70f125154cdf8dad89a4c730e6afde06466d4a6de24689439539c2d863.heic?w=600