See-through 23层身体标签体系深度解析:从hair到wings,动漫部件如何映射到Live2D Drawable
【免费下载链接】see-through"Single-image Layer Decomposition for Anime Characters" (SIGGRAPH 2026 Conference Paper)项目地址: https://gitcode.com/gh_mirrors/se/see-through
See-through是一个获得 SIGGRAPH 2026 收录的开源研究项目,核心能力是单图动漫角色图层分解(Layer Decomposition):输入一张静态动漫插画,自动输出最多23 层语义分离的 PSD 文件——从 front hair 到 wings,每一层都经过补全(inpainting)并按深度排序,可以直接对接 Live2D 工作流。本文带你完整看懂这套"23层身体标签体系"的设计、它如何从动漫社区标签映射而来,以及每个标签最终落到 Live2D Drawable 的哪一层。
🧩 23层标签体系全景:每个tag管什么?
这套体系的完整定义只有一行 Python 常量,位于 common/live2d/scrap_model.py:
VALID_BODY_PARTS_V3 = [ 'front hair', 'back hair', 'headwear', 'face', 'irides', 'eyebrow', 'eyewhite', 'eyelash', 'eyewear', 'ears', 'earwear', 'nose', 'mouth', 'neck', 'neckwear', 'topwear', 'handwear', 'bottomwear', 'legwear', 'footwear', 'tail', 'wings', 'objects' ]按角色部位可以分为四大类:
| 区域 | 标签(tag) | 作用 |
|---|---|---|
| 头部 | front hair/back hair | 头发按遮挡关系拆成前后两层 |
| 头部 | headwear | 帽子、皇冠、发饰、耳机等全部头饰 |
| 面部 | face | 脸部皮肤基底 |
| 眼部 | irides/eyebrow/eyewhite/eyelash | 把笼统的"眼睛"拆成虹膜、眉毛、眼白、睫毛四件 |
| 头部 | eyewear/ears/earwear/nose/mouth | 眼镜、耳朵、耳饰、鼻、嘴 |
| 身体 | neck/neckwear/topwear/handwear | 脖子、项链围巾、上衣与袖套 |
| 下身 | bottomwear/legwear/footwear | 下装、袜装、鞋靴 |
| 附加 | tail/wings/objects | 尾巴、翅膀、持有物 |
💡 这套标签与 inference/demo/bodypartseg_sam.ipynb 中展示的 19 部件分割 demo 一脉相承,V3 是其中最新、最细的一版。
🔍 从 hair 到 irides:标签体系的三次进化
标签体系并非一步到位。在 common/live2d/scrap_model.py 中,三个版本被完整保留了下来:
- V1(20 类):最粗糙的一版,头发只有一个
hair,眼睛只有一个eyes,还包含beard(胡须)和skin(裸露皮肤); - V2(19 类):删掉了
beard和skin,新增objects承接手持物、背景杂物; - V3(23 类):两处关键升级——
hair拆成front hair+back hair,eyes拆成irides+eyebrow+eyewhite+eyelash。
这正是"Live2D 思维":做动态表情时,上下眼睑要遮住虹膜、刘海要压住眉毛,只有把眼部拆成独立图层,才能做自然的眨眼和视线动画。V1/V2 的单一eyes图层做不到这一点。
代码里还藏着一个精巧的别名映射,把 PSD 里的短层名还原回完整标签:
_tag_cvt = { 'hairf': 'front hair', 'hairb': 'back hair', 'eyebg': 'eyewhite' }🏷️ 动漫标签如何聚类到身体部件:bodytags_v3.json
Live2D 模型本身不告诉你"这块图是翅膀"。See-through 的解法是借助动漫社区的Danbooru 式标签做投票匹配。核心数据文件是 common/assets/bodytags_v3.json(2200+ 行),它的结构是:23 个身体部件 tag → 每个 tag 挂着一长串具体标签。
几个直观的例子:
wings下挂了 47 个标签:angel_wings(天使翼)、demon_wings(恶魔翼)、bat_wings(蝙蝠翼)、dragon_wings(龙翼)……只要图上的翅膀命中任意一个,这块 Drawable 就会被标为wings;headwear是最大的簇,超过 400 个标签,从straw_hat(草帽)到cat_ear_headphones(猫耳耳机);tail下则覆盖fox_tail、raccoon_tail、fish_tail等 60 多种尾巴。
与之配套的还有 common/assets/tagcluster_bodypart_v2.json,它把hair这一整族标签(发色、发型、双马尾等)聚到 hair 部件下。这套"标签簇 → 身体部件"的聚类规则,就是标题中"从 hair 到 wings"的映射源头。
⚙️ 核心映射:一个 Live2D Drawable 如何获得 body_part_tag
在 Live2D Cubism 模型中,Drawable 是最小的可绘制单元——每张贴图都有绘制顺序(draw order)和深度(depth)。See-through 在 common/live2d/scrap_model.py 中定义了镜像它的Drawable类:
class Drawable: def __init__(self, img=None, depth=-1, draw_order=-1, ...): self.body_part_tag = None # 每个Drawable最终会被打上一个23选1的标签Live2DScrapModel加载模型时会解析文件名约定绘制顺序-部件名-深度.png(如00042-iris-l-0000.png),把每个文件还原成一个 Drawable 对象。接下来标签是怎么打上去的?答案在训练数据管线 training/scripts/data_pipeline.py:
- SAM 语义分割给出候选掩码(例如
tail、wings的整体轮廓); - 关键点校验过滤误判——例如给
handwear的掩码要求它必须同时靠近左右手腕(check_points=[wrist_left, wrist_right]),footwear则必须靠近脚踝; - 校验通过的掩码写入 Drawable 的
body_part_tag,最终汇总成bodyparsingv3.json。
解析 Live2D 模型细节的完整脚本见 inference/scripts/parse_live2d.py,其中还处理了头发前后归属(hair 按遮挡位置分给front hair/back hair)和眼部四分(irides/eyebrow/eyebg/eyelash)。
📦 从 13 个分割部件到 23 层 PSD:后处理魔法
一个容易误会的地方:模型本身并不直接输出 23 层。主管线 inference/scripts/inference_psd.py 中,SAM 身体解析只输出 13 个大类(front hair、back hair、head、neck、topwear……wings、objects),细化的工作交给 common/utils/inference_utils.py 里的further_extr:
- 头发深度聚类:
hair按深度中位数聚成hairf(前发)和hairb(后发)两层; - 眼部四分 + 左右拆分:
eyes先分成左右两只眼,再拆出irides、eyebrow、eyewhite、eyelash,各自再分左右(eyer/eyel、browr/browl); - 左右拆分:
handwear、ears同样拆成左右组件; - 深度修正:
nose、mouth强制排在face之前绘制,ears排在face之后; - 按深度排序导出:所有层按
depth_median从深到浅写入 PSD,同时导出一份对应的灰度深度 PSD。
到这里,13 个分割部件 + 面部解析 + 左右拆分,正好拼出23 层 PSD。如果还想继续细分(比如左右手各穿不同手套),可以用 inference/scripts/heuristic_partseg.py 按深度(seg_wdepth)或左右(seg_wlr)二次拆分,产出handwear-1这类子标签层。
🖥️ 在统一 UI 中查看分解结果
分解完成后,项目内置的桌面 UI(见 ui/ 与 ui/README.md)可以加载workspace/下的数据集,可视化每层的掩码与标签归属,方便人工核对 23 层是否分对了:
🚀 快速上手:一条命令跑出23层
python inference/scripts/inference_psd.py --srcp assets/test_image.png --save_to_psd运行前只需创建 conda 环境并安装 requirements.txt(低显存用户可用 inference/scripts/inference_psd_quantized.py 的 4-bit 量化管线)。输出默认落在workspace/layerdiff_output/,除了 23 层 PSD,还会保存中间深度图与分割掩码。
写在最后
See-through 的 23 层标签体系本质是一座桥:一头连接动漫社区的标签生态(Danbooru 式 tag 聚类),另一头连接 Live2D 引擎的 Drawable 绘制模型。front hair 压住 face、face 压住 topwear、wings 悬在最后——这套深度语义一旦对齐,PSD 输出就能被 Live2D 系工具近乎开箱使用。正如作者在 README.md 中强调的,它目前还不是"Image-to-Live2D",但它替动画师干掉了最枯燥的部分:手工抠图和遮挡补全。
小提示:本文所有文件路径均相对于仓库根目录,可直接在代码库中跳转查看。
【免费下载链接】see-through"Single-image Layer Decomposition for Anime Characters" (SIGGRAPH 2026 Conference Paper)项目地址: https://gitcode.com/gh_mirrors/se/see-through
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考