mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-07-31 07:10:41 -05:00
feat: add IP-Adapter support for SD 1.5 and SDXL (#1803)
This commit is contained in:
@@ -1285,11 +1285,54 @@ static std::string convert_esrgan_tensor_name(std::string name) {
|
||||
return name;
|
||||
}
|
||||
|
||||
static const std::map<int, std::string>& ip_adapter_index_map(SDVersion version) {
|
||||
static const std::map<int, std::string> sd15_map = {
|
||||
{1, "input_blocks.1.1.transformer_blocks.0"}, {3, "input_blocks.2.1.transformer_blocks.0"}, {5, "input_blocks.4.1.transformer_blocks.0"}, {7, "input_blocks.5.1.transformer_blocks.0"}, {9, "input_blocks.7.1.transformer_blocks.0"}, {11, "input_blocks.8.1.transformer_blocks.0"}, {13, "output_blocks.3.1.transformer_blocks.0"}, {15, "output_blocks.4.1.transformer_blocks.0"}, {17, "output_blocks.5.1.transformer_blocks.0"}, {19, "output_blocks.6.1.transformer_blocks.0"}, {21, "output_blocks.7.1.transformer_blocks.0"}, {23, "output_blocks.8.1.transformer_blocks.0"}, {25, "output_blocks.9.1.transformer_blocks.0"}, {27, "output_blocks.10.1.transformer_blocks.0"}, {29, "output_blocks.11.1.transformer_blocks.0"}, {31, "middle_block.1.transformer_blocks.0"}};
|
||||
|
||||
static std::map<int, std::string> sdxl_map;
|
||||
if (sdxl_map.empty()) {
|
||||
std::vector<std::pair<std::string, int>> order = {
|
||||
{"input_blocks.4.1", 2}, {"input_blocks.5.1", 2}, {"input_blocks.7.1", 10}, {"input_blocks.8.1", 10}, {"output_blocks.0.1", 10}, {"output_blocks.1.1", 10}, {"output_blocks.2.1", 10}, {"output_blocks.3.1", 2}, {"output_blocks.4.1", 2}, {"output_blocks.5.1", 2}, {"middle_block.1", 10}};
|
||||
int idx = 1;
|
||||
for (const auto& [block, depth] : order) {
|
||||
for (int m = 0; m < depth; m++) {
|
||||
sdxl_map[idx] = block + ".transformer_blocks." + std::to_string(m);
|
||||
idx += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return sd_version_is_sdxl(version) ? sdxl_map : sd15_map;
|
||||
}
|
||||
|
||||
static std::string convert_ip_adapter_name(std::string name, SDVersion version) {
|
||||
if (starts_with(name, "image_proj.")) {
|
||||
return "ip_adapter." + name;
|
||||
}
|
||||
if (starts_with(name, "ip_adapter.")) {
|
||||
auto items = split_string(name, '.');
|
||||
if (items.size() < 4) {
|
||||
return name;
|
||||
}
|
||||
int idx = atoi(items[1].c_str());
|
||||
const auto& mp = ip_adapter_index_map(version);
|
||||
auto blk = mp.find(idx);
|
||||
if (blk == mp.end()) {
|
||||
return name;
|
||||
}
|
||||
return "model.diffusion_model." + blk->second + ".attn2." + items[2] + "." + items[3];
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
std::string convert_tensor_name(std::string name, SDVersion version) {
|
||||
if (version == VERSION_ESRGAN) {
|
||||
return convert_esrgan_tensor_name(std::move(name));
|
||||
}
|
||||
|
||||
if (starts_with(name, "ip_adapter.") || starts_with(name, "image_proj.")) {
|
||||
return convert_ip_adapter_name(std::move(name), version);
|
||||
}
|
||||
|
||||
bool is_lora = false;
|
||||
bool is_lycoris_underline = false;
|
||||
bool is_underline = false;
|
||||
|
||||
Reference in New Issue
Block a user