Stable Diffusion 插件开发基础讲解

这篇具有很好参考价值的文章主要介绍了Stable Diffusion 插件开发基础讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

近来Stable diffusion扩散网络大热,跟上时代,简单的文生图,图生图,其实可以满足绝大多数设计师的应用,但是有什么是赛博画手无法做到的呢?
那就是他们使用到的stable diffusion的插件开发,他们并不清楚stable diffusino的代码结构,如果遇到一些代码层面的报错问题,他们将无法简单解决。
我们想要开发出我想要的stable diffusion插件。那么我们首先要去学习一些gradio的基础知识。
Gradio接口文档
1.想要了解stable diffusion的插件的形式,插件基本都是放在extension文件夹里面。
启动器提供通过git下载对应的内容。
其实就是通过直接copy github里面的代码来实现插件的。

2.以一个简单ffmpeg嵌入倒放视频的功能为例吧

启动的时候需要安装一些库,需要准备install.py文件会自动运行代码

import launch
if not launch.is_installed("ffmpeg-python"):
    launch.run_pip("install ffmpeg-python", "requirements for TemporalKit extension")

if not launch.is_installed("moviepy"):
    launch.run_pip("install moviepy", "requirements for TemporalKit extension")
    
if not launch.is_installed("imageio_ffmpeg"):
    launch.run_pip("install imageio_ffmpeg", "requirements for TemporalKit extension")

requirement.txt最好也准备一些你需要的库

ffmpeg-python
moviepy

3.一个启动简单的启动代码,看不懂的可以看注释,这个例子简单包含按钮,滑动条,视频展示等容器。如果需要查看更多的容器,需要去看gradio api

import gradio as gr
from modules import scripts, script_callbacks
import os
import ffmpeg

# base_dir = scripts.basedir()

#ffmpeg倒放命令
def convert_video(input_file: str, output_directory: str, speed: int, reverse: bool):
  #ffmpeg -i G:\1\c6cfb2d13929eb4967417e0bd81c314c.mp4 -vf reverse -y reverse.mp4
  fileName = os.path.basename(input_file)
  outputFile = os.path.join(output_directory, fileName)
  ffm = ffmpeg.input(input_file)
  if speed != 1 :
    ffm = ffm.filter('setpts', f'PTS/{speed}')

  if reverse :
    ffm = ffm.filter("reverse")

  ffm.output(outputFile).run()
  return outputFile

def on_ui_tabs():
  with gr.Blocks(analytics_enabled=False) as ffmpeg_kit_ui:
    with gr.Row():
      with gr.Column(variant="panel"):
        with gr.Column():
          video_file = gr.Textbox(
            label="Video File",
            placeholder="Wrire your video file address",
            value="",
            interactive=True,
          )
          org_video = gr.Video(
            interactive=True, mirror_webcam=False
          )
          def fn_upload_org_video(video):
            return video
          org_video.upload(fn_upload_org_video, org_video, video_file)
          gr.HTML(value="<p style='margin-bottom: 1.2em'>\
            If you have trouble entering the video path manually, you can also use drag and drop.For large videos, please enter the path manually. \
          </p>")
        with gr.Column():
          output_directory = gr.Textbox(
            label="Video Output Directory",
            placeholder="Directory containing your output files",
            value="",
            interactive=True,
          )
        with gr.Column():
          with gr.Row():
            speed_slider = gr.Slider(
              label="Video Speed",
              minimum=0, maximum=8,
              step=0.1,
              value=1
            )
          with gr.Row():
            reverse_checkbox = gr.Checkbox(
              label="Video need reverse",
              value=False
            )
      with gr.Column(variant="panel"):
        with gr.Row():
          convert_video_btn = gr.Button(
            "Convert Video", label="Convert Video", variant="primary"
          )
        with gr.Row():
          dst_video = gr.Video(
            interactive=True, mirror_webcam=False
          )
        #生成按钮
        convert_video_btn.click(
          convert_video,
          inputs=[
            video_file,
            output_directory,
            speed_slider,
            reverse_checkbox
          ],
          outputs=dst_video
        )
        gr.HTML(value="<p>Converts video in a folder</p>")
  #ui布局 扩展模块名 
  return (ffmpeg_kit_ui, "FFmpeg Kit", "ffmpeg_kit_ui"),

#启动的时候,script_callback加载到扩展模块当中
script_callbacks.on_ui_tabs(on_ui_tabs)
print("FFmpeg kit init")

这里只是一个ffmpeg的功能嵌入,并没有包含原来一些文生图,图生图的功能。
4.下一个介绍如何嵌入功能到文生图或者图生图的脚本功能

def title(self):设置脚本的标题,例如设想为“prompt matrix”
def show(self, is_img2img):决定脚本标签是否可以显示,比如如果脚本只想展示在img2img标签中,那便需要在show方法中做判断
def ui(self, is_img2img):ui界面的相关代码,例如“把可变部分放在提示词文本的开头”“为每张图片使用不同随机种子”这些选项的实现。
def run(self, p, angle, hflip, vflip, overwrite):额外的处理流程,例如在这里改变prompt,然后传给下一步。这里p是图片处理器,里面的参数是可以读取ui里面的返回的[]对象

#加载到文生图或者图生图的应用过程当中
class FFmpegKitScript(scripts.Script):
  def __init__(self) -> None:
    super().__init__()
  # 功能块名
  def title(self):
    return "FFmpeg Kit"
  #是否默认显示
  def show(self, is_img2img):
      return scripts.AlwaysVisible
  
  #ui显示
  def ui(self, is_img2img):
    video_file = gr.Textbox(
      label="Video File",
      placeholder="Wrire your video file address",
      value="",
      interactive=True,
    )
    output_directory = gr.Textbox(
      label="Video Output Directory",
      placeholder="Directory containing your output files",
      value="",
      interactive=True,
    )

    generateBtn = gr.Button("Generate", label="Generate", variant="primary")

    generateBtn.click(
      convert_video,
      inputs=[
        video_file,
        output_directory
      ],
      outputs=[]
    )

    return [
      video_file,
      output_directory,
      generateBtn,
    ]
  #运行的时候嵌入运行
  def run(self, video_file, output_directory, generateBtn):
    return

4.添加到设定页面里面
这里需要调用script_callbacks.on_ui_settings方法
shared.opts.add_optioin是添加公共的设置,Shared.OptionsInfo里面是对应的布局,对应都是return对象。
实在不知道怎么写的同学可以参照infinite_zoom这个插件。

vbnet复制代码def on_ui_settings():
    section = ("infinite-zoom", "Infinite Zoom")

    shared.opts.add_option(
        "infzoom_outpath",
        shared.OptionInfo(
            "outputs",
            "Path where to store your infinite video. Default is Outputs",
            gr.Textbox,
            {"interactive": True},
            section=section,    
        ),
    )

    shared.opts.add_option(
        "infzoom_outSUBpath",
        shared.OptionInfo(
            "infinite-zooms",
            "Which subfolder name to be created in the outpath. Default is 'infinite-zooms'",
            gr.Textbox,
            {"interactive": True},
            section=section,
        ),
    )

script_callbacks.on_ui_settings方法
shared.opts.add_optioin是添加公共的设置,Shared.OptionsInfo里面(on_ui_settings)

需要拿出设置里面的数据,可以拿shared.opts.data.get的方法来实现

output_path = shared.opts.data.get("infzoom_outpath", "outputs")

这里简单介绍了,stable diffusion的插件功能的方法,一些深入的定制需要会在接下来的文章中介绍一些深入应用。文章来源地址https://www.toymoban.com/news/detail-654821.html

到了这里,关于Stable Diffusion 插件开发基础讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Stable Diffusion 插件开发经验

    Stable Diffusion近来大热,但是插件开发的资料少之又少。 这里提供一些插件开发的经验,可供参考。 1.替换启动页。 如果你想要在运行Stable Diffusion的基础上想要一些独有的操作,不想要进行裁剪,直接替换启动页面,那么就需要在webui中进行替换 这里modules.ui.create_ui就是原来

    2024年02月10日
    浏览(37)
  • 【鸿蒙应用ArkTS开发系列】- Web组件使用讲解

    目录 一、Web组件介绍 二、创建组件 权限列表 三、设置样式和属性 四、添加事件和方法 五、访问本地Html 1、本地html文件创建 2、本地html文件加载 2、JS对象注入,Html使用JS对象调用客户端方法 3、客户端调用本地Html网页中的JS方法 使用鸿蒙的ArkUI框架开发鸿蒙应用的时候,官

    2024年02月07日
    浏览(39)
  • GPT应用开发:编写插件获取实时天气信息

    欢迎阅读本系列文章!我将带你一起探索如何利用OpenAI API开发GPT应用。无论你是编程新手还是资深开发者,都能在这里获得灵感和收获。 本文,我们将继续展示聊天API中插件的使用方法,让你能够轻松驾驭这个强大的工具。 首先给大家展示下插件的运行效果,如下图所示:

    2024年01月20日
    浏览(37)
  • CMake+QT+大漠插件的桌面应用开发

    在CMake+大漠插件的应用开发——处理dm.dll,免注册调用大漠插件中已经说明了如何免注册调用大漠插件,以及做了几个简单的功能调用(查找窗口、截图) 下面来利用 QT 和 大漠插件 做一个简单的窗口查找、截图的桌面工具应用,功能点如下 点击“注册”选项完成大漠插件

    2024年01月19日
    浏览(42)
  • 【鸿蒙应用ArkTS开发系列】- 导航栏Tab组件使用讲解

    现在市场上的大部分应用,主页都是才用底部导航栏菜单作为页面主体框架来展示, 在鸿蒙中是使用Tabs组件实现,下面我们开始讲解Tab组件的使用。 Tabs是一个通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图,它仅可包含子组件TabContent,同时搭配 TabsCo

    2024年01月16日
    浏览(90)
  • CMake+QT+大漠插件的桌面应用开发(QThread)

    在CMake+QT+大漠插件的桌面应用开发中已经给出了 QT 配合 大漠插件 开发桌面应用的样例 不过由于主窗口的UI操作和大漠的调用是在一个线程里面的,所以当大漠调用时间过长时会出现UI界面卡顿的现象 我们可以利用子线程处理耗时操作,处理完后再由主线程(UI线程)更新界

    2024年01月18日
    浏览(26)
  • Flutter开发笔记 —— sqflite插件数据库应用

    今天在观阅掘金大佬文章的时候,了解到了该 sqflite 插件,结合官网教程和自己实践,由此总结出该文,希望对大家的学习有帮助! Flutter的 SQLite 插件。支持 iOS、Android 和 MacOS。 支持事务和batch模式 打开时自动进行版本管理 插入/查询/更新/删除查询的助手 iOS 和 Android 上的

    2024年02月04日
    浏览(47)
  • 高通平台开发系列讲解(USB篇)adb应用adbd分析

    沉淀、分享、成长,让自己和他人都能有所收获!😄 在 apps_proc/system/core/adb/adb_main.cpp 文件中main()函数会调用adb_main()函数,然后调用uab_init函数 在uab_init()函数中,会创建一个线程,在线程中会调用init_functionfs()函数,利用ep0控制节点,创建ep1、ep2输入输出节点 目录:

    2024年02月02日
    浏览(25)
  • 【鸿蒙应用ArkTS开发系列】- http网络库使用讲解和封装

    现在网上的应用,基本都是网络应用,需要进行联网获取数据,而常用的联网获取数据的方式有http、socket、websocket等。 在鸿蒙应用、服务中,stage模式开发下,鸿蒙官方为我们提供了一个网络组件库 http ,我们通过 import http from ‘@ohos.net.http’; 即可以完成引用。 @ohos.net.http

    2024年02月15日
    浏览(44)
  • 【大模型应用】小白借助chatgpt开发谷歌插件

    大模型正缓慢地渗透进入我们的生活,尽管目前还没有现象级的产品应用,但它已足以让我痴迷于它,我对它能够提升程序员的生产效率笃定无疑。 本次我用一个下午做了一次尝试,使用大模型帮助我开发一个谷歌插件。开发之前,我对谷歌插件的认识仅限于知道如何安装和

    2024年01月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包