Kaloscope 3.0 Preview
Kaloscope 3.0 Preview 是面向动漫插画的图像表征与风格检索模型。模型以 DINOv3 ViT-B/16 为基础,利用已有画师标注和图像发布时间学习视觉相似度,输出适合建立检索索引的 256 维图像向量。
本次初版对应全量训练的第 46,000 步最佳检查点。它可以用于相似插画检索、参考图库匹配,以及基于带标注图库的画师候选检索。模型没有固定类别分类头;需要结合参考图库,才能把相似度结果转换为画师候选。
模型概述
| 项目 | 配置 |
|---|---|
| 版本 | 3.0 Preview,初版模型说明整理于 2026-10-03 |
| 基础模型 | DINOv3 ViT-B/16,LVD-1689M 预训练权重 |
| 输入 | RGB,短边等比例缩放至 512,再中心裁剪为 512×512 |
| 主干图像表征 | CLS token 与 patch token 均值拼接,1536 维 |
| 投影头 | Linear(1536,1536) → GELU → Linear(1536,256) |
| 推荐检索向量 | 投影头输出,256 维,经 L2 归一化后计算余弦相似度 |
| 分类头 | 无 |
| 参数量 | 88,423,938,约 88.42M(含训练温度与偏置) |
| 发布候选 | sigmoid_year_v1_20261002/best.pt,step 46000 |
| 代码 | kaloscope-dinov3,本说明核对版本 95ade97 |
与历史版本的关系
Kaloscope 2.0 采用 LSNet,面向固定画师类别输出分类概率。3.0 Preview 改用 DINOv3 图像编码器和相似度学习,支持为新增图库提取向量,建立或扩充检索索引。
旧版模型卡报告的 90.13% 是分类 Top-1;本文报告的是固定图库条件下的检索指标。两者的数据、类别范围和任务不同,不能据此计算版本提升幅度。旧版的推理脚本、分类标签表和 ComfyUI 节点也不能直接当作本版的接口使用。
训练数据与配对策略
本次使用本地 Danbooru2026 数据,经既有筛选、去重及作品族划分后,参与训练的样本共 6,569,159 张。监督信息来自已有单画师标注、发布时间和年份分组;没有额外生成标签或合成训练图像。
采样同时覆盖完整训练数据和稀疏画师:一半锚点按全量数据遍历,另一半按画师及年份组均衡采样,再为锚点配对图像。年份组用于采样均衡;正负关系仍按每对图像的时间差判断。
- 正样本:同画师、发布时间相差不超过 365 天,且属于不同作品族。
- 负样本:不同单画师,且属于不同作品族。
- 忽略:图像自身、同作品族,以及同画师但时间相差超过 365 天的配对。
- 缺少合格正样本的锚点仍被保留,其显式配对使用不同画师样本,不把该配对伪装成正样本。
发布时间是创作时期的代理,可能与实际绘制时间不同。“同画师、近时间”是风格弱监督信号,不是人工验证的风格相同标签。不同画师也可能具有相似风格,因此此目标仍带有画师身份偏置。
预处理包括 EXIF 方向校正、透明背景合成到白色、转为 RGB、短边缩放和中心裁剪。编码器内部执行 ImageNet 均值/标准差归一化。正式版本未使用随机裁剪或拉伸;中心裁剪仍可能截去长宽比极端图像的边缘内容。
训练配置
| 项目 | 数值 |
|---|---|
| GPU | 8× NVIDIA H100 80GB |
| 精度 | BF16 混合精度 |
| Batch size | 每卡 256,全局真实配对池 2048 |
| 优化器 | AdamW |
| 初始学习率 | 主干 2e-5;投影头 2e-4;温度与偏置 1e-3 |
| 权重衰减 / 梯度裁剪 | 0.05 / 1.0 |
| Warmup | 1000 步 |
| 可训练主干范围 | 最后 4 个 Transformer block(8–11)及最终归一化层 |
| 随机种子 | 20261004 |
| 检查点选择 | 开发集跨内容、按画师宏平均的 temporal Hit@10 |
| 结束状态 | 第 52,000 步触发验证集平台期早停,完整运行约 32 小时 |
训练采用带可学习温度和偏置的成对 sigmoid 损失。令归一化图像向量为 z,有效配对标签为 y∈{+1,-1},则每个 batch 的损失为:
sum_valid_pairs softplus(-y_ij * (temperature * cosine(z_i, z_j) + bias)) / global_batch
损失计算全局 batch 内的有效配对。当前发布候选没有叠加 CE、VICReg、额外 Gram Anchoring 或 EMA;这些指本次微调配置,不代表基础 DINOv3 的预训练方法。后续 demo 消融的配置和结果不属于本版发布指标。
模型表现
以下为 step 46000 的 256 维投影向量在固定开发集上的结果,使用 L2 归一化和余弦相似度排序。
| 指标 | 结果 |
|---|---|
| 常规图库画师检索 Top-1 | 95.23% |
| 跨内容图库画师检索 Top-1 | 83.29% |
| 常规图库 temporal Hit@10 | 96.50% |
| 跨内容 temporal Hit@1 | 60.86% |
| 跨内容、按画师宏平均 temporal Hit@10(选模指标) | 87.78% |
评估范围与指标定义:
- Gallery 共 16,217 张,来自训练划分;常规评估有 1,972 个有效开发集 query,覆盖 512 位训练中见过的画师。
- 跨内容评估有 1,137 个有效 query,覆盖 365 位画师。query 与候选必须都有角色和作品标注,并且角色标签无交集、作品标签无交集。它衡量基于现有标签过滤后的跨内容检索,不保证图像所有语义内容完全不同。
- 画师 Top-1:最高相似度候选与 query 的画师相同。它不是分类头准确率,也不要求该候选满足近年份约束。
- Temporal Hit@K:前 K 个候选中至少一个与 query 同画师且发布时间相差不超过 365 天。
- 宏平均先在每位画师内部计算命中率,再对画师平均。只统计候选足够且存在合格 temporal 正样本的 query,因此这些指标不能代表没有近年参考图的查询。
同一面板上,原始 DINOv3 主干的常规画师 Top-1 为 31.85%,跨内容画师 Top-1 为 10.38%,跨内容宏平均 temporal Hit@10 为 18.18%。此对照比较的是原始主干特征与微调后的投影特征,表征维数也不同。
kNN 画师投票评估
在上述固定面板上,进一步测试了不同邻居数的画师标签投票。kNN 是基于参考图库的检索与投票,不会为模型添加训练过的分类头。下表均使用主线 256 维投影向量。
| 邻居数 k | 常规:均匀投票 | 常规:相似度加权 | 跨内容:均匀投票 | 跨内容:相似度加权 |
|---|---|---|---|---|
| 1 | 95.23% | 95.23% | 83.29% | 83.29% |
| 5 | 95.99% | 96.45% | 82.15% | 84.08% |
| 10 | 96.10% | 96.60% | 78.63% | 83.55% |
| 20 | 95.59% | 96.65% | 70.89% | 81.62% |
表中为查询图像的画师预测正确率。均匀投票平票时,选择距离最近的并列画师;相似度加权使用固定权重 exp(cosine / 0.07)。四种 k 的有效查询数相同:常规 1,972 张、跨内容 1,137 张;沿用前述有效 query 条件,k=20 另外要求至少 20 个允许候选。
跨内容条件下,加权 k=5 在本次设置中表现最好;继续扩大邻域会混入更多其他画师。可将 256D + 余弦相似度 + 加权 k=5 作为应用验证的起点,但这一选择尚未经过独立测试或显著性验证。
KMeans 聚类评估
采用球面 KMeans:图像向量先做 L2 归一化,以余弦相似度分配簇,每轮重新归一化中心。只使用 16,217 张 gallery 图像拟合中心,再对 1,972 张开发集 query 分配簇。画师及年份组标签不参与中心拟合,只用于事后评估;画师预测时,每个簇的画师身份由 gallery 的多数标签决定。
簇数测试 128、256、512、1024,每种使用随机初始化种子 11、22、33,最多迭代 100 轮。三种表征共 36 组全部收敛。512 簇是参照本面板画师数量的诊断设置,不是自动发现的最优风格数量。
512 簇下的表征比较(三个种子的均值 ± 样本标准差):
| 表征 | Query 画师 ARI | Query 画师 AMI | Gallery 簇标签映射后的 query 画师准确率 |
|---|---|---|---|
| 原始 DINOv3 主干,1536D | 0.1026 ± 0.0047 | 0.1781 ± 0.0049 | 13.78% ± 0.50 个百分点 |
| 主线主干,1536D | 0.5997 ± 0.0157 | 0.6977 ± 0.0119 | 70.33% ± 1.41 个百分点 |
| 主线投影,256D | 0.7670 ± 0.0177 | 0.8343 ± 0.0087 | 82.78% ± 1.58 个百分点 |
ARI 与 AMI 衡量聚类和画师标签的一致程度,并校正随机一致性;越高表示越接近标签分组,不能解释为人工风格评分。
主线 256D 在不同簇数下的结果(三个种子的平均值):
| 簇数 | Query 画师 ARI | Query 画师纯度 | 簇映射后的 query 画师准确率 | Query 年份组 ARI | Gallery 余弦轮廓系数 |
|---|---|---|---|---|---|
| 128 | 0.2399 | 33.13% | 22.33% | 0.1570 | 0.0732 |
| 256 | 0.4554 | 56.34% | 47.67% | 0.3120 | 0.1114 |
| 512 | 0.7670 | 85.70% | 82.78% | 0.5630 | 0.1662 |
| 1024 | 0.7711 | 95.96% | 93.32% | 0.6602 | 0.1239 |
纯度用 query 标签统计每个簇的多数画师占比,仅作为评估指标;它通常随簇数增大而上升,不宜单独用于选择簇数。轮廓系数在固定抽取的 2,048 张 gallery 图像上计算。增加到 1024 簇提高了画师识别及年份组一致性,但画师 ARI 增幅有限、轮廓系数下降,因此不能据此声称整体分组更自然。
512 簇与 1024 簇的不同初始化之间,query 分配的平均 ARI 分别为 0.7228、0.7492,局部簇边界仍有变化。部署时应保存拟合中心;本面板的簇数也不能直接套用到全量数万画师图库。
聚类可视化
每个点是一张图像,合计 18,189 张;同色表示同簇,左右颜色编号各自独立。两幅图共享同一套坐标:归一化的 256D 特征经 PCA 降到 50 维,再用 t-SNE 投影到二维(随机种子 42,perplexity 40,1000 次迭代)。gallery 和 query 共同参与的仅是这一步可视化,query 没有参与原始 KMeans 中心拟合。
图中展示的是聚类种子 11 的单次结果:512 簇画师 ARI 为 0.781、簇映射准确率为 83.37%;1024 簇分别为 0.775、93.46%。它们与上表三个种子的平均值口径不同。聚类来自原始 256 维空间,二维图上的间距、岛状结构不能直接解释为真实风格距离或天然风格类别。
上述结果支持主线表征具有较强的画师相关分组能力,尚未通过人工图像审阅验证跨画师的纯风格聚类效果。年份组也只是元数据分组,不等同于已确认的风格阶段。评估仍限于训练已见画师的开发面板,未使用封存测试集。
使用方法
安装本项目的 PyTorch 推理依赖,在仓库根目录执行下列示例。当前模型需使用项目内 dinov3.finetune.temporal.model.Encoder;不是可直接交给通用分类 Pipeline 的模型。
git clone https://github.com/Chenkin-x/kaloscope-dinov3.git
cd kaloscope-dinov3
# 安装与本机 CUDA 匹配的 torch/torchvision,再安装以下依赖
pip install numpy Pillow omegaconf
下面的示例对应训练产物 best.pt 格式,其中包含 model_config 和 model。若上传时转换为 safetensors,需要同时提供配置并调整加载代码。
import numpy as np
import torch
import torch.nn.functional as F
from torchvision import transforms
from dinov3.finetune.data import rgb_loader
from dinov3.finetune.temporal.model import Encoder
device = "cuda" if torch.cuda.is_available() else "cpu"
# 训练检查点含优化器/RNG等状态;仅加载自己训练或可信来源的文件。
checkpoint = torch.load("best.pt", map_location="cpu", weights_only=False)
config = dict(checkpoint["model_config"])
config["weights"] = None # 完整微调权重已在检查点内,无需重新下载基础权重
model = Encoder(config, initialize=False)
model.load_state_dict(checkpoint["model"], strict=True)
model = model.to(device).eval()
spatial = transforms.Compose([transforms.Resize(512), transforms.CenterCrop(512)])
@torch.inference_mode()
def encode(path):
image = spatial(rgb_loader(path))
x = torch.from_numpy(np.array(image, copy=True)).permute(2, 0, 1)
# uint8、0..255;Encoder 内部归一化,外部不要重复 Normalize。
output = model(x.unsqueeze(0).to(device))
backbone = F.normalize(output[:, :1536].float(), dim=-1)
embedding = F.normalize(output[:, 1536:].float(), dim=-1)
return embedding, backbone
query, _ = encode("query.png")
reference, _ = encode("reference.png")
print("cosine similarity:", (query @ reference.T).item())
Encoder.eval() 的原始输出是 1792 维拼接张量:前 1536 维是主干特征,后 256 维是投影向量;请拆分后分别归一化。上述公开指标使用后 256 维,不是整个拼接张量。温度和偏置是训练参数,余弦检索不需要应用它们。
已在 PyTorch 2.11.0+cu128 环境中用正式 best.pt 和真实图像验证:权重严格加载全部匹配,输入 [1,3,512,512],输出 [1,1792],拆分后的投影向量为 [1,256],数值有限且归一化后范数为 1。详细记录见 inference_verification.json。
建立图库时,为所有参考图保存同一版本的向量以及对应画师、图像 ID 等元信息,再按相似度检索。相似度值不是校准后的画师置信度或风格概率;拒识阈值、多个参考图的画师聚合规则需要在实际业务数据上单独验证。不同模型版本生成的向量应重建索引,不能直接混用。
适用范围与限制
本版主要服务于动漫插画的参考图检索和表征研究。模型可能利用配色、题材、构图及画师相关线索;跨内容评估只能部分约束这些混淆,尚不能声称完全解耦风格和内容。照片、设计图、漫画页面、强裁剪、灰度输入及罕见风格的效果不包含在上述验证结论中。
画师候选依赖图库覆盖度,不能用于作品归属的确定性判断。本版未发布独立训练的画师分类头、生成模型、IP-Adapter 接口或旧版 ComfyUI 节点兼容承诺。推理延迟和部署显存尚未单独基准测试。
许可与引用
本模型基于 Meta DINOv3 微调,随附 DINOv3 License;使用和再分发遵循该协议。请同时阅读官方协议。训练图像及其相关权利不随模型说明或权重许可转授。
基础模型与方法:DINOv3 官方仓库、DINOv3 论文。历史版本:Kaloscope 2.0 模型说明。
初版更新记录
- 基础架构更新为 DINOv3 ViT-B/16,输入分辨率 512×512。
- 使用画师与近时间图像配对学习,输出 256 维检索向量。
- 提供常规与跨内容开发集检索结果,保留独立封存测试集。
- 补充 kNN 投票、三种表征的多簇数 KMeans 对照,以及 512/1024 簇二维可视化。
- 初版选用全量训练 step 46000 检查点;后续消融通过验证后再单独更新版本。
