文生图模型为什么会画错手
文生图模型为什么会画错手
用文生图模型画人物,经常会遇到一种很扫兴的情况:脸挺自然,衣服有质感,连背景的光影都像那么回事,放大一看,手上长了六根指头。
有时数量没错,问题却更隐蔽:拇指长错方向,两根手指连在一起,或者手指看似握着杯子,实际上穿进了杯壁。
这不只是“模型不会数到五”。一只手同时包含结构、姿态、遮挡和物体接触关系,而图像看着像真的,并不代表这些关系都正确。
模型画的是图像,不一定先搭好一只手
人学画手,常常先找手掌形状,再安排指根、关节和指尖。三维软件则可以先建立骨骼和网格,再通过相机投影得到图像。
普通文生图模型未必经过这样的步骤。以扩散模型为例,训练时会接触加噪后的图像,学习如何预测噪声或其他相关目标;生成时从噪声出发,在文字等条件的引导下逐步得到图像。[1] 使用潜空间扩散的系统,则主要在压缩后的表示中完成这一过程,再解码成图片。[2]
这套流程可以学到很丰富的形状和空间规律,但它通常没有一道必经检查:“这只手已经生成五根手指,禁止新增。”
换句话说,模型能学会五指手的视觉规律,不代表每次输出都受到五指骨骼的硬约束。皮肤纹理、指甲和阴影可能已经很逼真,手指的连接方式却仍然不成立。
下文主要以扩散类文生图系统解释。并非所有生成模型都采用相同架构,也不能把某一类模型的细节套到所有产品上。
手难画,是因为它的变化太多
一只摊开的正面手掌并不难辨认。麻烦在于,实际图片里的手很少老老实实摊平。
它会握拳、侧转、抓东西,手指可以分别弯曲,还经常互相挡住。拇指的朝向和活动方式,又与其他四根不同。同一只手换一个视角,二维轮廓就可能变化很大。
模型还要判断:眼前这条短短的皮肤轮廓,是一根弯曲的手指,还是另一根手指的一部分?消失在杯子后面的指尖,应该接到哪里?两个人握手时,哪段轮廓属于谁?
HandRefiner 这类手部修复研究,便将复杂形变与遮挡列为学习手部结构和姿态的难点。[3] 因而,不能把问题简单归结为“训练图片里的手不够多”。样本数量很重要,样本能否提供清楚的结构信息同样重要。

图 1:一只手是否合理,不能只检查手指数量。连接、遮挡和接触关系也要相互一致。图中为关系示意,不是实际模型的模块划分。
这里还有一个容易忽略的区别:真实的手有五根手指,不等于照片里必须出现五个指尖。握拳、侧面手掌或拿着东西时,只能看见其中一部分完全正常。为了满足“五根都清晰可见”的提示,反而可能把自然姿势改得别扭。
训练时看过手,不等于学过完整的手部说明书
一张图片的文字描述可能只是“一个人在咖啡馆喝咖啡”。它通常不会逐项说明:右手握住杯柄,食指弯曲,中指被挡住,拇指压在另一侧。
这不意味着模型只能从文字里学习手。图像本身就包含结构信息,模型可以从中学到规律。问题是,粗略的图文配对没有直接把每根手指的位置、身份和连接关系标出来。
在一些照片中,手还很小、模糊或被裁切。它们可以帮助模型学习“喝咖啡的场景”,却未必能提供清晰的手指细节。数据质量、标注方式、模型能力和训练目标,都可能影响最终表现。
也别把某个样本的六根手指解释成模型把两张训练图“拼坏了”。常规生成不是从图库里剪下几根手指再拼接,而是依据学到的分布生成新的图像。具体一次错误来自哪些内部因素,通常不能仅凭成图断言。
为什么小手、交叉手和握东西更容易出问题
想象一张全身照,人物的手只占几十个像素宽。有限的区域里,要塞下指缝、关节、指甲和遮挡边界,本来就缺少表达细节的空间。
如果系统还在空间压缩后的潜表示中生成,细小结构的区分就更值得关注。不过,潜空间压缩只是可能影响细节的因素之一,不能据此认定它是所有错手的根源;不使用相同压缩方式的模型,也可能出现结构错误。
握住物体时,问题从“手长什么样”变成“手和物体怎样共同存在”。模型需要同时满足手指弯曲、前后遮挡、接触位置等关系。局部轮廓如果各自像真,却没有统一起来,就可能出现手指穿过杯子、杯柄黏在皮肤上的情况。
这也解释了为什么提高清晰度未必管用。普通放大主要增加像素和细节;如果底下的连接关系已经错了,放大后可能只是得到一只更清楚的错手。带重新生成能力的高清修复有机会改变结构,但也可能引入新的错误。
多写几遍“正确的手”,为什么不一定有效
不少人会在提示词里加上“完美手部、正确解剖、五根手指”,再塞一长串负面词。
这些词在支持相应提示机制的系统中,可能影响生成倾向,但不是规则校验器。“没有多余手指”不会自动变成一个逐指计数的程序,负面提示词也不是所有模型或界面都支持。
比重复形容词更有信息量的,是说清楚动作:
半身人像,右手自然握住杯柄,左手放在桌面上。
双手不交叉,手部处于画面清晰区域。
这类描述减少了姿势上的歧义,但依然不保证正确。提示词适合表达意图;如果需要指定关节位置和遮挡关系,空间参考往往更直接。
真正修手,通常要补上结构信息
ControlNet 的思路,是在预训练文生图模型之外加入空间条件,例如边缘、深度或姿态信息。[4] 文字告诉模型“画什么”,条件图则进一步限制“在哪里、怎样摆”。
用在手部时,要特别注意条件本身的精细程度。只有肩膀、手肘和手腕的人体骨架,并没有给出每根手指的位置。需要控制手势时,应检查工具是否提供手部关键点或更细的几何信息。
HandRefiner 将手部网格重建与条件局部重绘结合,用结构信息引导畸形手的修复。[3] 这条路线的意义在于,把“请画正确”变成更具体的几何提示,而不是只增加几个赞美手部质量的词。

图 2:一种局部修复思路。遮罩限定修改范围,参考姿态或几何条件帮助约束结构;输出仍需要人工检查。
实际操作时,可以先保留满意的构图,再遮住整只问题手,连同少量手腕和接触物体边缘一起重绘。只涂掉多出来的指尖,有时会把错误的指根连接留在原地,让模型继续在错误结构上补细节。
| 方法 | 更适合处理什么 | 常见局限 |
|---|---|---|
| 明确动作和构图 | 姿势含糊、双手关系不清 | 难以精确指定关节位置 |
| 更换随机种子、多次生成 | 偶发的结构失败 | 需要筛选,也可能改变满意部分 |
| 裁切后局部重绘 | 手部太小、局部畸形 | 需保留手腕与物体的上下文 |
| 手部关键点、深度或网格条件 | 特定手势、结构约束 | 条件估计错误会影响结果 |
参考图也不是越强越好。姿态参考与原图视角不匹配,或者手部检测已经出错,都可能把错误传到后续步骤。修完以后,除了数手指,还要检查左右手、指根位置,以及抓握是否成立。
错手暴露的是“像”与“对”的距离
文生图模型画错手,不代表它完全没学到手部结构,也不能只用“不会数数”解释。更准确地说,它需要在多变的姿态、有限的局部细节和复杂的遮挡中,生成一组相互一致的关系,而普通图像生成流程未必对这些关系提供硬性保证。
理解这一点之后,处理方式也会更有针对性:动作不清,就明确动作;手太小,就给局部更多空间;结构已经错了,就用重绘和几何条件重新约束。把皮肤画得更细,和把手画对,始终是两件不同的事。
- 点赞
- 收藏
- 关注作者
评论(0)