给黑白老照片上色
把扫描件拖进来。颜色是在你这台电脑上算出来的,照片不会离开这个页面;算好的颜色按原分辨率盖回原图。
正在看这台机器…
选一张照片
第一次用要下载 {mb} 的模型,只下这一次;之后存在浏览器缓存里,断网也能接着用。
手机上这个模型经常撑不住:运行时大约要 400 MB 空闲内存。可以试,但电脑上才稳。
没有现成的?拿这两张试
两张都是公有领域的 FSA/OWI 底片。点下去是当场算的,不是预先做好的对比图。
结果
这次处理过的
模型挑了这些颜色
按色相归并,百分比是这种颜色占画面的比例。皮肤、天空、草木、木头一般靠谱;油漆、衣服、招牌上的颜色是猜的。
它是怎么工作的
- 照片留在本机浏览器自己解码,缩成 512 × 512 的灰度张量。整个过程没有一个请求带着你的图出去。
- 模型只猜颜色,不碰明暗DDColor-tiny 吐出来的是 CIE-Lab 里的 a、b 两个色度通道,512 × 512,它根本没有亮度这一路输出。
- 色度放大,盖回原图两个色度通道放大回你的原分辨率,和你那张扫描件本身的明暗合在一起——颗粒和细节一点没动。
最后这一步就是「为什么出来的图不糊」的答案:模型只在 512 × 512 上干活,但你下载的那张图里每一个像素的明暗,都还是原照片的。本机实测(Apple M2 Max,WebAssembly 单线程)一张 100 万像素的扫描件约 6 秒,老一些的笔记本会更久;模型这一段的耗时和照片多大无关,只有最后合成那一步跟分辨率有关。
这一页用的模型
- 许可证
- Apache-2.0 · 许可证全文
- 需要下载
- 135 MB
- 跑在哪
- 你的 CPU,单个 WebAssembly 线程
DDColor(ICCV 2023,康晓阳等)的 tiny 版,由 edgetools 导出成 ONNX:fp16 权重、float32 输入输出。许可证 Apache-2.0,允许商用,全文随页面一起发。输入尺寸 512 × 512 是导出时写死的——这也是为什么不管你的照片多大,模型这一步的时间都差不多。
常见问题
照片会被传到服务器上吗?
不会。整页唯一要下载的东西是模型文件本身(约 129 MB,只下一次)。解码、上色、保存全在这个标签页里完成。不信可以打开开发者工具看网络面板,或者等模型下载完之后直接断网,照样能接着处理。
这些颜色是真的吗?
不是,是猜的。模型从训练集里学到「这种东西通常是什么颜色」。皮肤、天空、树木草地、木头这几类多半像那么回事;油漆、布料的染色、汽车、旗帜、招牌,从一张灰度底片上根本无从判断,模型只会给一个说得过去的颜色,不是真实的颜色。如果你要的是某件军装或某条裙子的确切颜色,请把这里的输出当底稿,再手动改。
有水印吗?有次数限制吗?
没有水印,不用注册,不排队。免费档一次 3 张、单张不超过 1200 万像素、20 MB,想跑多少次跑多少次——算力是你自己的,我们没有什么可限量的。
为什么出来的图没有糊掉?
因为模型只负责颜色。它看的是缩到 512 × 512 的版本,交回来的是 CIE-Lab 的两个色度通道;亮度那一路直接取你原文件的全分辨率数据,全程没动过。人眼对颜色边缘的模糊极不敏感,对明暗边缘却很敏感——这个分工正好卡在这个特性上,所以扫描件放大了看依然是原来的锐度。
能给黑白视频上色吗?
这一页不行。逐帧上色的帧与帧之间没有记忆,颜色会一直闪,看着比原来的黑白还难受。要做对得有时间一致性,这个模型没有这个能力。
和 Palette.fm、MyHeritage「照片上色」比怎么样?
那几家要把照片传到他们服务器上,然后按量计费:MyHeritage 免费上色几张之后就要订阅,免费出的图带标记;Palette 免费档压分辨率、加水印。这一页你放进去多大就还你多大,不加任何标记,因为算的是你自己的机器。他们强在模型更大、还有人工调过的风格滤镜——碰上难处理的人像,效果可能仍然比这里好。
为什么写着 CPU?我这台有独立显卡。
这个模型已公开的 ONNX 导出踩到了 ONNX Runtime WebGPU 后端的一个坑:解码器里残留的 spectral-norm 计算被交给了一个处理不了它的 GPU 算子,一跑就报错。与其给你弹个错误,这一页干脆把它固定在 CPU 上——所有机器都能跑对,新款 Mac 上一张照片六秒左右。换成 float32 重新导出就没这个问题,实测 0.2 秒以内;等那份导出公开了我们就切过去。