fix: 修复穿搭图片生成结果重复问题 - 添加随机种子支持
问题分析: - 每次生成的穿搭图片都完全相同 - 原因是ComfyUI工作流中的seed(随机种子)值固定不变 解决方案: - 在ComfyUI工作流节点替换逻辑中添加seed随机化处理 - 支持BOWONG-INPUT-SEED/RANDOM节点的自动随机化 - 为所有KSampler和KSamplerAdvanced节点自动生成随机seed - 添加rand依赖用于生成随机数 技术改进: - 每次生成时自动生成0到2^32-1范围内的随机种子 - 支持多种seed节点命名方式 - 保持向后兼容,不影响现有工作流结构 - 添加详细日志记录随机种子值 现在每次生成都会产生不同的结果,提升用户体验。
This commit is contained in:
parent
a477999445
commit
dd289a8685
|
|
@ -2352,6 +2352,7 @@ dependencies = [
|
||||||
"md5",
|
"md5",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"pulldown-cmark",
|
"pulldown-cmark",
|
||||||
|
"rand 0.8.5",
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest 0.11.27",
|
"reqwest 0.11.27",
|
||||||
"rusqlite",
|
"rusqlite",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ regex = "1.10"
|
||||||
num_cpus = "1.16"
|
num_cpus = "1.16"
|
||||||
tokio-tungstenite = "0.20"
|
tokio-tungstenite = "0.20"
|
||||||
futures-util = "0.3"
|
futures-util = "0.3"
|
||||||
|
rand = "0.8"
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
winapi = { version = "0.3", features = ["sysinfoapi"] }
|
winapi = { version = "0.3", features = ["sysinfoapi"] }
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,8 @@ impl ComfyUIService {
|
||||||
replacement_type = "prompt";
|
replacement_type = "prompt";
|
||||||
} else if node_id.contains("NEGATIVE") {
|
} else if node_id.contains("NEGATIVE") {
|
||||||
replacement_type = "negative";
|
replacement_type = "negative";
|
||||||
|
} else if node_id.contains("SEED") || node_id.contains("RANDOM") {
|
||||||
|
replacement_type = "seed";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 方式2: 检查节点的_meta.title字段
|
// 方式2: 检查节点的_meta.title字段
|
||||||
|
|
@ -409,12 +411,56 @@ impl ComfyUIService {
|
||||||
value: Value::String(neg_prompt.to_string()),
|
value: Value::String(neg_prompt.to_string()),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
"seed" => {
|
||||||
|
// 生成随机种子值 (0 到 2^32-1)
|
||||||
|
use rand::Rng;
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let random_seed: u32 = rng.gen();
|
||||||
|
|
||||||
|
info!("🎲 生成随机种子: {}", random_seed);
|
||||||
|
|
||||||
|
replacements.push(WorkflowNodeReplacement {
|
||||||
|
node_id: node_id.clone(),
|
||||||
|
input_field: "seed".to_string(),
|
||||||
|
value: Value::Number(serde_json::Number::from(random_seed)),
|
||||||
|
});
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 额外处理:为所有KSampler节点随机化seed
|
||||||
|
if let Value::Object(ref workflow_obj) = workflow {
|
||||||
|
for (node_id, node_value) in workflow_obj {
|
||||||
|
if let Value::Object(node_obj) = node_value {
|
||||||
|
if let Some(Value::String(class_type)) = node_obj.get("class_type") {
|
||||||
|
if class_type == "KSampler" || class_type == "KSamplerAdvanced" {
|
||||||
|
// 检查是否已经有seed替换规则
|
||||||
|
let already_has_seed_replacement = replacements.iter()
|
||||||
|
.any(|r| r.node_id == *node_id && r.input_field == "seed");
|
||||||
|
|
||||||
|
if !already_has_seed_replacement {
|
||||||
|
// 生成随机种子值
|
||||||
|
use rand::Rng;
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let random_seed: u32 = rng.gen();
|
||||||
|
|
||||||
|
info!("🎲 为KSampler节点 {} 生成随机种子: {}", node_id, random_seed);
|
||||||
|
|
||||||
|
replacements.push(WorkflowNodeReplacement {
|
||||||
|
node_id: node_id.clone(),
|
||||||
|
input_field: "seed".to_string(),
|
||||||
|
value: Value::Number(serde_json::Number::from(random_seed)),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
info!("🔍 找到 {} 个需要替换的节点", replacements.len());
|
info!("🔍 找到 {} 个需要替换的节点", replacements.len());
|
||||||
for replacement in &replacements {
|
for replacement in &replacements {
|
||||||
info!(" 节点 {}: {} = {}", replacement.node_id, replacement.input_field, replacement.value);
|
info!(" 节点 {}: {} = {}", replacement.node_id, replacement.input_field, replacement.value);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue