modules/processing.py->process_images()
p.scripts.before_process(p)
sd_models.reload_model_weights()
sd_vae.reload_vae_weights()
res = process_images_inner(p)
modules/processing.py->process_images_inner()
process_images->process_images_inner()->p:StableDiffusionProcessing
seed = get_fixed_seed(p.seed)
model_hijack.embedding_db.load_textual_inversion_embeddings()
p.scripts.process(p) ->
with torch.no_grad(),p.sd_model.ema_scope():
with devices.autocast():
sd_vae_approx.model()
sd_unet.apply_unet()
for n in range(p.iter):
p.prompts = p.all_prompts
p.negative_prompts = p.all_negative_prompts
p.scripts.before_process_batch(p,batch_number,prompts,seeds) ->
p.parse_extra_network_prompts()
p.scripts.process_batch(p,batch_number,p.prompts,p.seeds,...)
p.setup_conds()
with devices.without_autocast() if devices.unet_needs_upcast else devices.autocast():
samples_ddim = p.sample(conditioning,unconditional_conditioning,prompt...)
x_samples_ddim = [decode_first_stage(p.sd_model,samples_ddim[i:i+1] for i in range(samples_ddim.size(0))]
p.scripts.postprocess_batch(p,x_samples_ddim,batch_number)
for i,x_sample in enumerate(x_sample_ddim):
x_sample = 255*np.moveaxis(x_sample.cpu().numpy(),0,2)
if p.restore_faces:
x_sample = modules.face_restoration.restore_faces(x_sample)
image = Image.formarray(x_sample)
pp = scripts.PostprocessImageArgs(image)
p.scripts.postprocess_image(p,pp)
image = pp.image
p.scripts.postprocess(p,...)
这个函数和scripts配合就是webui中文生图以及图生图的主pipeline,在processing中调用StableDiffusionProcessingTxt2Img和StableDiffusionProcessingImg2Img就是最核心的2个生图接口。
1.script在哪里做初始化?
script由scripts.py控制
ScriptRunner->
initialize_scripts在create_ui时初始化
run->
script_index = args[0]
script_args = args[script_args.from:script.args_to]
processed = script.run(p,*script_args)
before_process()
process()
before_process_batch()
process_batch()
postprocess()
postprocess_batch()
postprocess_image()
2.第三方插件基本都是通过在img2img、txt2img的主pipeline中添加script的hook节点来起作用,以adetailer为例:
首先scripts/adetailer中核心类AfterDetailerScript继承自scripts.Script,包含了上述before_process/process等节点,主要还是调用了图生图接口去做处理的。文章来源:https://uudwc.com/A/xG5zm
p.scripts.postprocess_image(p,pp) ->
is_processed |= self._postprocess_image_inner(p,pp...)->
- i2i = self.get_i2i_p(p,args,pp.image) ->
-- i2i = StableDiffusionProcessingImg2Img()->
- ad_prompts,ad_negative = self.get_prompt(p,args) ->
- ad_model = self.get_ad_model(args.sd_model) ->
- pred = predictor(ad_model,pp.image,...) ->
- masks = self.pred_preprocessing(pred,args) ->
- p2 = copy(i2i) ->
- for j in range(len(masks)):
p2.image_mask = masks[j]
self.i2i_prompts_replace(p2,ad_prompts,ad_negatives,j)
processed = process_images(p2)
-- p.scripts.before_process(p)
-- res = process_images_inner(p)
pp.image = processed.image[0]
文章来源地址https://uudwc.com/A/xG5zm