# #region Script Pre-processing # # # Test by Francis # import os as OS # # print ( F"{OS.getcwd()=}" ) # import os.path as Pathing # import sys as Environment # # Directory_Current = Pathing.dirname ( Pathing.abspath ( __file__ ) ) # Directory_Project = Pathing.dirname(Pathing.dirname ( Directory_Current )) # print ( F"{Directory_Project=}" ) # Environment.path.append ( Directory_Project ) # # #endregion Script Pre-processing #region Import #region System import base64 as Base64 import inspect as Inspect import io as IO import json as JSON import os as OS import os.path as Path from collections import namedtuple as NamedTuple # endregion System # region 3rd Reference # from PIL.Image import Resampling as Resampling import cv2 as Vision import gradio as Framework import numpy as Number import PIL.Image as Imaging # endregion 3rd Reference # region Local Reference import animeinsseg as Anime_Instance_Segmentation import animeinsseg.inpainting as Inpainting # import repaint_person as Style_Editing import utils.io_utils as Utility from anime_3dkenburns.kenburns_effect import KenBurnsPipeline as Pipeline import Web_UI.Common.Constant as Constant #endregion Local Reference #endregion Import #region Definition #region Field # ?叫Sample更合适 Directory_Image_Example=F"examples" List_Method_Inpainting_Fill =\ [ "fill", "original", "latent_noise", "latent_nothing", ] Location_Point=NamedTuple(F"Point",F"Horizon Vertical") # Debug Control Flag IsAllActivatedControlDisplayed=False # Default Variable Sampler_Default = F"DPM++ 2M Karras" Method_Inpainting_Fill_Default = F"original" Detector_Default=F"models/AnimeInstanceSegmentation/rtmdetl_e60.ckpt" Prompt_Foreground_Positive_Default = F"ultra-detailed, ultra high resolution" Prompt_Positive_Default= F"masterpiece, best quality" Prompt_Negative_Default= F"lowres, ((bad anatomy)), ((bad hands)), text, missing finger, extra digits, fewer digits, blurry, ((mutated hands and fingers)), (poorly drawn face), ((mutation)), ((deformed face)), (ugly), ((bad proportions)), ((extra limbs)), extra face, (double head), (extra head), ((extra feet)), monster, logo, cropped, worst quality, low quality, normal quality, jpeg, humpbacked, long body, long neck, ((jpeg artifacts))" Prompt_Background_Negative_Default= F"((person)), character, 1girl, 1boy" Mask_α_Default=0.6 Model_Default=F"control_v11p_sd15s2_lineart_anime [3825e83e]" Directory_Output_Default=F"repaint_output" Progress_Default=F"Display the Progress" # Constant Limit_Instance=10 Granularity_Pixel=32 # !需要使用YAML存储Configuration # Local Debug # Address_Default_Model_Remote = F"http://localhost:7860/sdapi/v1/img2img" # Release in Server # Call from Local Net # Address_Default_Model_Remote = F"http://localhost:8888/sdapi/v1/img2img" # Call from Remote Net Address_Default_Model_Remote = F"http://y.miaomiao.li:6179/sdapi/v1/img2img" Pipeline=Pipeline(F"configs/3dkenburns.yaml") # Global List_Option_Shared_Global = None Instance_Global = None List_Prompt_Foreground_Positive_Global = None List_Mask_Global = None Image_Processing_Global = None # Prompt_Positive_Input_Global = None # Prompt_Negative_Input_Global = None Size_Approximated_Global:Location_Point = None Detector_Global = None #endregion Field #region Method #region Interface # !Pending # !考虑将Instance Row Programmaticalise def Create_Instance_Row (Number_In) : with Framework.Row () : with Framework.Column \ ( min_width = 400 , ) : Title_Instance = F"Instance {Number_In}" Framework.Markdown ( F"#### {Title_Instance}" ) ImageBox_Instances_Output = Framework.Image \ ( label = Title_Instance , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , editable = False , height = F"auto", width = F"auto", ) with Framework.Column () : Title_Prompt_Positive = F"Positive Prompts {Number_In}" Framework.Markdown ( F"#### {Title_Prompt_Positive}" ) TextBox_Prompt_Positive_Input = Framework.Textbox \ ( label = Title_Prompt_Positive , show_label = False , lines = 3 , # As known as Height value = F"" , ) def Create_Style_Editing_Demonstration_Tab(): Title=F"Style Editing" with Framework.Tab(Title): # Framework.Markdown(F"# In-paint Instances of People | Persons (≈ 50 ~ 80 Seconds per Person).") # Positive Text Input Row # Step 0. Choosing Image Framework.Markdown(F"# Step 0. Choose Image") with Framework.Row(): # Input Image + Output Image Row with Framework.Column(): Framework.Markdown ( F"#### Input Image" ) # Framework.Markdown(F"Path to input Image.") ImageBox_Original_Input=Framework.Image \ ( label = F"Input Image-Original" , # type=F"pil", # type = F"numpy" , type = F"filepath" , show_label = False, interactive = True, # editable = False, # minwidth=300, # shape = (None,400), # height = 600, ) with Framework.Column(): List_Example=Framework.Examples\ ( examples=\ [ OS.path.join ( Directory_Image_Example , Carrier_Path_Image ) for Carrier_Path_Image in OS.listdir ( Directory_Image_Example ) ], inputs = \ [ ImageBox_Original_Input, ], examples_per_page = 40, ) # # Button Row # with Framework.Row(): # with Framework.Column(): # Framework.Markdown(F"Re-painting Person **One by One**.") Button_Run_1=Framework.Button\ ( F"Run Style Editing 1", visible = False, ) Framework.Markdown(F"---") # Step 1. Generate Instance Masks Framework.Markdown(F"# Step 1. Generate Instance Masks") with Framework.Row(): with Framework.Column \ ( min_width = 400 , ) : Title_After_Drawing_Instances=F"Instance Masks with Tags" Framework.Markdown(F"#### {Title_After_Drawing_Instances}") ImageBox_Instances_Output = Framework.Image \ ( label = Title_After_Drawing_Instances , show_label = False, # type=F"pil", type = F"numpy" , interactive = False, # editable = False, height = 600, ) with Framework.Column(): Framework.Markdown(F"#### Progress") Label_Progress_Instance_Generating=Framework.Label\ ( value =Progress_Default, # label = F"Progress", label = F"", # show_label = False, ) Framework.Markdown(F"---") Framework.Markdown(F"## Background / General") Title_Prompt_Positive=F"Positive Prompts" Framework.Markdown(F"#### {Title_Prompt_Positive}") TextBox_Prompt_Positive_General_Input=Framework.Textbox\ ( label = Title_Prompt_Positive, show_label = False, lines = 3, # As known as Height value = F"", ) Title_Prompt_Negative=F"Negative Prompts" Framework.Markdown(F"#### {Title_Prompt_Negative}") TextBox_Prompt_Negative_General_Input=Framework.Textbox\ ( label = Title_Prompt_Negative, show_label = False, lines = 5, # As known as Height value = F"", ) # with Framework.Column(): BatchedCheckBox_Option_General_Input=Framework.CheckboxGroup \ ( value =\ [ F"White Background" , F"To Grey", ], show_label = False, visible = False, ) # with Framework.Row(): # with Framework.Column\ # ( # min_width = 100, # ): CheckBox_Instance_PositiveFilm_Input=Create_CheckBox \ ( Name_In = F"Instance in Positive Film" , Value_Default_In = False , # IsVisible_In = False, ) # with Framework.Column\ # ( # min_width = 100, # ): CheckBox_To_Grey_Input=Create_CheckBox \ ( Name_In = F"To Grey" , Value_Default_In = False , ) # # Button Row # with Framework.Row(): # with Framework.Column(): # Framework.Markdown(F"Re-painting Person **One by One**.") Button_Run_2=Framework.Button\ ( F"Generate Instance Masks & Tags", ) Framework.Markdown(F"---") # Step 2. Edit Tags / Prompts in Instance Framework.Markdown(F"# Step 2. Edit Tags / Prompts in Instance") # Button Row with Framework.Row(visible = False): with Framework.Column(): # Framework.Markdown(F"Re-painting Person **One by One**.") Button_Run_3=Framework.Button\ ( F"Run Style Editing 3", ) # Create_Instance_Row() # Row 1 with Framework.Row (visible = True) as Row_Instance_1: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_1 = F"Instance 1" Framework.Markdown ( F"#### {Title_Instance_1}" ) ImageBox_Instances_1_Output = Framework.Image \ ( label = Title_Instance_1 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_1 = F"Positive Prompts of Instance 1" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_1}" ) TextBox_Prompt_Foreground_Positive_1_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_1 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 2 with Framework.Row (visible = False) as Row_Instance_2: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_2 = F"Instance 2" Framework.Markdown ( F"#### {Title_Instance_2}" ) ImageBox_Instances_2_Output = Framework.Image \ ( label = Title_Instance_2 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_2 = F"Positive Prompts of Instance 2" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_2}" ) TextBox_Prompt_Foreground_Positive_2_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_2 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 3 with Framework.Row (visible = False) as Row_Instance_3: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_3 = F"Instance 3" Framework.Markdown ( F"#### {Title_Instance_3}" ) ImageBox_Instances_3_Output = Framework.Image \ ( label = Title_Instance_3 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_3 = F"Positive Prompts of Instance 3" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_3}" ) TextBox_Prompt_Foreground_Positive_3_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_3 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 4 with Framework.Row (visible = False) as Row_Instance_4: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_4 = F"Instance 4" Framework.Markdown ( F"#### {Title_Instance_4}" ) ImageBox_Instances_4_Output = Framework.Image \ ( label = Title_Instance_4 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_4 = F"Positive Prompts of Instance 4" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_4}" ) TextBox_Prompt_Foreground_Positive_4_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_4 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 5 with Framework.Row (visible = False) as Row_Instance_5: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_5 = F"Instance 5" Framework.Markdown ( F"#### {Title_Instance_5}" ) ImageBox_Instances_5_Output = Framework.Image \ ( label = Title_Instance_5 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_5 = F"Positive Prompts of Instance 5" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_5}" ) TextBox_Prompt_Foreground_Positive_5_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_5 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 6 with Framework.Row (visible = False) as Row_Instance_6: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_6 = F"Instance 6" Framework.Markdown ( F"#### {Title_Instance_6}" ) ImageBox_Instances_6_Output = Framework.Image \ ( label = Title_Instance_6 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_6 = F"Positive Prompts of Instance 6" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_6}" ) TextBox_Prompt_Foreground_Positive_6_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_6 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 7 with Framework.Row (visible = False) as Row_Instance_7: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_7 = F"Instance 7" Framework.Markdown ( F"#### {Title_Instance_7}" ) ImageBox_Instances_7_Output = Framework.Image \ ( label = Title_Instance_7 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_7 = F"Positive Prompts of Instance 7" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_7}" ) TextBox_Prompt_Foreground_Positive_7_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_7 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 8 with Framework.Row (visible = False) as Row_Instance_8: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_8 = F"Instance 8" Framework.Markdown ( F"#### {Title_Instance_8}" ) ImageBox_Instances_8_Output = Framework.Image \ ( label = Title_Instance_8 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , height = 600 , ) with Framework.Column () : Title_Prompt_Foreground_Positive_8 = F"Positive Prompts of Instance 8" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_8}" ) TextBox_Prompt_Foreground_Positive_8_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_8 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 9 with Framework.Row (visible = False) as Row_Instance_9: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_9 = F"Instance 9" Framework.Markdown ( F"#### {Title_Instance_9}" ) ImageBox_Instances_9_Output = Framework.Image \ ( label = Title_Instance_9 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , ) with Framework.Column () : Title_Prompt_Foreground_Positive_9 = F"Positive Prompts of Instance 9" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_9}" ) TextBox_Prompt_Foreground_Positive_9_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_9 , show_label = False , lines = 3 , # As known as Height value = F"" , # height = 600 , ) # Row 10 with Framework.Row (visible = False) as Row_Instance_10: with Framework.Column \ ( min_width = 400 , ) : Title_Instance_10 = F"Instance 10" Framework.Markdown ( F"#### {Title_Instance_10}" ) ImageBox_Instances_10_Output = Framework.Image \ ( label = Title_Instance_10 , show_label = False , # type=F"pil", type = F"numpy" , interactive = False , # editable = False , ) with Framework.Column () : Title_Prompt_Foreground_Positive_10 = F"Positive Prompts of Instance 10" Framework.Markdown ( F"#### {Title_Prompt_Foreground_Positive_10}" ) TextBox_Prompt_Foreground_Positive_10_Input = Framework.Textbox \ ( label = Title_Prompt_Foreground_Positive_10 , show_label = False , lines = 3 , # As known as Height value = F"" , ) Framework.Markdown(F"---") # Step 3. Edit Prompts in General Framework.Markdown(F"# Step 3. Edit Prompts in General") with Framework.Row () : with Framework.Column(): Framework.Markdown(F"## General") Title_Prompt_Positive_Input=F"Positive Prompts" Framework.Markdown(F"#### {Title_Prompt_Positive_Input}" ) TextBox_Prompt_Positive_Input=Framework.Textbox\ ( label = Title_Prompt_Positive_Input, show_label = False, lines = 3, # As known as Height # placeholder = F"Positive Prompt here", # placeholder = Prompt_Positive_Default, # value = F"", value = Prompt_Positive_Default, # info = F"Positive Prompt to use, including follows as default: masterpiece, best quality.", # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." ) # Negative Text Input Row # with Framework.Row(): # with Framework.Column(): Title_Prompt_Negative_Input=F"Negative Prompts" Framework.Markdown(F"#### {Title_Prompt_Negative_Input}" ) TextBox_Prompt_Negative_Input=Framework.Textbox\ ( label = Title_Prompt_Negative_Input, show_label = False, lines = 4, # As known as Height # placeholder = F"Negative Prompt here", # placeholder = Prompt_Negative_Default, # value = F"", value = Prompt_Negative_Default, # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." ) with Framework.Column () : Framework.Markdown(F"## Background") Title_Prompt_Background_Negative_Input=F"Negative Prompts" Framework.Markdown(F"#### {Title_Prompt_Background_Negative_Input}" ) TextBox_Prompt_Background_Negative_Input=Framework.Textbox\ ( label = Title_Prompt_Background_Negative_Input, show_label = False, lines = 3, # As known as Height value = Prompt_Background_Negative_Default, # info = F"Background Negative Prompt | Input.", # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." ) Framework.Markdown(F"---") # Step 4. Result Framework.Markdown(F"# Step 4. Result") # Framework.Markdown(F"---") # Background Negative Text Input Row with Framework.Row () : with Framework.Column(): Framework.Markdown(F"#### Progress") # Button Row with Framework.Row(): with Framework.Column(): Label_Progress_Result_Generating=Framework.Label\ ( value =Progress_Default, # label = F"Progress", label = F"", # show_label = False, ) with Framework.Column(): # Framework.Markdown(F"Re-painting Person **One by One**.") Framework.Markdown(F" ") Button_Run_4=Framework.Button\ ( F"{Constant.Character_NewLine}Run Style Editing{Constant.Character_NewLine}", ) # Framework.Markdown(F"---") Framework.Markdown ( F"---" ) # Slider-Size Row with Framework.Row(): with Framework.Column(): Slider_Width_Output_Input = Framework.Slider \ ( value = 768 , # 相当于default minimum = Granularity_Pixel , # !考虑改为Constant maximum = 1_0000 , # !考虑改为Constant step = Granularity_Pixel , # multiselect = True, label = F"Result Image Width" , # info = F"Width of Output Image.", ) with Framework.Column(): Slider_Height_Output_Input=Framework.Slider\ ( value = 768 , # 相当于default minimum = Granularity_Pixel , # !考虑改为Constant maximum = 1_0000 , # !考虑改为Constant step = Granularity_Pixel , # multiselect = True, label = F"Result Image Height" , # info = F"Height of Output Image.", ) Framework.Markdown(F"---") # Example Input Image List Row with Framework.Row(): with Framework.Column(): Title_Image_Input_Original_Contrast=F"Original Input Image as Contrast" Framework.Markdown ( F"#### {Title_Image_Input_Original_Contrast}" ) # !需要需要禁用更改Image功能,仅作为大屏展示|操作 ImageBox_Output_Original_Contrast = Framework.Image \ ( label = Title_Image_Input_Original_Contrast , show_label = False, # type=F"pil", type=F"numpy", interactive = False, # editable = False, height = 600, ) with Framework.Column(): Title_Output=F"Output Image" Framework.Markdown(F"#### {Title_Output}") ImageBox_Output=Framework.Image \ ( label = Title_Output , # type=F"pil", # type = F"numpy" , type = F"filepath" , show_label = False, interactive = False, # editable = False, # minwidth=300, # shape = (None,400), height = 600, ) Framework.Markdown(F"---") # Step 5. Options Framework.Markdown(F"# Step 5. Options") # Processor Address Row with Framework.Row(): with Framework.Column\ ( visible = IsAllActivatedControlDisplayed, ): # !缺少限定词,是什么部分的URL|Remote地址 # !更换为Combo Box更佳 Hover_Processor=F"Image → Image URL." Title_Processor= F"Processor Address" Framework.Markdown\ ( F"#### {Title_Processor}", ) ComboBox_Address_Processor_Input=Framework.Dropdown\ ( choices = List_Processor () , label = Title_Processor, info = Hover_Processor, visible = False, ) TextBox_Address_Processor_Input=Framework.Textbox\ ( label = Title_Processor, show_label = False, lines = 1, # As known as Height value = Address_Default_Model_Remote, # !应该使用对User输入|理解更友好的Control呈现,如:Combo Box info = Hover_Processor, # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." ) with Framework.Column(): # !更换为Combo Box更佳 Hover_Detector=F"Detector Check Point." Title_Detector= F"Detector Check Point" ComboBox_Detector_Input=Framework.Dropdown\ ( choices = List_Detector (), label = Title_Detector, # info = Hover_Detector, visible = False, ) TextBox_Path_CheckPoint_Detector_Input=Framework.Textbox\ ( label = Title_Detector, show_label = True, lines = 1, # As known as Height value = Detector_Default, # info = Hover_Detector, # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." visible = IsAllActivatedControlDisplayed, ) # with Framework.Row(): # with Framework.Column(): TextBox_Directory_Output_Input=Framework.Textbox\ ( label = F"Save Directory", show_label = True, lines = 1, # As known as Height value = Directory_Output_Default, # !应该使用对User输入|理解更友好的Control呈现,如:Combo Box # info = F"Image → Image URL.", # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." visible = IsAllActivatedControlDisplayed, ) # Check Box + Button Row with Framework.Row(visible = IsAllActivatedControlDisplayed): with Framework.Column(): Framework.Markdown(F"Re-painting Person **One by One**.") CheckBox_One_By_One_Input=Create_CheckBox \ ( Name_In = F"One by One" , Value_Default_In = True , ) with Framework.Column(): Framework.Markdown(F"Verbose intermediate Images | Results or not.") CheckBox_Intermediate_Save_Input=Create_CheckBox \ ( Name_In = F"Save Intermediate Image | Result" , Value_Default_In = True , ) # Temporary Output Image Row with Framework.Row\ ( visible = IsAllActivatedControlDisplayed, ) : with Framework.Column () : Framework.Markdown\ ( F"Final Result | Image.", visible = False, ) BatchedImageBox_Positive_Film_Output = Create_Output_BatchedImageBox \ ( Name_In = F"Result-Positive Film", ) with Framework.Column () : Framework.Markdown\ ( F"Final Result | Image.", visible = False, ) BatchedImageBox_Mask_Output = Create_Output_BatchedImageBox \ ( Name_In = F"Result-Mask", ) # Slider-Size Row with Framework.Row(): # !位置待定,是Intermediate | Temporary Result with Framework.Column(visible = IsAllActivatedControlDisplayed): Framework.Markdown\ ( F"Result | Image in Temporary | Intermediate.", ) ImageBox_Imediate_Output = Framework.Image \ ( label = F"Output Image-Temporary | Intermediate" , # type=F"pil", type = F"numpy" , # type = F"filepath" , ) # Controls Et Cetera Row # with Framework.Row(): with Framework.Column(): # ?就是Sampling Step Slider_Step_Input=Framework.Slider\ ( value = 24 , # 相当于default minimum = 1 , # !考虑改为Constant maximum = 150 , # !考虑改为Constant step = 1 , # multiselect = True, label = F"Step" , info = F"Number of Stable Diffusion Steps.", ) with Framework.Column(): Slider_Scale_ClassifierFreeGuidance_Input=Framework.Slider\ ( value = 9 , # 相当于default minimum = 1 , # !考虑改为Constant maximum = 30 , # !考虑改为Constant step = 1 , # multiselect = True, label = F"Classifier Free Guidance Scale" , info = F"Scale of Classifier Free Guidance, id est how strongly the Image should conform to prompt.", ) with Framework.Column(): # !更换为Combo Box更佳,但根据SD WebUI的入参显示,这是Customised Script的Argument Hover_Sampler=F"Name of Samplers to use." ComboBox_Sampler_Input=Framework.Dropdown\ ( choices = List_Sampler (), # value = # !需要找到设置默认值的方法 label = F"Sampler:", value =Sampler_Default, # !考虑Programme化 info = Hover_Sampler, visible = True, ) TextBox_Sampler_Input=Framework.Text\ ( label = F"Sampler:", show_label = True, lines = 1, # As known as Height value = Sampler_Default, info = Hover_Sampler, visible = False, # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." ) with Framework.Column(): ComboBox_Method_Filling_Input=Framework.Dropdown\ ( choices = List_Filling_Method (), value = Method_Inpainting_Fill_Default, # !考虑Programme化 label = F"Filling Method:", info = F"The Filling Method to use for In-painting.", ) with Framework.Column\ ( visible = IsAllActivatedControlDisplayed , ): TextBox_Path_Configuration_Input=Framework.Textbox\ ( label = F"Configuration", show_label = True, lines = 1, # As known as Height value = F"", info = F"Re-paint Configuration Path.", # 设置上限+当前字符量额统计、限制 # Debug # value = F"Bill Gates rides on a horse." ) with Framework.Column(): CheckBox_Resolution_Full_Inpainting_Input=Create_CheckBox \ ( Name_In = F"In-painting Full Resolution" , Value_Default_In = True , ) with Framework.Column(): CheckBox_Infer_Tagger_Input=Create_CheckBox \ ( Name_In = F"Infer Tagger" , Value_Default_In = True , ) with Framework.Column(): Slider_Strength_Denoising_Input=Framework.Slider\ ( value = 0.75 , # 相当于default minimum = 0 , # !考虑改为Constant maximum = 1 , # !考虑改为Constant step = 0.01 , # multiselect = True, label = F"Denoising Strength" , info = F"How much to disregard Original Image.", ) with Framework.Column(): Slider_Blur_Mask_Input=Framework.Slider\ ( value = 4 , # 相当于default minimum = 0 , # !考虑改为Constant maximum = 64 , # !考虑改为Constant step = 1 , # multiselect = True, label = F"Mask Blur" , info = F"Blur Radius of Gaussian Filter to apply Mask.", ) with Framework.Column(): Slider_Resolution_Inpainting_Input=Framework.Slider\ ( value = 640 , # 相当于default minimum = 1 , # !考虑改为Constant maximum = 1_0000 , # !考虑改为Constant step = 1 , # multiselect = True, label = F"In-painting Resolution" , # info = F"In-painting Resolution.", ) with Framework.Column(): Slider_Padding_Resolution_Full_Inpainting_Input=Framework.Slider\ ( value = 32 , # 相当于default minimum = 1 , # !考虑改为Constant maximum = 256 , # !考虑改为Constant step = 1 , # multiselect = True, label = F"In-painting Full Resolution Padding" , # info = F"In-painting Full Resolution Padding.", ) # Bind Event Handler Button_Run_2.click\ ( fn=DoOnButton_Run_2Clicking, inputs = \ [ ImageBox_Original_Input, CheckBox_One_By_One_Input, # TextBox_Prompt_Positive_Input, # TextBox_Prompt_Negative_Input, # Slider_Width_Output_Input, # Slider_Height_Output_Input, Slider_Step_Input, Slider_Scale_ClassifierFreeGuidance_Input, # ComboBox_Sampler_Input, # TextBox_Sampler_Input, # Slider_Strength_Denoising_Input, ComboBox_Method_Filling_Input, # Slider_Blur_Mask_Input, Slider_Resolution_Inpainting_Input, TextBox_Directory_Output_Input, # # ComboBox_Address_Processor_Input, TextBox_Address_Processor_Input, # TextBox_Path_Configuration_Input, # TextBox_Prompt_Background_Negative_Input, # CheckBox_Resolution_Full_Inpainting_Input, # Slider_Padding_Resolution_Full_Inpainting_Input, # # ComboBox_Detector_Input, TextBox_Path_CheckPoint_Detector_Input, # CheckBox_Intermediate_Save_Input, # CheckBox_Infer_Tagger_Input, CheckBox_To_Grey_Input, CheckBox_Instance_PositiveFilm_Input, ] , outputs = \ [ Label_Progress_Instance_Generating, # # Step 1. ImageBox_Instances_Output, TextBox_Prompt_Positive_General_Input, TextBox_Prompt_Negative_General_Input, # # Step 2. ImageBox_Instances_1_Output, ImageBox_Instances_2_Output, ImageBox_Instances_3_Output, ImageBox_Instances_4_Output, ImageBox_Instances_5_Output, ImageBox_Instances_6_Output, ImageBox_Instances_7_Output, ImageBox_Instances_8_Output, ImageBox_Instances_9_Output, ImageBox_Instances_10_Output, # TextBox_Prompt_Foreground_Positive_1_Input , TextBox_Prompt_Foreground_Positive_2_Input , TextBox_Prompt_Foreground_Positive_3_Input , TextBox_Prompt_Foreground_Positive_4_Input , TextBox_Prompt_Foreground_Positive_5_Input , TextBox_Prompt_Foreground_Positive_6_Input , TextBox_Prompt_Foreground_Positive_7_Input , TextBox_Prompt_Foreground_Positive_8_Input , TextBox_Prompt_Foreground_Positive_9_Input , TextBox_Prompt_Foreground_Positive_10_Input , # # Row_Instance_1, Row_Instance_2, Row_Instance_3, Row_Instance_4, Row_Instance_5, Row_Instance_6, Row_Instance_7, Row_Instance_8, Row_Instance_9, Row_Instance_10, ] , ) Button_Run_4.click\ ( fn=DoOnButton_Run_4Clicking, inputs = \ [ ComboBox_Method_Filling_Input, TextBox_Address_Processor_Input, Slider_Blur_Mask_Input, CheckBox_Resolution_Full_Inpainting_Input, Slider_Padding_Resolution_Full_Inpainting_Input, # CheckBox_Instance_PositiveFilm_Input, TextBox_Prompt_Positive_Input, TextBox_Prompt_Negative_Input, TextBox_Prompt_Background_Negative_Input, CheckBox_One_By_One_Input, CheckBox_Intermediate_Save_Input, # [ TextBox_Prompt_Foreground_Positive_1_Input, TextBox_Prompt_Foreground_Positive_2_Input, TextBox_Prompt_Foreground_Positive_3_Input, TextBox_Prompt_Foreground_Positive_4_Input, TextBox_Prompt_Foreground_Positive_5_Input, TextBox_Prompt_Foreground_Positive_6_Input, TextBox_Prompt_Foreground_Positive_7_Input, TextBox_Prompt_Foreground_Positive_8_Input, TextBox_Prompt_Foreground_Positive_9_Input, TextBox_Prompt_Foreground_Positive_10_Input, # ], # # ImageBox_Original_Input, # # Slider_Width_Output_Input, # Slider_Height_Output_Input, # Slider_Step_Input, # Slider_Scale_ClassifierFreeGuidance_Input, # # # ComboBox_Sampler_Input, # # TextBox_Sampler_Input, # # # Slider_Strength_Denoising_Input, # ComboBox_Method_Filling_Input, # Slider_Blur_Mask_Input, # Slider_Resolution_Inpainting_Input, # TextBox_Directory_Output_Input, # # # # ComboBox_Address_Processor_Input, # TextBox_Address_Processor_Input, # # # TextBox_Path_Configuration_Input, # CheckBox_Resolution_Full_Inpainting_Input, # Slider_Padding_Resolution_Full_Inpainting_Input, # # # # ComboBox_Detector_Input, # TextBox_Path_CheckPoint_Detector_Input, # # ] , outputs = \ [ Label_Progress_Result_Generating, # # ImageBox_Imediate_Output, BatchedImageBox_Positive_Film_Output, BatchedImageBox_Mask_Output, # # Step 3. ImageBox_Output, ] , ) ImageBox_Original_Input.change\ ( fn=DoOnImageBox_Input_OriginalChanged, inputs = \ [ ImageBox_Original_Input, ] , outputs = \ [ TextBox_Address_Processor_Input, Label_Progress_Instance_Generating, Label_Progress_Result_Generating, CheckBox_One_By_One_Input, CheckBox_Intermediate_Save_Input, BatchedImageBox_Positive_Film_Output, BatchedImageBox_Mask_Output, TextBox_Prompt_Positive_Input, TextBox_Prompt_Negative_Input, Slider_Width_Output_Input, Slider_Height_Output_Input, ImageBox_Imediate_Output, Slider_Step_Input, Slider_Scale_ClassifierFreeGuidance_Input, ComboBox_Sampler_Input, Slider_Strength_Denoising_Input, ComboBox_Method_Filling_Input, Slider_Blur_Mask_Input, Slider_Resolution_Inpainting_Input, TextBox_Directory_Output_Input, TextBox_Path_Configuration_Input, TextBox_Prompt_Background_Negative_Input, CheckBox_Resolution_Full_Inpainting_Input, Slider_Padding_Resolution_Full_Inpainting_Input, TextBox_Path_CheckPoint_Detector_Input, CheckBox_To_Grey_Input, CheckBox_Infer_Tagger_Input, ImageBox_Output, ImageBox_Output_Original_Contrast, ImageBox_Instances_Output, TextBox_Prompt_Positive_General_Input, TextBox_Prompt_Negative_General_Input, CheckBox_Instance_PositiveFilm_Input, # # ImageBox_Instances_1_Output, ImageBox_Instances_2_Output, ImageBox_Instances_3_Output, ImageBox_Instances_4_Output, ImageBox_Instances_5_Output, ImageBox_Instances_6_Output, ImageBox_Instances_7_Output, ImageBox_Instances_8_Output, ImageBox_Instances_9_Output, ImageBox_Instances_10_Output, # TextBox_Prompt_Foreground_Positive_1_Input, TextBox_Prompt_Foreground_Positive_2_Input, TextBox_Prompt_Foreground_Positive_3_Input, TextBox_Prompt_Foreground_Positive_4_Input, TextBox_Prompt_Foreground_Positive_5_Input, TextBox_Prompt_Foreground_Positive_6_Input, TextBox_Prompt_Foreground_Positive_7_Input, TextBox_Prompt_Foreground_Positive_8_Input, TextBox_Prompt_Foreground_Positive_9_Input, TextBox_Prompt_Foreground_Positive_10_Input, # Row_Instance_1, Row_Instance_2, Row_Instance_3, Row_Instance_4, Row_Instance_5, Row_Instance_6, Row_Instance_7, Row_Instance_8, Row_Instance_9, Row_Instance_10, ] , ) #endregion Interface #region Evnet Handler def DoOnButton_Run_2Clicking\ ( # Image_In:Number.ndarray, # Image_In:Imaging, Path_Image_In:str, IsOneByOneInput_In:bool, # Prompt_Positive_In:str, # Prompt_Negative_In:str, # Width_Output_In:int, # Height_Output_In:int, Step_In:int, Scale_ClassifierFreeGuidance_In:int, # Name_Sampler_In:str, # Strength_Denoising_In:float, Method_Filling_In:str, # Blur_Mask_In:int, Resolution_Inpainting_In:int, Directory_Output_In:str, # Address_Processor_In:str, # Path_Configuration_In:str, # Prompt_Background_Negative_In:str, # IsInpaintingFullResolution_In:bool, # Padding_Resolution_Full_Inpainting_In:int, # Path_Detector_In:str, # IsSavingIntermediateImage_Required_In:bool, # IsInferringTagger_Required_In:bool, IsToGrey_Required_In:bool, IsInstanceDisplayed_Required_In:bool, ) : """ Argument List: Image_In→ImageBox_Original_Input, IsOneByOneInput_In→CheckBox_One_By_One_Input, Prompt_Positive_In→TextBox_Prompt_Positive_Input, Prompt_Negative_In→TextBox_Prompt_Negative_Input, Width_Output_In→Slider_Width_Output_Input, Height_Output_In→Slider_Height_Output_Input, Step_In→Slider_Step_Input, Scale_ClassifierFreeGuidance_In→Slider_Scale_ClassifierFreeGuidance_Input, # Name_Sampler_In→TextBox_Sampler_Input, # Strength_Denoising_In→Slider_Strength_Denoising_Input, Method_Filling_In→ComboBox_Method_Filling_Input, Blur_Mask_In→Slider_Blur_Mask_Input, Resolution_Inpainting_In→Slider_Resolution_Inpainting_Input, Directory_Output_In→TextBox_Directory_Output_Input, # Address_Processor_In→TextBox_Address_Processor_Input, # Path_Configuration_In→TextBox_Path_Configuration_Input, Prompt_Negative_Background_In→TextBox_Prompt_Negative_Background_Input, IsInpaintingFullResolution_In→CheckBox_Resolution_Full_Inpainting_Input, Padding_Resolution_Full_Inpainting_In→Slider_Padding_Resolution_Full_Inpainting_Input, # Path_Detector_In→TextBox_Path_CheckPoint_Detector_Input, # IsSavingIntermediateImage_Required_In→CheckBox_Intermediate_Save_Input, IsInferringTagger_Required_In→CheckBox_Infer_Tagger_Input, IsToGrey_Required_In→CheckBox_To_Grey_Input, IsInstanceDisplayed_Required_In→CheckBox_WhiteBackground_Input, """ if Path.exists ( Path_Configuration_In ) : pass # !Pending:需要确认该Branch设计逻辑|目的 # args = Configuration_Ω.OmegaConf.create ( vars ( args ) ) # args.merge_with ( Configuration_Ω.OmegaConf.load ( args.cfg ) ) # print ( args ) else: pass if not Path.exists ( Directory_Output_In ) : OS.makedirs ( Directory_Output_In ) else: pass Detector = Anime_Instance_Segmentation.AnimeInsSeg ( Path_Detector_In , device = F"cuda" ) Detector.init_tagger () # Processing: Generate Instance List from Image input Image_Intermediate_Array_Return = None List_PositiveFilm_Return = [ ] List_Mask_Return = [ ] List_PositiveFilm_Return = [ ] Prompt_Positive_Return = None Prompt_Negative_Return = None List_Prompt_Foreground_Positive=[] List_Prompt_Character_Positive=[] # !改用Text Box直接输入 # if Prompt_Positive_In : # Prompt_Positive_Input = F"{Prompt_Positive_Default}, {Prompt_Positive_In}" # else: Prompt_Positive_Input=Prompt_Positive_Default # # Prompt_Positive_Input = Prompt_Positive_In # # if Prompt_Negative_In : # Prompt_Negative_Input = F"{Prompt_Negative_Default}, {Prompt_Negative_In}" # else: Prompt_Negative_Input=Prompt_Negative_Default # # Prompt_Negative_Input = Prompt_Negative_In # Debug assert Method_Filling_In in List_Method_Inpainting_Fill , F"Fill method must be one of {List_Method_Inpainting_Fill}." # Processing: 计算长宽比、Image类型(横向|纵向) Limit_Resolution = Resolution_Inpainting_In # Debug print(F"In {Inspect.currentframe().f_code.co_name}()") print(F"{Path_Image_In=}" ) Image_Processing = Imaging.open ( Path_Image_In ) # Name_Image = Path.basename ( Path_Image_In ) Width_Approximated,Height_Approximated=Calculate_Approximate_Size\ ( Size_In=Location_Point\ ( Image_Processing.width, Image_Processing.height, ), Limit_Resolution_In=Limit_Resolution, ) Size_Approximated=Location_Point(Width_Approximated,Height_Approximated) # Debug print(F"{Image_Processing.width=},{Image_Processing.height=}") print(F"Ratio: {Image_Processing.width/Image_Processing.height}") print(F"{Size_Approximated.Horizon=},{Size_Approximated.Vertical=}" ) print(F"Ratio: {Size_Approximated.Horizon / Size_Approximated.Vertical}" ) # !应该设置Ratio的Property,但这就会从Named Tuple转为Class,复杂了 if IsToGrey_Required_In : Image_Processing=Image_Processing\ .convert(F"L")\ .convert(F"RGB") # Contrast→RGB Coloured,增强对比度 else: pass List_Option_Shared =\ { F"width" : Size_Approximated.Horizon , F"height" : Size_Approximated.Vertical , F"steps" : Step_In , F"cfg_scale" : Scale_ClassifierFreeGuidance_In , F"sample_name" : Name_Sampler_In , F"denoising_strength" : Strength_Denoising_In , F"alwayson_scripts" :\ { F"controlnet" :\ { F"args" :\ [ { F"input_image" : F"" , F"module" : F"lineart_anime" , F"model" : Model_Default , F"weight" : 1 , F"resize_mode" : F"Inner Fit (Scale to Fit)" , F"lowvram" : False , F"processor_res" : Limit_Resolution , F"threshold_a" : 64 , F"threshold_b" : 64 , F"guidance" : 1 , F"guidance_start" : 0 , F"guidance_end" : 1 , F"guessmode" : False, F"pixel_perfect": True, }, ], }, } , } Image_Processing = Image_Processing.resize\ ( size = (Size_Approximated.Horizon , Size_Approximated.Vertical) , # !应该可以直接赋值:Named Tuple→Tuple resample = Imaging.Resampling.LANCZOS, ) Instance = Detector.infer\ ( Path_Image_In , output_type = F"numpy", infer_grey = IsToGrey_Required_In, infer_tags = True, ) Instance.remove_duplicated () # Processing: Generate Instances Image_Processing_Array=Number.array(Image_Processing ) Image_Instances_Return = Instance.draw_instances \ ( img=Image_Processing_Array , draw_bbox = True, draw_ins_mask = True, draw_ins_contour = True, # !需要保持None,Empty不行 # draw_indices =\ # [ # # List of indice # ], draw_tags = True , mask_alpha=Mask_α_Default, ) # # Debug # print ( f"{List_Tag_Character=}" ) # print ( f"{List_Tag=}" ) List_Mask = [ ] if not Instance.is_empty : for Carrier_Mask_Array in Instance.masks : Carrier_Mask_Array = Vision.resize\ ( Carrier_Mask_Array.astype ( Number.uint8 ) \ * 255 , (Size_Approximated.Horizon , Size_Approximated.Vertical) , interpolation = Vision.INTER_AREA, ) Carrier_Mask = Imaging.fromarray ( Carrier_Mask_Array ) # Prst-Processing # Processing: Generate Instance in Positive Film or Mask Carrier_Image_Processing_Foreground_Mask_Array = Number.asarray ( Carrier_Mask ) Casrrier_Image_Foreground = Generate_Foreground ( Image_Processing_Array , Carrier_Image_Processing_Foreground_Mask_Array , IsWhiteBackground_In = True ) List_Mask.append ( Carrier_Mask ) List_Mask_Return.append ( Carrier_Mask ) List_PositiveFilm_Return.append(Casrrier_Image_Foreground ) # Processing: Generate Positive Foreground Tag List of per Instance for Carrier_List_Tag_Foreground_Positive in Instance.tags : # List_Tag_Foreground_Positive = F"{Carrier_List_Tag_Foreground_Positive.replace ( F' ' , F',' )}, {Prompt_Positive_Input}" List_Tag_Foreground_Positive = F"{Carrier_List_Tag_Foreground_Positive.replace ( F' ' , F',' )}" List_Prompt_Foreground_Positive.append(List_Tag_Foreground_Positive) # !Character Tag长期没什么用(有时有值,有时无值)|未使用,Positive Foreground | Character | Person | Instance均在.tags Property for Carrier_List_Tag_Character_Positive in Instance.character_tags : # List_Tag_Character_Positive = F"{Carrier_List_Tag_Character_Positive.replace ( F' ' , F',' )}, {Prompt_Positive_Input}" # List_Tag_Character_Positive = F"{Carrier_List_Tag_Character_Positive.replace ( F' ' , F',' )}" List_Prompt_Character_Positive.append(Carrier_List_Tag_Character_Positive) # Post-Processing # Debug print(F"{List_Prompt_Foreground_Positive=}") print(F"{List_Prompt_Character_Positive=}") else: pass # Post-Processing # Global Field Assigning global List_Option_Shared_Global List_Option_Shared_Global=List_Option_Shared global Instance_Global Instance_Global=Instance global List_Prompt_Foreground_Positive_Global List_Prompt_Foreground_Positive_Global=List_Prompt_Foreground_Positive global List_Mask_Global List_Mask_Global=List_Mask global Image_Processing_Global Image_Processing_Global=Image_Processing # global Prompt_Positive_Input_Global # Prompt_Positive_Input_Global=Prompt_Positive_Input # global Prompt_Negative_Input_Global # Prompt_Negative_Input_Global=Prompt_Negative_Input global Size_Approximated_Global Size_Approximated_Global=Size_Approximated global Detector_Global Detector_Global=Detector # Processing: Generate Return List List_Return=\ [ F"Style Editing executed successfully.", # # Step 1. Image_Instances_Return, # # !实际不是Instance Genearting时产生的,只是为了呈现效果而添加的Global Default Prompt_Positive_Default, Prompt_Negative_Default, # # Step 2. ] # Step 2. # Pre-Processing # Debug if len(List_Mask_Return) == len(List_Prompt_Foreground_Positive) == len(List_PositiveFilm_Return): print(F"Instances generated successfully, number is : {len(List_Mask_Return)}") else: print(F"Instances generated unsuccessfully, the number as follows:") print(F"{len(List_Mask_Return)=}") print(F"{len(List_Prompt_Foreground_Positive)=}") print(F"{len(List_PositiveFilm_Return)=}") # Processing: Generate Step 2 Instance List Result if IsInstanceDisplayed_Required_In : List_Return.extend(List_PositiveFilm_Return) # 补齐List到指定数量 Number_Instance = len ( List_PositiveFilm_Return ) else: List_Return.extend(List_Mask_Return) # 补齐List到指定数量 Number_Instance=len(List_Mask_Return) while Number_Instance Size_In.Horizon : # 高度更大的Image:纵向图 Width = Limit_Resolution_In # Height = Approximate_To_Integer ( (Size_In.Vertical / Size_In.Horizon * Limit_Resolution_In) // Granularity_Pixel * Granularity_Pixel ) else : # 宽度更大的Image:横向图 Width = Approximate_To_Integer ( (Size_In.Horizon / Size_In.Vertical * Limit_Resolution_In) // Granularity_Pixel * Granularity_Pixel ) # Height = Limit_Resolution_In return\ [ Width, Height, ] def Generate_Foreground ( Image_Array_In , Image_Mask_Array_In , IsWhiteBackground_In = False ) : Image_Array_Return=None # Pre-Processing: Generate Inversed Mask Image_Mask_Inversed_Array=Vision.bitwise_not(Image_Mask_Array_In ) Image_White_Array= Number.ones_like(Image_Array_In ) * 255 Image_Background_Array=Vision.bitwise_or\ ( Image_White_Array, Image_White_Array, mask = Image_Mask_Inversed_Array, ) # Processing: Generate Black Background + Instance Inpainted Image_Crop_Array=Vision.bitwise_and\ ( Image_Array_In, Image_Array_In, mask = Image_Mask_Array_In, ) Image_Result_Array=Vision.addWeighted\ ( Image_Crop_Array, 1, Image_Background_Array, 1, 0, ) # Post-Processing if IsWhiteBackground_In : Image_Array_Return=Image_Result_Array else: Image_Array_Return = Image_Crop_Array return Image_Array_Return def Generate_Tag_List(Image_In): global Detector_Global if isinstance(Image_In, Imaging.Image): Image_Processing_Array=Number.asarray(Image_In) elif isinstance(Image_In, Number.ndarray): Image_Processing_Array=Image_In else: pass List_Tag_Positive ,List_Tag_Character_Positive = Detector_Global.tagger.label_cv2_bgr \ ( Vision.cvtColor \ ( Image_Processing_Array , Vision.COLOR_BGR2RGB , ) , ) # Debug print(F"{List_Tag_Positive=}") print(F"{List_Tag_Character_Positive=}") # Prompt_Positive_Return = F"{F','.join ( List_Tag_Positive )}" Prompt_Positive_Return = List_Tag_Positive return Prompt_Positive_Return #endregion Utility #endregion Method #endregion Definition