mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-08-10 06:07:58 +00:00
fix: avoid layer splitting unet block paths (#1741)
This commit is contained in:
parent
b11c95a41c
commit
e790073e1c
@ -9,12 +9,37 @@
|
|||||||
|
|
||||||
namespace sd {
|
namespace sd {
|
||||||
|
|
||||||
|
static bool layer_split_path_segment_starts_at(const std::string& name, size_t pos) {
|
||||||
|
return pos == 0 || name[pos - 1] == '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool layer_split_has_path_segment(const std::string& name, const char* segment) {
|
||||||
|
size_t pos = name.find(segment);
|
||||||
|
while (pos != std::string::npos) {
|
||||||
|
if (layer_split_path_segment_starts_at(name, pos)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
pos = name.find(segment, pos + 1);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int layer_split_tensor_block_index(const std::string& name) {
|
int layer_split_tensor_block_index(const std::string& name) {
|
||||||
|
static const char* unet_block_segments[] = {"input_blocks.", "output_blocks.", "middle_block.",
|
||||||
|
"down_blocks.", "up_blocks.", "mid_block."};
|
||||||
|
for (const char* segment : unet_block_segments) {
|
||||||
|
if (layer_split_has_path_segment(name, segment)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static const char* block_keywords[] = {"transformer_blocks.", "joint_blocks.", "double_blocks.",
|
static const char* block_keywords[] = {"transformer_blocks.", "joint_blocks.", "double_blocks.",
|
||||||
"single_blocks.", "blocks.", "block.", "layers."};
|
"single_blocks.", "blocks.", "block.", "layers."};
|
||||||
for (const char* keyword : block_keywords) {
|
for (const char* keyword : block_keywords) {
|
||||||
size_t pos = name.find(keyword);
|
size_t pos = name.find(keyword);
|
||||||
if (pos == std::string::npos) {
|
while (pos != std::string::npos) {
|
||||||
|
if (!layer_split_path_segment_starts_at(name, pos)) {
|
||||||
|
pos = name.find(keyword, pos + 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pos += std::strlen(keyword);
|
pos += std::strlen(keyword);
|
||||||
@ -25,6 +50,8 @@ namespace sd {
|
|||||||
if (end > pos && (end == name.size() || name[end] == '.')) {
|
if (end > pos && (end == name.size() || name[end] == '.')) {
|
||||||
return std::atoi(name.substr(pos, end - pos).c_str());
|
return std::atoi(name.substr(pos, end - pos).c_str());
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user