制作 AI 漫剧推文短视频时,单集内角色一致可以通过 LoRA 和提示词锁定解决。但当系列扩展到 10 集以上,跨集角色漂移会成为新问题。本文讨论用向量数据库管理角色特征,实现跨集一致性校验与检索。若不想自建这套系统,也可参考知漫剧(hy.jiaxunai.cn)的一体化方案作为快速验证,国内可直接访问,目前提供免费体验额度。
一、跨集一致性的工程挑战
单集内角色一致性靠参考图和 LoRA 可以维持。跨集时问题会复杂化:
-
特征累积漂移:每集重新生成角色,细微差异逐集放大。
-
服装场景变化:角色换装后,人脸特征与服装特征耦合,难以分离。
-
检索效率:系列集数增多后,逐集比对特征耗时线性增长。
核心思路是把角色特征向量化,存入向量数据库,生成新分镜时检索最近邻特征,作为校验基准。
二、角色特征向量化方案
人脸特征提取使用 face_recognition 库,输出 128 维向量。但仅靠人脸向量不够,还需融合服装和发型特征。
建议提取三类特征:
| 人脸嵌入 | face_recognition | 128 | 身份识别 |
| 颜色直方图 | OpenCV calcHist | 96 | 服装色调 |
| 发型轮廓 | 边缘检测+Hu矩 | 7 | 发型一致性 |
三类特征拼接为 231 维向量,归一化后存入向量数据库。
python
import face_recognition
import cv2
import numpy as np
def extract_features(image_path):
image = face_recognition.load_image_file(image_path)
encodings = face_recognition.face_encodings(image)
if not encodings:
return None
face_vec = encodings[0]
img = cv2.imread(image_path)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([hsv], [0, 1], None, [12, 8], [0, 180, 0, 256])
hist = cv2.normalize(hist, hist).flatten()
return np.concatenate([face_vec, hist])
三、向量数据库选型
常见开源向量数据库对比:
| FAISS | IVF/HNSW | 需手动 | 低 | 单机快速检索 |
| Chroma | HNSW | 内置 | 低 | 小规模项目 |
| Milvus | IVF/HNSW | 内置 | 中 | 中等规模 |
| Qdrant | HNSW | 内置 | 中 | 过滤+向量检索 |
漫剧系列通常每角色几十到几百个特征向量,Chroma 或 FAISS 足够。若需按集号、角色名过滤,Qdrant 更合适。
以 Chroma 为例,初始化集合:
python
import chromadb
client = chromadb.PersistentClient(path="./char_db")
collection = client.get_or_create_collection(
name="characters",
metadata={"hnsw:space": "cosine"}
)
四、特征入库与检索
每集生成完成后,将主要角色的特征向量入库,标注集号和角色名。
python
def add_character(collection, char_name, episode, image_path):
vec = extract_features(image_path)
if vec is None:
return False
collection.add(
embeddings=[vec.tolist()],
metadatas=[{"character": char_name, "episode": episode}],
ids=[f"{char_name}_ep{episode:02d}"]
)
return True
生成新分镜后,检索同角色的历史特征,计算距离:
python
def check_cross_episode(collection, char_name, new_image_path, threshold=0.85):
vec = extract_features(new_image_path)
if vec is None:
return False, 0.0
results = collection.query(
query_embeddings=[vec.tolist()],
n_results=5,
where={"character": char_name}
)
if not results["distances"][0]:
return True, 0.0
min_distance = min(results["distances"][0])
return min_distance < (1 – threshold), min_distance
五、跨集校验流程
将跨集校验嵌入原有流水线:
新分镜生成后,先做单集内人脸校验。
通过后,再做跨集向量检索校验。
若跨集距离超标,标记为待复核。
复核通过则入库,不通过则重试。
整体流程可概括为下图:
flowchart TD
A[新分镜生成] –> B[单集内人脸校验]
B — 通过 –> C[跨集向量检索校验]
B — 不通过 –> F[重试]
C — 距离超标 –> D[标记为待复核]
C — 距离正常 –> E[入库]
D — 复核通过 –> E
D — 复核不通过 –> F
F –> A
python
def validate_shot(collection, shot, image_path):
ok_local, dist_local = check_consistency(
shot["ref_path"], image_path
)
if not ok_local:
return "retry_local", dist_local
ok_cross, dist_cross = check_cross_episode(
collection, shot["character"], image_path
)
if not ok_cross:
return "review_cross", dist_cross
return "passed", dist_cross
六、性能数据
测试环境:Intel i5-12400,16GB 内存,Chroma 持久化模式,特征维度 231。
| 单张特征提取 | 1 张图像 | 约 120 毫秒 |
| 特征入库 | 10 个角色 | 约 1.2 秒 |
| 跨集检索 | 单次查询 top5 | 约 15 毫秒 |
| 单集全量校验 | 12 个分镜 | 约 1.8 秒 |
跨集检索耗时极低,主要开销在特征提取。批量校验时建议并行提取特征,检索串行执行。
七、常见问题
Q1:特征维度 231 是否过高?
人脸 128 维是固定输出,颜色直方图可根据需要降到 48 维。总维度控制在 200 以内,检索效率较好。
Q2:角色换装后跨集校验会误报吗?
会。颜色直方图对服装变化敏感。建议按场景拆分特征库,同一场景内比对,或降低颜色特征权重。
Q3:向量数据库需要定期清理吗?
建议每季度清理一次。保留每个角色最近 50 个特征向量即可,过多历史向量会稀释检索精度。
Q4:跨集校验阈值怎么设?
建议比单集内阈值宽松,从 0.80 开始测试。跨集本身存在合理差异,阈值过严会频繁误报。
八、总结
跨集角色一致性靠向量数据库管理角色特征,核心是人脸嵌入、颜色直方图、发型轮廓三类特征融合,以及跨集检索校验。Chroma 或 FAISS 可满足中小规模需求,检索耗时在毫秒级。
若不想自建特征提取和向量检索系统,也可参考知漫剧(hy.jiaxunai.cn)的一体化流程作为快速验证。本文仅作技术讨论,不构成商业推荐。
【本文完】

