• stable diffusion webui中的modules/processing模块


    modules/processing.py->process_images()

    1. p.scripts.before_process(p)
    2. sd_models.reload_model_weights()
    3. sd_vae.reload_vae_weights()
    4. res = process_images_inner(p)

    modules/processing.py->process_images_inner()

    1. process_images->process_images_inner()->p:StableDiffusionProcessing
    2. seed = get_fixed_seed(p.seed)
    3. model_hijack.embedding_db.load_textual_inversion_embeddings()
    4. p.scripts.process(p) ->
    5. with torch.no_grad(),p.sd_model.ema_scope():
    6. with devices.autocast():
    7. sd_vae_approx.model()
    8. sd_unet.apply_unet()
    9. for n in range(p.iter):
    10. p.prompts = p.all_prompts
    11. p.negative_prompts = p.all_negative_prompts
    12. p.scripts.before_process_batch(p,batch_number,prompts,seeds) ->
    13. p.parse_extra_network_prompts()
    14. p.scripts.process_batch(p,batch_number,p.prompts,p.seeds,...)
    15. p.setup_conds()
    16. with devices.without_autocast() if devices.unet_needs_upcast else devices.autocast():
    17. samples_ddim = p.sample(conditioning,unconditional_conditioning,prompt...)
    18. x_samples_ddim = [decode_first_stage(p.sd_model,samples_ddim[i:i+1] for i in range(samples_ddim.size(0))]
    19. p.scripts.postprocess_batch(p,x_samples_ddim,batch_number)
    20. for i,x_sample in enumerate(x_sample_ddim):
    21. x_sample = 255*np.moveaxis(x_sample.cpu().numpy(),0,2)
    22. if p.restore_faces:
    23. x_sample = modules.face_restoration.restore_faces(x_sample)
    24. image = Image.formarray(x_sample)
    25. pp = scripts.PostprocessImageArgs(image)
    26. p.scripts.postprocess_image(p,pp)
    27. image = pp.image
    28. p.scripts.postprocess(p,...)

    这个函数和scripts配合就是webui中文生图以及图生图的主pipeline,在processing中调用StableDiffusionProcessingTxt2Img和StableDiffusionProcessingImg2Img就是最核心的2个生图接口。

    1.script在哪里做初始化

    script由scripts.py控制

    1. ScriptRunner->
    2. initialize_scripts在create_ui时初始化
    3. run->
    4. script_index = args[0]
    5. script_args = args[script_args.from:script.args_to]
    6. processed = script.run(p,*script_args)
    7. before_process()
    8. process()
    9. before_process_batch()
    10. process_batch()
    11. postprocess()
    12. postprocess_batch()
    13. postprocess_image()

    2.第三方插件基本都是通过在img2img、txt2img的主pipeline中添加script的hook节点来起作用,以adetailer为例:

    首先scripts/adetailer中核心类AfterDetailerScript继承自scripts.Script,包含了上述before_process/process等节点,主要还是调用了图生图接口去做处理的。

    1. p.scripts.postprocess_image(p,pp) ->
    2. is_processed |= self._postprocess_image_inner(p,pp...)->
    3. - i2i = self.get_i2i_p(p,args,pp.image) ->
    4. -- i2i = StableDiffusionProcessingImg2Img()->
    5. - ad_prompts,ad_negative = self.get_prompt(p,args) ->
    6. - ad_model = self.get_ad_model(args.sd_model) ->
    7. - pred = predictor(ad_model,pp.image,...) ->
    8. - masks = self.pred_preprocessing(pred,args) ->
    9. - p2 = copy(i2i) ->
    10. - for j in range(len(masks)):
    11. p2.image_mask = masks[j]
    12. self.i2i_prompts_replace(p2,ad_prompts,ad_negatives,j)
    13. processed = process_images(p2)
    14. -- p.scripts.before_process(p)
    15. -- res = process_images_inner(p)
    16. pp.image = processed.image[0]

  • 相关阅读:
    HTML 基础
    大型网站技术架构 | 信息加密技术及密匙安全管理
    设计模式-代理模式
    Are you sure you want to continue connecting (yes/no) 每次ssh进
    How to capture Microsoft logs IE Activex issue
    leetcode: 49. 字母异位词分组
    20240419金融读报:加大绿色债券支持绿色金融&货币政策仍有空间&人民银行对金融服务实体理解摘抄
    IDEA XML文件里写SQL比较大小条件
    Redis 学习笔记
    【Pytorch基础知识】数据的归一化和反归一化
  • 原文地址:https://blog.csdn.net/u012193416/article/details/133301859