看似合理不等于正确
任何通用图像模型都能给漫画页面上色。粘贴一页进去,不到一分钟就有结果,乍看之下还不错。问题从第二页开始:同一个角色换了个发色回来。接着是对话框里的文字被微妙地重画了。再接着是纯黑的格间空隙被凭空生成的画面填满。
这并不是说模型不会画画。它正在做被训练去做的事:产出一张看似合理的图像。可漫画页面不是一张图像。它是一串分格,共用同一批角色,印着真实的文字,由结构性的黑色分隔,并且属于必须与上一话衔接的章节。以单页合理为目标本身就是错的,再多的提示词也改变不了目标。
Watashi Colorizer 正是围绕这个差别构建的。以下是由此得出的六项工程决策。它们并不新奇,但每一项的存在都是因为我们亲眼见过缺了它会坏掉什么。
黑白
彩色1. 用实测对比而非新闻稿来选择模型权重
多数上色工具只是一层薄壳:用户图片发给公开 API,彩色图片再传回来。这样一来,壳的水平就止步于 API 供应商本季度发布的水平,工具也会继承该供应商的全部盲区,包括它拒绝处理的内容。
我们在自有 GPU 上运行自有权重,并且靠实测而非口碑来选择。候选模型会在相同的真实页面上与线上模型正面对决,由人工把结果并排比较。大多数候选会落败。胜出者靠证据取胜,落败记录也会写下来,以免同一条死路被探索两次。
当前引擎是针对上色做过专门微调的权重,而不是通用的现成模型。这是皮肤能被读成皮肤、背景会被补完而不是留成灰色的最主要原因。
2. 逐句验证过的指令
随每页一同发送的指令并非一次写成。它是通过单独测试每一句、只保留能可测量地改变输出的部分,一点点拼起来的。
这种做法之所以重要,是因为写提示词充满了与直觉相反的结论。我们自己工作中最清楚的例子是:一句列举皮肤绝不该出现的颜色的指令,恰恰产生了皮肤正是那些颜色的页面。点名你不想要的东西,只会让它更可能出现而不是更少。修正办法是只描述正确结果应该是什么样。靠推理我们永远发现不了这一点,是靠测试一句、看结果才发现的。
因此现用的指令集很短,每一部分都凭本事留下:确定皮肤色调、补完每一处背景、保持解剖结构就是画出来的形状、精确保留线稿与文字。去掉其中任何一条,某个特定的问题就会回来。
3. 把页面更多地交给模型
图像模型在固定的内部尺寸下工作。你送进一张大扫描图,它在模型看到之前就被缩小了,于是页面上一切细小之处,远景中的脸、背景招牌上的字、细密的排线,都以糊团的形式抵达。模型接着就给糊团上色,因为它拿到的只有这些。
我们是在追查一个任凭怎么调提示词都不见好转的上色缺陷时,用惨痛方式学到这一点的。把同一区域裁出来单独发送,每一次都能正确返回。模型一直知道答案,只是从来没能看清题目。
因此页面会以引擎真正能用上的最大尺寸读入,而不是某个图省事的默认值,并且输出会以你上传文件的完全相同尺寸返回。
黑白
彩色4. 把页面当作分格来读,而不是一个矩形
漫画页面有一套通用模型没理由在意的结构:分格边框、格间空隙,以及必须保持纯黑的分隔。把它当矩形上色,这套结构就被当成纹理处理,于是你就会看到格间空隙里长出凭空捏造的风景。
我们的流水线在任何上色之前先检测分格边界与画面带,并且只在真实边界处切分。从分格中间切开比不切更糟,因为两半会被独立上色而永远对不上,所以切分器宁可拒绝也不去猜。
- 分格感知的切分,让每个区域都获得模型的全部注意力
- 格间空隙与黑阶的保留,让结构性的黑色继续是结构
- 调色板锚定,让反复出现的角色保持相同的发色、瞳色与服装
- 文字与线稿保留,让对白挺过上色过程
再配合调色板锚定,也就是把角色的颜色固定下来而不是每次重猜,整组角色才能在一页之内、乃至整章之内保持设定,而不是每页漂移一个色阶。
5. 一个别人都不处理的页面模式
日本的印刷审查会在身体上压一道硬边黑白条。对上色模型来说这是真正的歧义:条下没有可供参考的皮肤信息,于是它凭空编造,而且每次编造的都不一样。在我们的测试中,同一模型跑四次,同一页分别给出了棕色、灰色、橙色和粉色。
这种失败靠采样解决不了,因为你无法通过取平均得到输入中根本不存在的信息。必须明确告诉模型:这道条是什么,它下面是什么。所以审查处理是一个专用模式,你在需要的页面上开启它。
它做成可选项的理由值得直说:向一个并没有看到审查条的模型描述审查条,会让模型自己加一道上去。这条指令很强,正因如此才把它限定在适用的页面,而不是对所有任务一直生效。
6. 把等待时间当作产品的一部分
自建 GPU 意味着要为其付费,也就意味着空闲时会让它休眠,也就意味着安静一段时间后的第一个请求要等硬件唤醒。这是不做薄壳所付出的真实代价,而假装没有这回事,正是让用户在任务中途流失的方式。
所以引擎会在你选中该模型的那一刻就开始预热,早于你挑完文件,这让大多数任务的等待完全消失。当等待不可避免时,进度界面会用直白的话说明,而不是显示一个它兑现不了的倒计时。
一个走到零又重新开始的计时器,比没有计时器更糟:它把一个慢任务变成看起来像谎言的东西。一旦超出预估,我们就停止预估,改为显示带说明的诚实已用时长,你还可以开启通知,这样离开标签页也很安全。
这些都不是魔法
上面每一条都不华丽。用实测挑选候选而不是相信营销。逐条验证指令。给模型足够的像素。尊重页面的结构。为困难情形单独做一个模式。对等待保持诚实。
真正带来差别的不是某一项技术,而是从读入到导出,始终把漫画页面当作漫画页面来对待。看似合理与真正能发布之间的全部距离,就在这里。
这个工具可以免费试用。评估以上所有内容最快的方法,就是拿一页你已经很熟的作品跑一遍,看它回来的是不是你画的那一页。