三千张照片。
没人愿意花的九十分钟。

7Photo 是一个住在你自己 Mac 上的照片图库。五张几乎一模一样的照片里哪张眼睛是清晰的, 它知道;它还打算让你从手机上随时访问——而这一切都不离开这台机器。

图库是索引,不是容器

文件留在你放的地方——存储卡、SSD、NAS。不移动,不复制。原片附近唯一会写入的, 是放在它们旁边的 XMP 旁车文件。

它有主见,也亮出依据

清晰度测在眼睛上,而不是整个画面。闭眼检测。按人设定优先级。你看到的是 0.261 对 0.027,信不信由你决定。

随时可达,无需同步

Mac 上只有一份权威副本,直接访问。没有合并,没有冲突,没有云,没有订阅, 也没有第三方替你保管客户的照片。

同一瞬间的两张照片,二选一

这才是挑片的本质。不是浏览,而是选择——一秒五次,在只差“有没有人眨眼” 和“焦点有没有落准”的照片之间做选择。其他工具都让你先看一张、再看下一张, 等看到第二张时,第一张的细节你已经记不准了。

同一张人像的两张照片并排,以 1:1 显示面部。左边标注“eyes 0.261”,清晰;右边标注“eyes 0.027”,明显发虚。
同一瞬间的两张照片,都以检测到的面部为中心、真正的 1:1 显示, 一个视口同时驱动两个窗格,眼睛落在同一位置。 0.261 对 0.027——相差十倍,肉眼可见。 按 C 看整组连拍,按 Z 放大到眼睛。

为什么测眼睛,而不是整个画面

毛衣锐利、眼睛发虚的人像就该淘汰,而任何整幅画面的清晰度数值都告诉不了你这一点。 7Photo 在检测到的眼部区域上测量,必要时退回到面部,再退回到整个画面—— 并且会告诉你它用的是哪一个。

为什么你的判断和模型的判断分开存放

表里是两行独立记录,以 (uid, source) 为键。模型的判断永远无法覆盖你的, 界面也把模型的判断画得很淡,让你随时看得出还剩哪些没回答。早先一个版本只用 uid 作键,一次自动处理就悄无声息地抹掉了六十张已经判断过的照片; 这条规则正是因此而来。

一张照片占满窗口,旁边的面板列出对焦、人物、曝光、构图和相机等测量值,下方是一排五颗星。
照片旁列出什么,取决于什么能帮你拍板:眼睛处的对焦、有没有人闭眼、哪里过曝、 画面正不正。其余三十多列测量值不是决策依据,列出来只会是噪音。

它会学你,而且学不坏

偏好模型只用你的决定训练,而且用的是连拍组内的比较,而不是绝对分数—— 因为“这是不是一张好照片”这个问题谁也说服不了谁,而“同一瞬间里,这张是不是比那张好” 你每次都会给出同样的答案。

每个学出来的模型都要和朴素的规则打分器做交叉验证,输了就丢弃。 它可以越来越会预测你,却不会比它取代的规则更差。这种纪律,只有面向单个摄影师的工具才做得到; 必须给所有人发同一个模型的产品做不到。

美学模型就是同一种克制的实例。一个标准的图像质量网络被训练、测量,然后被刻意 挡在打分器之外,因为在真实拍摄中它偏爱过曝的高光——与溢出的相关系数为 +0.50。 它只作为一个输入提供给偏好模型,偏好模型可以学会忽略它;它从不被当作规则使用。

你的 Mac 就是服务器

所有能在手机上用的图库产品都押了同一个注:接管文件,好让它们能被同步。苹果“照片”把文件复制进一个不透明的包里, Lightroom CC 把它们上传。对档案以 TB 计的摄影师来说,两者都行不通;对签过保密协议的人来说,两者都不可接受。

7Photo 反其道而行。唯一的权威副本留在 Mac 上,手机去连它。这不是解决了图库产品里最难的问题, 而是让它不复存在——而这之所以可行,全靠索引本身其实很轻。

实测,不是估算

本页每个数字都来自在一次真实拍摄上实际运行的结果:Nikon D610 拍的 435 张照片。 凡是外推到十万张照片的数字,都会注明。

手机实际需要承载多少

层级每张照片100,000 张时放在哪里
索引,不含向量~4 KB400 MB哪里都行,即时可用
手机网格所需的列~0.2 KB20 MB几乎不占地方
网格缩略图,512px36 KB3.6 GB手机装得下
预览图,1400px198 KB19.8 GB按需传输
搜索与人脸向量5.4 KB540 MB留在 Mac 上
原片25–30 MB~3 TB从不移动

手机可以浏览、判断、评星、搜索一个十万张照片的图库,而连接上传输的始终只有几 KB; 打开某一张时,再拉一张 200 KB 的预览。“照片”和 Lightroom 都做不到,因为两者都假定原片就在本地。

把一张照片显示到屏幕上

1.6 ms相机自带的内嵌缩略图——小,但即时
67 ms解码一张 2400 万像素的原片
1.0 ms之后从缓存读回
13 ms打开一个 435 张照片的图库

这四个数字决定了架构:画网格时绝不解码原片。相机的缩略图立即出现,正式的缩略图在后台生成; 一次解码产出两种尺寸,因为第二种是白送的。

什么都不会被锁住

内容放在哪里
你的判断和星级原片旁的 XMP 旁车文件——旗标写成色标,星级写入 XMP:Rating,与 Lightroom 读取的方式完全一致。RAW 和相机在它旁边写下的 JPEG 算作一张照片,只判断一次,所以同一个判断会写进 Lightroom 为该 RAW 读取的旁车文件
所有测量结果.photocull/ 里的一个 SQLite 文件,格式在源码中有文档说明
你的原片原封不动,就在你放的地方。

在这里挑完的拍摄,用 Lightroom 或 Capture One 打开时,旗标和星级已经在上面了。 7Photo 不需要拿下你的整个工作流——它接走那没人想要的九十分钟,其余的交还给你。

缓存是一份公开的契约,而不是私有的目录格式。已经有两种语言按同一条有文档的规则读写它, 第三种也可以。删掉它,不会丢失任何不可替代的东西:每项测量都能重新计算, 而唯一不能重算的那张表——你的决定——正是设计要保护的。

图库

按连拍排列的照片网格——每个主体有好几张几乎一样的照片,大多数标为淘汰,一张保留——角落里有星级。
拍摄到手时的真实样子:一组组几乎相同的连拍,一张值得保留,其余都废了。 你的判断是实心的,模型的建议是淡色的,星级在对角。键盘操作与 Lightroom 一致:G 网格,E 单张, C 对比,Z 放大到眼睛,K X U 判断,0–5 评星,⌘Z 撤销。

关于这些截图

截图里是项目为自己生成的一次模拟拍摄—— tools/make_sample_shoot.py——因为一文件夹素材库样片算不上一次拍摄。 它虚构的是结构:按顺序拍下的场景,场景里的连拍,每组连拍一张好照片、其余按照片真实会出问题的方式废掉, 再加上一张存储卡被复制两次产生的重复,以及合理递增的 EXIF。里面的照片是真的—— scikit-image 的样例集,以及 NASA 拍摄的 Eileen Collins 肖像,属公有领域。 本页没有任何人的客户。

横向对比

7Photo 不是 Lightroom 或“照片”的替代品。它是它们之前的那一步——决定哪些照片值得保留—— 而且生来就是要把决定交给它们,而不是取而代之。下面是每个工具各自的核心定位, 依据我们在 2026 年 10 月的理解;它们变化很快,欢迎指正。

7Photo Lightroom Classic Lightroom(云端) 苹果“照片” AfterShoot Narrative Select Photo Mechanic
用来做什么 挑片,以及跨拍摄的图库 目录管理与 RAW 显影 云端编辑与同步 覆盖所有 Apple 设备的个人图库 AI 挑片与修图,服务于 Lightroom AI 辅助挑片 快速导入、浏览与图注
文件留在你放的地方 是 是 否——存在 Adobe 的云里 默认存进它自己的图库 是 是 是
找出连拍中最好的一张——眼睛对焦、闭眼 是,并给出数值 手动 手动 归组连拍,由你来选 是 是 手动,但非常快
从你的判断中学习你的口味 是,且赢不了规则的就丢掉 否 否 否 个人配置,主要用于修图 否 否
跨拍摄认出同一批人 是,并按重点人物评判合影 是 是 是 否 否 否
无需导入即可处理你的“照片”图库 是——原地读取 导入副本 导入副本 它本身就是图库 否 否 否
RAW 显影与编辑 没有,有意为之 行业标杆 有 基础 AI 修图,在 Lightroom 中应用 没有 没有
人像修图——瘦脸、磨皮、去瑕疵 有,非破坏性 修复画笔,不能改形 修复画笔,不能改形 一支修饰画笔 作为附加功能 没有 没有
决定交给谁 Lightroom 可读的 XMP 旁车文件 — — — 交给 Lightroom 交给 Lightroom 交给任何能读 XMP 的软件
怎么付费 免费——还不是产品 订阅 订阅 免费;存储空间付费 订阅 免费版加订阅 买断或订阅
运行平台 Mac;手机通过浏览器 Mac、Windows 全平台,外加网页 Apple 设备 Mac、Windows Mac、Windows Mac、Windows

各自更合适的场景

Lightroom:凡是以修图收尾的工作。它的 RAW 显影背后是几十年实测的相机与镜头配置文件, 这里没有任何东西想和它比。苹果“照片”:同时在 iPhone、iPad 和 Mac 上使用的家庭图库—— 它会同步,而 7Photo 刻意不做同步。AfterShoot 和 Narrative Select:想要挑片加 AI 修图、并且希望背后有公司提供支持的摄影师; 它们很成熟,而这里只是一个人的作品。 Photo Mechanic:赶截稿的新闻摄影,它的导入和图注是最快的。

7Photo 适合的场景

当挑片本身就是难点,而且“为什么选这张”很重要时:它会展示眼睛处的清晰度、闭眼、笑容, 以及它与哪组连拍做了比较;它学习一位摄影师的口味,却永远不被允许比朴素的规则更差。 当照片绝不能离开这台机器时——什么都不会上传,永远不会。当各个拍摄散落在多块硬盘上或存在“照片”里, 而搬动它们不可行时:它原地读取。当十年的判断应该比工具活得更久时: 它们存在一个有文档的 SQLite 文件里,也存在 Lightroom 能读的旁车文件里。

它们如何配合

在 7Photo 里挑片,然后 File → Export to Lightroom:这次拍摄在 Lightroom 中打开时, 旗标和星级都在,修图从那里开始。或者直接从“照片”打开一个相簿,原地挑片,什么都不导入。

它不是什么

一个告诉你它做不到什么的工具,比一个靠猜的工具更有用。对它自己的介绍也是如此。

没有显影模块,以后也不会有

Lightroom 的 RAW 处理不是一个读懂就能实现的算法。它是为大约一千款机身实测的双光源色彩配置文件, 两千个实测的镜头配置文件,一套专有的去马赛克算法,一种防止肤色发品红的高光重建, 以及一个联合设计、二十年里修订了五次的局部自适应色调算子。花三年做出来的东西, 在 D610 上的效果也比不上 Adobe 第一天的水平。

挑片用不着它。相机自带的内嵌预览就能看出对焦和表情,而且是由造传感器的人渲染的。 唯一真正的代价是,JPEG 预览比 RAW 更早溢出,所以高光溢出这项测量会偏高—— 这一点写在明处,而不是粉饰过去。

飞机上用不了

Mac 必须开着,并且连得上。这是拒绝同步直接带来、没有商量余地的代价,而它换来的是唯一值得说的一句话: 你的照片永远不会离开你的机器。

不知道时,它会直说

方向检测宁可弃权也不乱猜,因为把一张正着的照片转歪是损坏,而让一张横着的照片保持原样只是有点麻烦。 它拿不准的照片会标为待定,而不是悄悄归类。一个会说“这些我不确定”的专业工具, 比一个默默替你做决定的工具更有价值。而且即便是有把握的判断,也只在你要求时才应用—— Settings → Turn photographs upright by their faces,默认关闭—— 所以开箱即用时,每张照片都按相机存储的样子显示。

进展到哪了 进行中

挑片引擎

Python 引擎,内部代号 photocull。十三条命令。人脸与人物识别、连拍与场景分组、重复检测、几何构图分析、偏好学习、语义搜索、XMP 导出、修图。539 个测试。它留作实验室:每一处 Swift 移植都要对照它测试。

原生 Mac app

网格、胶片条、对比模式、在检测到的眼睛上真正 1:1、撤销、星级、筛选,以及一个按开始时间命名的“时刻”侧边栏。扫描、给人物命名、导出到 Lightroom,都在 app 里完成。约 15,500 行 Swift,401 个测试,不依赖任何第三方包。

一个图库,跨越各个拍摄

贯穿所有拍摄的时间线,可以从任意拍摄取片的相簿,跨文件夹识别的人物并沿用他们的名字,按文字和关键词搜索,以及一个知道某次拍摄在那块没插上的硬盘里的全局目录。

app 里没有 Python

测量、判断、人物分组和学习你的口味,全部用 Swift 基于 Core ML 和 Vision 完成。在一场 435 张的婚礼上:整个扫描不到一分钟,模型跑在神经网络引擎上,435 个判断中 435 个、516 张人脸中 516 张与引擎给出的完全一致。扫描可以中途停止,下一次从已测量的部分接着来。

app 内修图

瘦脸、磨皮、去瑕疵、拉直、向三分线裁切,带实时预览,而且没有接缝:变形不会折叠,皮肤蒙版覆盖额头、止于发际。非破坏性——设置随照片保存,只在导出时才生成全尺寸 JPEG 放进 Retouched/ 文件夹,一张特写只需几秒——在测试样本上与引擎的输出逐字节一致,在全尺寸特写上误差不超过一个色阶。

从手机访问

对整个设计最便宜的检验。引擎的浏览器工作台 photocull review 已经在家庭网络里从手机上用过;离开家、通过 Tailscale 访问还有待测试,app 自己的手机服务器就等这一步。

这还不是产品。它能运行,有测试,也在真实拍摄中用过。 app 能打包成一个自带模型的单一程序包,不需要 Python 或这个代码仓库就能运行——但构建它仍需要开发者工具链, 程序包没有签名或公证,没有安装程序,而且它使用的人脸身份模型仅限非商业用途发布。 这些都是已知并排好了顺序的事项,不是刚刚发现的问题。