首页 Watashi Games
← 返回指南列表

深入内部:通用 AI 模型为何在漫画上色上失败

通用模型看到的是一张图。漫画页面是由分格构成的序列,其中有反复出现的角色、印刷文字和纯黑的格间空隙。本文说明这个差别的代价,以及我们如何弥合它。

深入内部:通用 AI 模型为何在漫画上色上失败

看似合理不等于正确

任何通用图像模型都能给漫画页面上色。粘贴一页进去,不到一分钟就有结果,乍看之下还不错。问题从第二页开始:同一个角色换了个发色回来。接着是对话框里的文字被微妙地重画了。再接着是纯黑的格间空隙被凭空生成的画面填满。

这并不是说模型不会画画。它正在做被训练去做的事:产出一张看似合理的图像。可漫画页面不是一张图像。它是一串分格,共用同一批角色,印着真实的文字,由结构性的黑色分隔,并且属于必须与上一话衔接的章节。以单页合理为目标本身就是错的,再多的提示词也改变不了目标。

Watashi Colorizer 正是围绕这个差别构建的。以下是由此得出的六项工程决策。它们并不新奇,但每一项的存在都是因为我们亲眼见过缺了它会坏掉什么。

Black-and-white manga page before colorization黑白
The same page, AI-colorized彩色
一页,作为一页来上色:角色在每一格里保持相同的发色、瞳色与服装,黑色格间空隙仍然是黑的,对白也仍然是那段对白。

1. 用实测对比而非新闻稿来选择模型权重

多数上色工具只是一层薄壳:用户图片发给公开 API,彩色图片再传回来。这样一来,壳的水平就止步于 API 供应商本季度发布的水平,工具也会继承该供应商的全部盲区,包括它拒绝处理的内容。

我们在自有 GPU 上运行自有权重,并且靠实测而非口碑来选择。候选模型会在相同的真实页面上与线上模型正面对决,由人工把结果并排比较。大多数候选会落败。胜出者靠证据取胜,落败记录也会写下来,以免同一条死路被探索两次。

当前引擎是针对上色做过专门微调的权重,而不是通用的现成模型。这是皮肤能被读成皮肤、背景会被补完而不是留成灰色的最主要原因。

2. 逐句验证过的指令

随每页一同发送的指令并非一次写成。它是通过单独测试每一句、只保留能可测量地改变输出的部分,一点点拼起来的。

这种做法之所以重要,是因为写提示词充满了与直觉相反的结论。我们自己工作中最清楚的例子是:一句列举皮肤绝不该出现的颜色的指令,恰恰产生了皮肤正是那些颜色的页面。点名你不想要的东西,只会让它更可能出现而不是更少。修正办法是只描述正确结果应该是什么样。靠推理我们永远发现不了这一点,是靠测试一句、看结果才发现的。

因此现用的指令集很短,每一部分都凭本事留下:确定皮肤色调、补完每一处背景、保持解剖结构就是画出来的形状、精确保留线稿与文字。去掉其中任何一条,某个特定的问题就会回来。

3. 把页面更多地交给模型

图像模型在固定的内部尺寸下工作。你送进一张大扫描图,它在模型看到之前就被缩小了,于是页面上一切细小之处,远景中的脸、背景招牌上的字、细密的排线,都以糊团的形式抵达。模型接着就给糊团上色,因为它拿到的只有这些。

我们是在追查一个任凭怎么调提示词都不见好转的上色缺陷时,用惨痛方式学到这一点的。把同一区域裁出来单独发送,每一次都能正确返回。模型一直知道答案,只是从来没能看清题目。

因此页面会以引擎真正能用上的最大尺寸读入,而不是某个图省事的默认值,并且输出会以你上传文件的完全相同尺寸返回。

Black-and-white manga page before colorization黑白
The same page, AI-colorized彩色
细节得以保留,是因为页面按原始尺寸发送,而不是某个图省事的默认值。小小的脸、背景招牌与细密排线在上色后依然清晰可辨。

4. 把页面当作分格来读,而不是一个矩形

漫画页面有一套通用模型没理由在意的结构:分格边框、格间空隙,以及必须保持纯黑的分隔。把它当矩形上色,这套结构就被当成纹理处理,于是你就会看到格间空隙里长出凭空捏造的风景。

我们的流水线在任何上色之前先检测分格边界与画面带,并且只在真实边界处切分。从分格中间切开比不切更糟,因为两半会被独立上色而永远对不上,所以切分器宁可拒绝也不去猜。

  • 分格感知的切分,让每个区域都获得模型的全部注意力
  • 格间空隙与黑阶的保留,让结构性的黑色继续是结构
  • 调色板锚定,让反复出现的角色保持相同的发色、瞳色与服装
  • 文字与线稿保留,让对白挺过上色过程

再配合调色板锚定,也就是把角色的颜色固定下来而不是每次重猜,整组角色才能在一页之内、乃至整章之内保持设定,而不是每页漂移一个色阶。

5. 一个别人都不处理的页面模式

日本的印刷审查会在身体上压一道硬边黑白条。对上色模型来说这是真正的歧义:条下没有可供参考的皮肤信息,于是它凭空编造,而且每次编造的都不一样。在我们的测试中,同一模型跑四次,同一页分别给出了棕色、灰色、橙色和粉色。

这种失败靠采样解决不了,因为你无法通过取平均得到输入中根本不存在的信息。必须明确告诉模型:这道条是什么,它下面是什么。所以审查处理是一个专用模式,你在需要的页面上开启它。

它做成可选项的理由值得直说:向一个并没有看到审查条的模型描述审查条,会让模型自己加一道上去。这条指令很强,正因如此才把它限定在适用的页面,而不是对所有任务一直生效。

6. 把等待时间当作产品的一部分

自建 GPU 意味着要为其付费,也就意味着空闲时会让它休眠,也就意味着安静一段时间后的第一个请求要等硬件唤醒。这是不做薄壳所付出的真实代价,而假装没有这回事,正是让用户在任务中途流失的方式。

所以引擎会在你选中该模型的那一刻就开始预热,早于你挑完文件,这让大多数任务的等待完全消失。当等待不可避免时,进度界面会用直白的话说明,而不是显示一个它兑现不了的倒计时。

一个走到零又重新开始的计时器,比没有计时器更糟:它把一个慢任务变成看起来像谎言的东西。一旦超出预估,我们就停止预估,改为显示带说明的诚实已用时长,你还可以开启通知,这样离开标签页也很安全。

这些都不是魔法

上面每一条都不华丽。用实测挑选候选而不是相信营销。逐条验证指令。给模型足够的像素。尊重页面的结构。为困难情形单独做一个模式。对等待保持诚实。

真正带来差别的不是某一项技术,而是从读入到导出,始终把漫画页面当作漫画页面来对待。看似合理与真正能发布之间的全部距离,就在这里。

这个工具可以免费试用。评估以上所有内容最快的方法,就是拿一页你已经很熟的作品跑一遍,看它回来的是不是你画的那一页。

用你熟悉的一页来验证

本文最初发布于 Watashi Colorizer。

更多着色器指南