怎么选模型 · Klarpix
四个模型蒙住名字比效果,最后选的是一条两级管线
Klarpix 的修复模型不是按名气选的。四个候选、一个竞品基线、三类共 15 张样本跑了 60 次对照,匿名盲评之后,定下来的是「先去尘划痕、再修人脸」的两级管线,对用户仍然只是一个按钮。
做一个「老照片修复」应用,第一个要回答的问题不是 UI 长什么样,而是修复这一步到底交给哪个模型。开源候选很多,每个都有漂亮的示例图。示例图是别人挑出来的,我要的是它在我的照片上会怎样。所以选型这一步,我把它当成一次实验来做,而不是一次挑选。
怎么比
候选四个:GFPGAN、CodeFormer、Real-ESRGAN、Clarity-Upscaler。它们的定位并不相同,有的专攻人脸,有的是通用超分,有的偏向「增强」。把定位不同的模型放在一起比,是有意的:我想知道的不是「谁在自己的赛道上更好」,而是「老照片这个具体任务上,用户会更愿意要哪一张」。
基线用 Remini。它是市面上用户量很大的同类产品,用它当参照,可以回答一个更要紧的问题:如果我的结果不如它,这个产品还值不值得做。
样本按老照片会遇到的三种情况分类:真正年代久远、有划痕和褪色的老照片;对焦不实或分辨率不足的模糊人像;用手机翻拍纸质照片带来的反光、摩尔纹与形变。三类共 15 张,都是真实照片,不用模型常见的公开测试图。
每张样本过每个候选一遍,加上基线,共 60 次对照。每次记录耗时。评价环节把输出打乱、去掉一切能看出来源的标记,匿名打分,打完再揭晓。这一步是整个实验里最不能省的:一旦知道哪张来自哪个模型,评价就会向名气倾斜,实验也就白做了。
比出来什么
- 三类样本上没有一个候选全面领先。人脸细节和整张照片的质感是两个不同的问题,擅长其一的模型往往在另一项上失分。
- 「修得漂亮」和「修得像」会冲突。第一眼好看的输出,未必经得起和原图逐处对照。所以评分时单列了一项:有没有补出原图里没有的东西。对老照片来说,这是最不能接受的错误:用户要找回的是一个具体的人,不是一张好看的脸。
- 划痕、灰尘与人脸模糊是两种损伤。一步到位的方案要么把划痕当纹理保留下来,要么为了盖住划痕把细节也抹平。
- 每次对照都记了耗时。耗时不是这次选型的决定因素,但它是后面定价判断的输入:如果候选之间相差一个量级,定价的结论会完全不同。
判断
既然没有单一模型能同时把两种损伤处理好,就不该逼自己在四个里选一个。最后定下来的是两级管线:先用 Topaz 处理去尘与划痕,再用 GFPGAN 做人脸修复。前一步解决介质损伤,后一步解决影像本身的模糊,各做各擅长的事。
第二个判断是关于产品形态的:两级管线对用户仍然是一个「修复」操作,一个积分。我不想让用户在「基础修复」和「高级修复」之间做选择,因为他们没有办法在修之前判断自己的照片需要哪一种。两步的成本差,由毛利吸收,而不是转嫁成一个让用户困惑的选项。
第三个判断是把过程说出去。App Store 的产品描述里写明了修复模型经过盲测选型。这不是营销话术,是对用户的一个承诺:我选它,是因为它在我的样本上表现更好,而不是因为它名气更大。
由此定下的口径
- 选模型必须盲评。评价者不能知道输出来自哪个候选,否则得到的是对品牌的判断,不是对效果的判断。
- 必须有一个市面上的头部产品做基线。不如基线,就不上线。
- 样本用真实照片,按用户会遇到的情况分类,不用模型常见的公开测试图。
- 「只还原照片里原有的东西,不编造细节」是评价标准,权重高于「看起来更好」。
- 管线内部可以复杂,对外只能是一个按钮。用户不该为技术选型的结果买单式地做选择。
- 选型结论写进产品描述,让承诺可以被追问。
结论
选模型是产品决定,不是技术决定。技术上四个模型各有所长,产品上只有一个问题:用户拿到的那张照片,是不是他记忆里的那个人。盲测、基线、真实样本,都是为了让这个问题的答案不受名气和示例图的干扰。至于最后是一个模型还是两个,是次要的。