• 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]

  • 相关阅读:
    用R语言实现环境流行病学中的时间序列回归:以2002-2006年伦敦数据集为例
    Python 爬虫正则表达式和re库,及re库的基本使用,提取单个页面信息
    《DevOps实践指南》笔记:第7章
    台式电脑连不上wifi怎么办
    TorchScript学习使用
    实操自动生成接口自动化测试用例
    web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
    三大云商猛裁员!云行业无出路?
    Django 中admin页面的css样式无法加载的终极解决方案
    DevExpress CMB下拉树
  • 原文地址:https://blog.csdn.net/u012193416/article/details/133301859