# # ControlNet v1.1 Preprocessors Standalone | Space # Sebastian Kay 2024 # # https://huggingface.co/spaces/Sebastiankay/controlnet-preprocessors-only # import gradio as gr import cv2 import numpy as np from annotator.util import resize_image, HWC3 DESCRIPTION = "# " DESCRIPTION += "# ControlNet v1.1 Preprocessors Standalone" DESCRIPTION += "\n
Generate Control Images for Stable Diffusion and other apps that uses ControlNet.
" model_canny = None def canny(img, res, l, h): img = resize_image(HWC3(img), res) global model_canny if model_canny is None: from annotator.canny import CannyDetector model_canny = CannyDetector() result = model_canny(img, l, h) return [result] model_hed = None def hed(img, res): img = resize_image(HWC3(img), res) global model_hed if model_hed is None: from annotator.hed import HEDdetector model_hed = HEDdetector() result = model_hed(img) return [result] model_pidi = None def pidi(img, res): img = resize_image(HWC3(img), res) global model_pidi if model_pidi is None: from annotator.pidinet import PidiNetDetector model_pidi = PidiNetDetector() result = model_pidi(img) return [result] model_mlsd = None def mlsd(img, res, thr_v, thr_d): img = resize_image(HWC3(img), res) global model_mlsd if model_mlsd is None: from annotator.mlsd import MLSDdetector model_mlsd = MLSDdetector() result = model_mlsd(img, thr_v, thr_d) return [result] model_midas = None def midas(img, res): img = resize_image(HWC3(img), res) global model_midas if model_midas is None: from annotator.midas import MidasDetector model_midas = MidasDetector() result = model_midas(img) return [result] model_zoe = None def zoe(img, res): img = resize_image(HWC3(img), res) global model_zoe if model_zoe is None: from annotator.zoe import ZoeDetector model_zoe = ZoeDetector() result = model_zoe(img) return [result] model_normalbae = None def normalbae(img, res): img = resize_image(HWC3(img), res) global model_normalbae if model_normalbae is None: from annotator.normalbae import NormalBaeDetector model_normalbae = NormalBaeDetector() result = model_normalbae(img) return [result] model_dwpose = None def dwpose(img, res): img = resize_image(HWC3(img), res) global model_dwpose if model_dwpose is None: from annotator.dwpose import DWposeDetector model_dwpose = DWposeDetector() result = model_dwpose(img) return [result] model_openpose = None def openpose(img, res, hand_and_face): img = resize_image(HWC3(img), res) global model_openpose if model_openpose is None: from annotator.openpose import OpenposeDetector model_openpose = OpenposeDetector() result = model_openpose(img, hand_and_face) return [result] model_uniformer = None # def uniformer(img, res): # img = resize_image(HWC3(img), res) # global model_uniformer # if model_uniformer is None: # from annotator.uniformer import UniformerDetector # model_uniformer = UniformerDetector() # result = model_uniformer(img) # return [result] ## FUNCTION LINEART model_lineart_anime = None model_lineart = None def lineart(img, res, preprocessor_name="Lineart", invert=True): img = resize_image(HWC3(img), res) ["Lineart", "Lineart Coarse", "Lineart Anime"] if preprocessor_name in ["Lineart", "Lineart Coarse"]: coarse = "Coarse" in preprocessor_name global model_lineart if model_lineart is None: from annotator.lineart import LineartDetector model_lineart = LineartDetector() # result = model_lineart(img, coarse) if invert: result = cv2.bitwise_not(model_lineart(img, coarse)) else: result = model_lineart(img, coarse) return [result] elif preprocessor_name == "Lineart Anime": global model_lineart_anime if model_lineart_anime is None: from annotator.lineart_anime import LineartAnimeDetector model_lineart_anime = LineartAnimeDetector() # result = model_lineart_anime(img) if invert: result = cv2.bitwise_not(model_lineart_anime(img)) else: result = model_lineart_anime(img) return [result] model_oneformer_coco = None def oneformer_coco(img, res): img = resize_image(HWC3(img), res) global model_oneformer_coco if model_oneformer_coco is None: from annotator.oneformer import OneformerCOCODetector model_oneformer_coco = OneformerCOCODetector() result = model_oneformer_coco(img) return [result] model_oneformer_ade20k = None def oneformer_ade20k(img, res): img = resize_image(HWC3(img), res) global model_oneformer_ade20k if model_oneformer_ade20k is None: from annotator.oneformer import OneformerADE20kDetector model_oneformer_ade20k = OneformerADE20kDetector() result = model_oneformer_ade20k(img) return [result] model_content_shuffler = None def content_shuffler(img, res): img = resize_image(HWC3(img), res) global model_content_shuffler if model_content_shuffler is None: from annotator.shuffle import ContentShuffleDetector model_content_shuffler = ContentShuffleDetector() result = model_content_shuffler(img) return [result] model_color_shuffler = None def color_shuffler(img, res): img = resize_image(HWC3(img), res) global model_color_shuffler if model_color_shuffler is None: from annotator.shuffle import ColorShuffleDetector model_color_shuffler = ColorShuffleDetector() result = model_color_shuffler(img) return [result] model_inpaint = None def inpaint(image, invert): # color = HWC3(image["image"]) color = HWC3(image["background"]) if invert: # alpha = image["mask"][:, :, 0:1] alpha = image["layers"][0][:, :, 3:] else: # alpha = 255 - image["mask"][:, :, 0:1] alpha = 255 - image["layers"][0][:, :, 3:] result = np.concatenate([color, alpha], axis=2) return [result] theme = gr.themes.Soft( primary_hue="emerald", # neutral_hue=gr.themes.Color(c100="#fce7f3", c200="#fbcfe8", c300="#f9a8d4", c400="#f472b6", c50="#fdf2f8", c500="#9b3b6b", c600="#7f2f53", c700="#641b3a", c800="#5d1431", c900="#361120", c950="#2b0d19"), radius_size="sm", ) js = """ const tabNav = document.querySelector('.tab-nav'); tabNav.addEventListener('wheel', (event) => { event.preventDefault(); const scrollLeft = tabNav.scrollLeft + event.deltaY; tabNav.scrollLeft = Math.max(0, Math.min(scrollLeft, tabNav.scrollWidth - tabNav.clientWidth)); }); tabNav.addEventListener('mouseover', () => { tabNav.addEventListener('wheel', (event) => { event.preventDefault(); const scrollLeft = tabNav.scrollLeft + event.deltaY; tabNav.scrollLeft = Math.max(0, Math.min(scrollLeft, tabNav.scrollWidth - tabNav.clientWidth)); }); }); tabNav.addEventListener('mouseout', () => { tabNav.removeEventListener('wheel', (event) => { event.preventDefault(); const scrollLeft = tabNav.scrollLeft + event.deltaY; tabNav.scrollLeft = Math.max(0, Math.min(scrollLeft, tabNav.scrollWidth - tabNav.clientWidth)); }); }); """ css = """ body > gradio-app { background: var(--primary-950); background: linear-gradient(180deg, color-mix(in srgb, var(--primary-950), transparent 50%) 0%, color-mix(in srgb, var(--primary-950), transparent 50%) 28%, var(--neutral-950) 28%, var(--neutral-950) 100%) !important; padding-top: 120px; } div.tabs > div.tab-nav { border-bottom: none; !important; padding: 0 0.25rem 0 0.25rem !important; flex-wrap: nowrap; overflow-x: scroll; overflow-y:hidden; } div.tabs > div.tab-nav > button.selected { border-width: 0 !important; background: var(--primary-600) !important; color: var(--neutral-950); font-weight: 600; } div.tabs > div.tab-nav > button { min-width: 130px !important; } div.tabs div.tabitem { background-color: var(--neutral-900) !important; border-top: 8px solid var(--primary-600) !important; border-radius: var(--container-radius) !important; } .top-description h1 { color: var(--neutral-400); font-size: 2rem; } """ with gr.Blocks(theme=theme, css=css) as demo: gr.Markdown(DESCRIPTION, elem_classes="top-description") with gr.Tab("Canny Edge"): with gr.Row(): gr.Markdown("## Canny Edge") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) low_threshold = gr.Slider(label="low_threshold", minimum=1, maximum=255, value=100, step=1) high_threshold = gr.Slider(label="high_threshold", minimum=1, maximum=255, value=200, step=1) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=canny, inputs=[input_image, resolution, low_threshold, high_threshold], outputs=[gallery]) with gr.Tab("HED Edge"): with gr.Row(): gr.Markdown("## HED Edge "SoftEdge"") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=hed, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("Pidi Edge"): with gr.Row(): gr.Markdown("## Pidi Edge "SoftEdge"") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=pidi, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("MLSD Edge"): with gr.Row(): gr.Markdown("## MLSD Edge") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) value_threshold = gr.Slider(label="value_threshold", minimum=0.01, maximum=2.0, value=0.1, step=0.01) distance_threshold = gr.Slider(label="distance_threshold", minimum=0.01, maximum=20.0, value=0.1, step=0.01) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=384, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=mlsd, inputs=[input_image, resolution, value_threshold, distance_threshold], outputs=[gallery]) with gr.Tab("MIDAS Depth"): with gr.Row(): gr.Markdown("## MIDAS Depth") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=384, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=midas, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("ZOE Depth"): with gr.Row(): gr.Markdown("## Zoe Depth") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=zoe, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("Normal Bae"): with gr.Row(): gr.Markdown("## Normal Bae") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=normalbae, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("DWPose"): with gr.Row(): gr.Markdown("## DWPose") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=dwpose, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("Openpose"): with gr.Row(): gr.Markdown("## Openpose") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) hand_and_face = gr.Checkbox(label="Hand and Face", value=False) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=openpose, inputs=[input_image, resolution, hand_and_face], outputs=[gallery]) ## TAB LINEART with gr.Tab("Lineart"): with gr.Row(): gr.Markdown("## Lineart \nCheck Invert to use with Mochi Diffusion. Inverted image can also be created here for use with ControlNet Scribble.") with gr.Row(): with gr.Column(): preprocessor_name = gr.Radio(label="Preprocessor", choices=["Lineart", "Lineart Coarse", "Lineart Anime"], type="value", value="Lineart") input_image = gr.Image(label="Input Image", type="numpy", height=512) invert = gr.Checkbox(label="Invert", value=True) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Lineart") with gr.Column(): gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") def update_button_label(preprocessor_name): if preprocessor_name == "Lineart": return "Lineart" elif preprocessor_name == "Lineart Coarse": return "Lineart Coarse" elif preprocessor_name == "Lineart Anime": return "Lineart Anime" preprocessor_name.change(fn=update_button_label, inputs=[preprocessor_name], outputs=[run_button]) run_button.click(fn=lineart, inputs=[input_image, resolution, preprocessor_name, invert], outputs=[gallery]) with gr.Tab("InPaint"): with gr.Row(): gr.Markdown("## InPaint") with gr.Row(): with gr.Column(): input_image = gr.ImageMask(sources="upload", type="numpy", height="auto") invert = gr.Checkbox(label="Invert Mask", value=False) run_button = gr.Button("Run") with gr.Column(): gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=inpaint, inputs=[input_image, invert], outputs=[gallery]) # with gr.Row(): # gr.Markdown("## Uniformer Segmentation") # with gr.Row(): # with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") # resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) # run_button = gr.Button(label="Run") # with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") # run_button.click(fn=uniformer, inputs=[input_image, resolution], outputs=[gallery]) # with gr.Row(): # gr.Markdown("## Oneformer COCO Segmentation") # with gr.Row(): # with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") # input_image = gr.Image(label="Input Image", type="numpy", height=512) # resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) # run_button = gr.Button("Run") # run_button = gr.Button(label="Run") # with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") # gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") # run_button.click(fn=oneformer_coco, inputs=[input_image, resolution], outputs=[gallery]) # with gr.Row(): # gr.Markdown("## Oneformer ADE20K Segmentation") # with gr.Row(): # with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") # input_image = gr.Image(label="Input Image", type="numpy", height=512) # resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=640, step=64) # run_button = gr.Button("Run") # run_button = gr.Button(label="Run") # with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") # gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") # run_button.click(fn=oneformer_ade20k, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("Content Shuffle"): with gr.Row(): gr.Markdown("## Content Shuffle") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=content_shuffler, inputs=[input_image, resolution], outputs=[gallery]) with gr.Tab("Color Shuffle"): with gr.Row(): gr.Markdown("## Color Shuffle") with gr.Row(): with gr.Column(): # input_image = gr.Image(source='upload', type="numpy") input_image = gr.Image(label="Input Image", type="numpy", height=512) resolution = gr.Slider(label="resolution", minimum=256, maximum=1024, value=512, step=64) run_button = gr.Button("Run") # run_button = gr.Button(label="Run") with gr.Column(): # gallery = gr.Gallery(label="Generated images", show_label=False).style(height="auto") gallery = gr.Gallery(label="Generated images", show_label=False, height="auto") run_button.click(fn=color_shuffler, inputs=[input_image, resolution], outputs=[gallery]) demo.launch()