Files
Nlar-ComfyUI_CartoonSegment…/CartoonSegmentation/Web_UI/Component/Component_AIS.py
T

2776 lines
78 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os as OS
import inspect as Inspect
from collections import namedtuple as NamedTuple
import os.path as Pathing
import sys as Environment
import cv2 as Vision
# import trimesh as Meshing
import gradio as Framework
import mmcv as Vision_MM
# from diffusers import StableDiffusionPipeline as Pipeline
import numpy as Number
import torch as Engine
import anime_3dkenburns.kenburns_effect as Anime3D_KenBurns
from anime_3dkenburns.kenburns_effect import KenBurnsPipeline as Pipeline
import Web_UI.Common.Utility_Sampler as Sampler
import Web_UI.Common.Utility_Style as Style
# import Utility_Model as Model
#
# from Web_UI.Common.Utility_Model import Model as Model
from ..Common.Utility_Model import Model as Model
#region Script
# # Debug
# print ( F"{OS.getcwd()=}" )
#endregion Script
# Text → Text Tab
# Field
PlaceHolder_Label_Camera=F"#### Horizon: (Original: ), Vertical: (Original: )"
Pipeline=Pipeline(F"configs/3dkenburns.yaml")
Limit_Minimum=400 # It is better that does not less than 60% of original Width | Height
Limit_Maxmum=4000
Path_List_Sample=F"examples"
# Pipeline=Pipeline()
#
Configuration_AIS = Pipeline.cfg
Device = Pipeline.device
# Global Carrier
Image_Carrier = None
Image_Tensor_Carrier = None
Instance_Carrier = None
Image_Intermediate_Carrier = None
Configuration_Argument_Carrier=None
IsIntermediateResultSaving = False
IsAllActivatedControlDisplayed=False
Ratio_Crop_Camera_Start_Deault=0.6
Ratio_Crop_Camera_End_Deault=0.6
Ratio_Crop_Minimum=0
Ratio_Crop_AutoZoomed=0.97
Mask_α_Default=0.7
Progress_Default=F"Display the Progress"
IsVerbosing_Global=False
Height_Global=None
Width_Global=None
IsStartingCameraSetting_Global=True
Location_Point=NamedTuple(F"Point",F"Horizon Vertical")
Camera_Start_Global=None
Camera_End_Global=None
Ratio_Global=None
Configuration_Global=None
List_Frame_Global=None
Ratio_Resize_Global=None
Page_Global = None
# Common control for multiple tabs
Create_CheckPoint_ComboBox=lambda:Framework.Dropdown\
(
choices = Model.List_CheckPointTile (),
label = F"Stable Diffusion Check-Point",
# elem_id = F"ComboBox_CheckPoint",
)
# Combo Box无法自行完成对File System中的Content的刷新、自行检查,需要手动处理
Create_RelaunchModelList_Button=lambda:Framework.Button\
(
# !考虑改为Icon的Button
F"Relaunch",
# show_label = False,
# lines = 2, # As known as Height
# placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
)
Create_CheckPointLoadingStatus_Label=lambda:Framework.Label\
(
# choices = Model.List_CheckPointTile (),
label = F"Check-Point Loading Status",
value =F"None Model has been loaded." # 相当于default
# show_label = False,
# visible = False,
# elem_id = F"ComboBox_CheckPoint",
)
Create_Main_Textbox=lambda:Framework.Textbox\
(
label = "Prompt | Input",
show_label = False,
lines = 3, # As known as Height
placeholder = "Prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
# 设置上限+当前字符量额统计、限制
# Debug
# value = F"Bill Gates rides on a horse."
)
Create_Negative_TextBox=lambda:Framework.Textbox\
(
label = "Negative prompt | input",
show_label = False,
lines = 2, # As known as Height
placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )", # !Need to be classified
)
Create_Interrupt_Button=lambda:Framework.Button\
(
F"Interrogate CLIP",
# show_label = False,
# lines = 2, # As known as Height
# placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
)
Create_Skip_Button=lambda:Framework.Button\
(
F"Interrogate CLIP",
# show_label = False,
# lines = 2, # As known as Height
# placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
)
Create_Generate_Button=lambda:Framework.Button\
(
F"Generate",
# show_label = False,
# lines = 2, # As known as Height
# placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
variant = "primary",
)
# Pending
Create_Clear_Button=lambda:Framework.Button\
(
F"Clear Prompted | Input",
# show_label = False,
# lines = 2, # As known as Height
# placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
# variant = "primary",
)
Create_Style_ComboBox=lambda:Framework.Dropdown\
(
choices = Style.List_Style () ,
value = [], # 相当于default
multiselect = True,
label = F"Style List",
)
# Control for Image → Image Tab
Create_Normal_Input_ImageBox=lambda:Framework.Image \
(
label = "Image → Image",
)
Create_Sketch_Input_ImageBox=lambda:Framework.Image \
(
label = "Sketch",
)
Create_Inpaint_Input_ImageBox=lambda:Framework.Image \
(
label = "Inpaint",
)
Create_InpaintSketch_Input_ImageBox=lambda:Framework.Image \
(
label = "Inpaint Sketch",
)
Create_InpaintUpload_Input_ImageBox=lambda:Framework.Image \
(
label = "Inpaint Upload",
)
Create_Batch_Input_ImageBox=lambda:Framework.Image \
(
label = "Batch",
)
Create_InterrogateCLIP_Button=lambda:Framework.Button\
(
F"Interrogate CLIP",
# show_label = False,
# lines = 2, # As known as Height
# placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
)
Create_Interrogate_DeepBooru_Button=lambda:Framework.Button\
(
F"Interrogate DeepBooru",
# show_label = False,
# lines = 2, # As known as Height
# placeholder = "Negative prompt | input here (Ctrl | Alt + Enter or Button \"Generate\" to work )",
)
# Pending to check
Create_ResizeMode_RadioGroup=lambda:Framework.Radio\
(
choices =
[
F"Just resize" ,
F"Crop and resize" ,
F"Resize and fill" ,
F"Just resize (Latent up-scale)" ,
],
# value = [], # 相当于default
# multiselect = True,
label = F"Resize mode",
)
Create_MaskBlur_Slider=lambda:Framework.Slider\
(
# choices = Sampler.List_Sampler () ,
value = 4, # 相当于default
minimum = 0,
maximum = 64,
step = 1,
# multiselect = True,
label = F"Mask blur",
)
Create_MaskTransparency=lambda:Framework.Slider\
(
# choices = Sampler.List_Sampler () ,
value = 0, # 相当于default
minimum = 0,
maximum = 100,
step = 1,
# multiselect = True,
label = F"Mask transparency",
)
Create_MaskMode_RadioGroup=lambda:Framework.Radio\
(
choices =
[
F"Inpaint masked",
F"Inpaint \033[1mnot\033[0m masked" , # !Need to be optimised
],
# value = [], # 相当于default
# multiselect = True,
label = F"Mask mode",
)
Create_MaskedContent_RadioGroup=lambda:Framework.Radio\
(
choices =
[
F"Fill",
F"Original",
F"Latent noise",
F"Latent nothing",
],
# value = [], # 相当于default
# multiselect = True,
label = F"Masked content",
)
Create_InpaintArea_RadioGroup=lambda:Framework.Radio\
(
choices =
[
F"Whole picture",
F"Only Masked",
],
# value = [], # 相当于default
# multiselect = True,
label = F"Inpaint area",
)
Create_OnlyMaskedPadding_Pixel_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 32, # 相当于default
minimum = 0,
maximum = 256,
step = 4,
# multiselect = True,
label = F"Only masked padding (Pixel)",
)
Create_Sampler_ComboBox=lambda:Framework.Dropdown\
(
choices = Sampler.List_Sampler () ,
value = [], # 相当于default
# multiselect = True,
label = F"Sampler | Sampling Method",
)
Create_SamplingStep_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 20, # 相当于default
minimum = 1,
maximum = 150,
step = 1,
# multiselect = True,
label = F"Sampling Step",
)
Create_CheckBox_Group=lambda :Framework.CheckboxGroup \
(
choices =
[
F"Restore Face" ,
F"Tiling",
F"High Resolution Fix",
],
value = F"",
)
Create_RestoreFace_CheckBox=lambda:Framework.Checkbox\
(
# choices = Style.List_Style () ,
# value = 20, # 相当于default
# multiselect = True,
label = F"Restore Face",
)
Create_Tiling_CheckBox=lambda:Framework.Checkbox\
(
# choices = Style.List_Style () ,
# value = 20, # 相当于default
# multiselect = True,
label = F"Tiling",
)
Create_HighResolutionFix_CheckBox=lambda:Framework.Checkbox\
(
# choices = Style.List_Style () ,
# value = 20, # 相当于default
# multiselect = True,
label = F"High Resolution Fix",
)
Create_Step_CheckBox=lambda Name_In,Value_Default_In,Tip_In=None,IsVisible_In=True:Framework.Checkbox\
(
# choices = Style.List_Style () ,
# value = 20, # 相当于default
# multiselect = True,
label = Name_In,
value = Value_Default_In,
info = Tip_In,
visible = IsVisible_In,
)
Create_Width_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 512, # 相当于default
minimum = 64,
maximum = 2048,
step = 8,
# multiselect = True,
label = F"Width",
)
Create_Height_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 512, # 相当于default
minimum = 64,
maximum = 2048,
step = 8,
# multiselect = True,
label = F"Height",
)
# Or called Switch
Create_Swap_Button=lambda:Framework.Button\
(
# choices = Style.List_Style () ,
# value = 512, # 相当于default
# multiselect = True,
F"Swap",
)
Create_BatchCount_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 1, # 相当于default
minimum = 1,
# maximum = 2048,
step = 1,
# multiselect = True,
label = F"Batch Count",
)
Create_BatchSize_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 1, # 相当于default
minimum = 1,
maximum = 8,
step = 1,
# multiselect = True,
label = F"Batch Size",
)
Create_CFG_Scale_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 7.0, # 相当于default
minimum = 1.0,
maximum = 30.0,
step = 0.5,
# multiselect = True,
label = F"CFG Scale",
)
Create_DenoisingStrength_Slider=lambda:Framework.Slider\
(
# choices = Style.List_Style () ,
value = 0.75, # 相当于default
minimum = 0,
maximum = 1,
step = 0.01,
# multiselect = True,
label = F"Denoising strength",
)
Create_Seed_TextBox=lambda:Framework.Textbox\
(
# choices = Style.List_Style () ,
value = F"-1", # 相当于default
# multiselect = True,
label = F"Seed",
)
Create_AdditionalScript_ComboBox=lambda:Framework.Dropdown\
(
# choices = Style.List_Style () ,
value = F"None", # 相当于default
# multiselect = True,
label = F"Additional Script",
)
Create_Output_BatchedImageBox=lambda \
Name_In=F"Output",\
Type_In=F"pil",\
Number_Column=None,\
Object_Fit_In=F"contain", \
IsPreviewMode_In=False,\
IsLabelDisplayed_In=False,\
Height_In=F"auto",\
:\
Framework.Gallery\
(
# choices = Style.List_Style () ,
# value = F"None", # 相当于default
# multiselect = True,
label = Name_In,
show_label = IsLabelDisplayed_In, # 的确不好看,更像是个Holder Tool Tip
# type = Type_In,
# select=1,
# _css= "overflow-x: scroll; overflow-y: hidden;",
columns = Number_Column,
object_fit = Object_Fit_In ,
preview = IsPreviewMode_In,
height =Height_In,
)
Create_Output_ImageBox_Single=lambda:Framework.Image\
(
# choices = Style.List_Style () ,
# value = F"None", # 相当于default
# multiselect = True,
label = F"Output",
show_label = False, # 的确不好看,更像是个Holder Tool Tip
type = "pil",
)
Create_OpenInExplorer_Button=lambda:Framework.Button\
(
# choices = Style.List_Style () ,
# value = F"None", # 相当于default
# multiselect = True,
F"Open in ...",
)
Create_OriginalSaveLink_Button=lambda:Framework.Button\
(
# choices = Style.List_Style () ,
# value = F"None", # 相当于default
# multiselect = True,
F"Save Link",
)
Create_ZipSaveLink_Button=lambda:Framework.Button\
(
# choices = Style.List_Style () ,
# value = F"None", # 相当于default
# multiselect = True,
label = F"Zip Link",
)
Create_ApplySetting_Button=lambda:Framework.Button\
(
# choices = Style.List_Style () ,
# value = F"None", # 相当于default
# multiselect = True,
F"Apply Setting",
)
Create_Restart_Button=lambda:Framework.Button\
(
# choices = Style.List_Style () ,
# value = F"None", # 相当于default
# multiselect = True,
F"Restart",
)
#region Function | Method
#region Event Handler
def DoOnButtonSubmit_AIS_Instance_Segmentation_Clicking (Image_In:Number.ndarray) :
"""
The 1st Process
Args:
Image_In ():
Returns:
"""
# Pre-Processing
# Pre-Setting
Instance_Processing = None
Image_Processing = None
if isinstance ( Image_In , str ) :
Image_Processing = Vision_MM.imread ( Image_In )
else:
Image_Processing=Image_In
with Engine.no_grad () :
if Instance_Processing is None :
Instance_Processing , Image_Return = Pipeline.run_instance_segmentation \
(
Image_Processing ,
scale_down_to_maxsize = False ,
)
else :
pass
Anime3D_KenBurns.torch_gc ()
global Image_Carrier
Image_Carrier = Image_Processing
global Instance_Carrier
Instance_Carrier = Instance_Processing
return Image_Return
def DoOnButtonSubmit_AIS_Infer_Disparity_Depth_Estimation_Clicking () :
"""
The 2nd Process
Returns:
"""
# Pre-Processing
# Pre-Declaring
global Image_Carrier
global Instance_Carrier
with Engine.no_grad () :
Image_Processing = Anime3D_KenBurns.scaledown_maxsize\
(
Image_Carrier ,
Configuration_AIS.max_size,
)
Instance_Carrier.resize \
(
Image_Processing.shape [ 0 ] ,
Image_Processing.shape [ 1 ] ,
)
Configuration_AIS.int_height , Configuration_AIS.int_width = Image_Processing.shape [ : 2 ]
Image_Tensor=Engine.FloatTensor\
(
Number.ascontiguousarray\
(
Image_Processing\
.transpose(2,0,1)\
[None,:,:,:]\
.astype(Number.float32)\
*(1.0/255.0),
),
)\
.to(Device)
Configuration_Argument:Anime3D_KenBurns.KenBurnsConfig=Configuration_AIS.copy()
if Instance_Carrier is None :
# !此处的Instance_Carrier指向是否为Global需要测试
Instance_Carrier , Image_Processing = Pipeline.run_instance_segmentation\
(
Image_Processing ,
scale_down_to_maxsize = False,
)
Anime3D_KenBurns.torch_gc ()
else:
pass
# Coarse Depth
if Image_Tensor is None :
Image_Tensor = Engine.FloatTensor\
(
Number.ascontiguousarray\
(
Image_Processing.transpose ( 2 , 0 , 1 )\
[ None , : , : , : ]\
.astype ( Number.float32 )\
* (1.0 / 255.0)
)
)\
.to ( Device )
else:
pass
Disparity_Return = Pipeline._depth_est ( Image_Tensor , Image_Processing )
Anime3D_KenBurns.torch_gc ()
# Debug
print(F"Disparity generated successfully")
# # global Image_Intermediate_Carrier
# # Image_Intermediate_Carrier=Disparity_Return
#
global Image_Tensor_Carrier
Image_Tensor_Carrier=Disparity_Return
#
# global Image_Carrier
Image_Carrier=Image_Processing
#
global Disparity_Carrier
Disparity_Carrier=Disparity_Return
#
# global Instance_Carrier
# Instance_Carrier=Instance_Processing
#
global Configuration_Argument_Carrier
Configuration_Argument_Carrier=Configuration_Argument
return Disparity_Return
# ?和前1函数合并,共用Depth Coarse的名,保持和后面的一致
def DoOnButtonSubmit_AIS_Infer_Disparity_Depth_Coarse_Clicking () :
"""
The 3rd Process
Returns:
"""
with Engine.no_grad () :
Image_With_Depth_Coarse_Return = Anime3D_KenBurns.colorize_depth\
(
Disparity_Carrier\
.cpu ()\
.numpy () ,
inverse = True ,
rgb2bgr = True ,
cmap = 'magma_r',
)
if Configuration_Argument_Carrier is not None :
Configuration_Argument_Carrier.stage_depth_coarse = Image_With_Depth_Coarse_Return
else:
pass
if IsIntermediateResultSaving :
# To Do
pass
else:
pass
Anime3D_KenBurns.torch_gc ()
# global Image_Intermediate_Carrier
# Image_Intermediate_Carrier=Image_With_Depth_Coarse_Return
return Image_With_Depth_Coarse_Return
def DoOnButtonSubmit_AIS_Infer_Disparity_Depth_Adjusted_Depth_Clicking () :
"""
The 4th Process
Returns:
"""
# Pre-Processing
# Pre-Declaring
global Disparity_Carrier
with Engine.no_grad () :
# Adjust Depth
if Configuration_AIS.detector == F"maskrcnn" :
Disparity_Return = Anime3D_KenBurns.depth_adjustment_maskrcnn\
(
Instance_Carrier ,
Disparity_Carrier ,
Image_Tensor_Carrier,
)
else :
Disparity_Return = Anime3D_KenBurns.depth_adjustment_animesseg\
(
Instance_Carrier ,
Disparity_Carrier ,
Image_Tensor_Carrier,
)
Image_With_Depth_Adjusted_Return = Anime3D_KenBurns.colorize_depth\
(
Disparity_Return\
.cpu ()\
.numpy () ,
inverse = True ,
rgb2bgr = True ,
cmap = 'magma_r',
)
if Configuration_Argument_Carrier is not None :
Configuration_Argument_Carrier.stage_depth_adjusted = Image_With_Depth_Adjusted_Return
else:
pass
if IsIntermediateResultSaving :
# To Do
pass
else:
pass
Anime3D_KenBurns.torch_gc ()
# global Disparity_Carrier
Disparity_Carrier=Disparity_Return
return\
[
Image_With_Depth_Adjusted_Return,
Disparity_Return,
]
def DoOnButtonSubmit_AIS_Adjustment_Anime_Segmentation_TabClicking () :
"""
The 5th Process
Returns:
"""
# Pre-Processing
# Pre-Declaring
global Disparity_Carrier
with Engine.no_grad () :
# Final Depth
if Configuration_AIS.default_depth_refine :
Disparity_Return = Pipeline.refine_depth\
(
Image_Tensor_Carrier ,
Disparity_Carrier,
)
elif Configuration_AIS.refine_crf :
Disparity_Return = Pipeline.refine_depth_crf\
(
Image_Carrier ,
Disparity_Carrier ,
Instance_Carrier,
)
else:
pass
Image_With_Depth_Final_Return = Anime3D_KenBurns.colorize_depth\
(
Disparity_Return\
.cpu ()\
.numpy () ,
inverse = True ,
rgb2bgr = True ,
cmap = 'magma_r',
)
if Configuration_Argument_Carrier is not None :
Configuration_Argument_Carrier.stage_depth_final = Image_With_Depth_Final_Return
else:
pass
if IsIntermediateResultSaving :
# To Do
pass
else:
pass
Anime3D_KenBurns.torch_gc ()
# global Disparity_Carrier
Disparity_Carrier=Disparity_Return
return\
[
Image_With_Depth_Final_Return,
Disparity_Return,
]
def DoOnButton_Run_With_Steps_Stepping_TabClicking\
(
Image_In:Number.ndarray,
IsBoundingBox_Required_In,
IsInstanceMask_Required_In,
IsInstanceContour_Required_In,
IsTag_List_Required_In,
Mask_α_In,
) :
global Configuration_Global
IsVerbosing_In=IsVerbosing_Global
# Debug
print(F"{IsVerbosing_In=} in {Inspect.currentframe().f_code.co_name}()")
List_Return=[]
#
Carrier_Configuration = Pipeline.generate_kenburns_config\
(
img = Image_In ,
verbose = IsVerbosing_In ,
# savep = None, # Gradio的File Control提供了Download,此Argument意义不大
)
# Debug
print(F"Scale Down in {Inspect.currentframe().f_code.co_name} after Configure Ken Burns")
print(F"{Image_In.shape=}")
print(F"{Carrier_Configuration.int_width=},{Carrier_Configuration.int_height=}")
print(F"Ratio: {Carrier_Configuration.int_width/Carrier_Configuration.int_height}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
Image_Return_After_2nd_Process = Carrier_Configuration.instances.draw_instances\
(
img=Image_In ,
draw_bbox = IsBoundingBox_Required_In,
draw_ins_mask = IsInstanceMask_Required_In,
draw_ins_contour = IsInstanceContour_Required_In,
# !需要保持None,Empty不行
# draw_indices =\
# [
# # List of indice
# ],
draw_tags = IsTag_List_Required_In ,
mask_alpha=Mask_α_In,
)
# Debug
print(F"Scale Down in {Inspect.currentframe().f_code.co_name} after Draw Instance")
print(F"{Image_In.shape=}")
print(F"{Carrier_Configuration.int_width=},{Carrier_Configuration.int_height=}")
print(F"Ratio: {Carrier_Configuration.int_width/Carrier_Configuration.int_height}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
List_Return.append(Image_Return_After_2nd_Process )
# !此处为了抵消AIS代码中预先对Image进行的BGR→RGB,进行了1次转换
Image_Return_Aftewr_3rd_Process=Vision.cvtColor(Carrier_Configuration.stage_depth_coarse, Vision.COLOR_BGR2RGB)
#
List_Return.append(Image_Return_Aftewr_3rd_Process)
# !此处为了抵消AIS代码中预先对Image进行的BGR→RGB,进行了1次转换
Image_Return_Aftewr_4th_Process=Vision.cvtColor(Carrier_Configuration.stage_depth_adjusted, Vision.COLOR_BGR2RGB)
#
List_Return.append(Image_Return_Aftewr_4th_Process)
# !此处为了抵消AIS代码中预先对Image进行的BGR→RGB,进行了1次转换
Image_Return_Aftewr_5th_Process=Vision.cvtColor(Carrier_Configuration.stage_depth_final, Vision.COLOR_BGR2RGB)
#
List_Return.append(Image_Return_Aftewr_5th_Process)
# Generate High Light Crops for Auto-zoomed Method
List_Return.append(HighLight_Crop_AutoZoom(Image_In,Carrier_Configuration))
# List_Return.append(Image_In)
# Update Control status
List_Return.append(Framework.update(interactive = True))
#
#
# Update Progress
List_Return.append(F"Instances generated successfully.")
# Post-Processing
Configuration_Global=Carrier_Configuration
return List_Return
def Adjust_Camera_Location ( Location_Camera_Original_In:Location_Point , Difference_Width_Original_In =0,Ratio_Scaling_In=1) :
# !需要使用更简洁的方式设定非null的default
# Location_Camera_Original_Return:Location_Point=None
# Location_Central_Original=Location_Point(Approximate_To_Integer( Width_Global * Ratio_Resize_Global/2),Approximate_To_Integer( Height_Global * Ratio_Resize_Global/2 ) )
# Difference_Height_Original=Approximate_To_Integer(Difference_Width_Original_In/Ratio_Global)
# Horizon_Carrier=None
Horizon_Carrier=Approximate_To_Integer(Location_Camera_Original_In.Horizon*Ratio_Scaling_In)
# Vertical_Carrier=None
Vertical_Carrier=Approximate_To_Integer(Location_Camera_Original_In.Vertical*Ratio_Scaling_In)
# if(Location_Camera_Original_In.Horizon<Location_Central_Original.Horizon):
# Horizon_Carrier=Location_Camera_Original_In.Horizon+Difference_Width_Original_In
# else:
# Horizon_Carrier=Location_Camera_Original_In.Horizon-Difference_Width_Original_In
#
# if(Location_Camera_Original_In.Vertical<Location_Central_Original.Vertical):
# Vertical_Carrier=Location_Camera_Original_In.Vertical+Difference_Height_Original
# else:
# Vertical_Carrier=Location_Camera_Original_In.Vertical-Difference_Height_Original
Location_Camera_Original_Return=Location_Point(Horizon_Carrier,Vertical_Carrier)
return Location_Camera_Original_Return
def Adjust_Crop\
(
Location_Camera_In:Location_Point,
Crop_In:Location_Point, # !Crop应另设Size的Named Tuple,以示区分
Ratio_Resize_Image_In=1,
Limit_Ratio_Resize_Crop_In=1,
) :
Crop_Return:Location_Point=None
Location_Camera_Return:Location_Point=None
Crop_Processing:Location_Point=None
Size_Original=Location_Point ( Approximate_To_Integer ( Width_Global * Ratio_Resize_Image_In ) , Approximate_To_Integer ( Height_Global * Ratio_Resize_Image_In ) )
# Processing: Adjust Crop Width with boundary
# # # Debug
# # print(F"Before generating Crop based on Width in {Inspect.currentframe().f_code.co_name}()")
# # print(F"{Crop_In=}" )
# # print(F"Ratio: {Crop_In.Horizon / Crop_In.Vertical}" )
# # print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
#
# Crop_Width_Based_On_Width=Adjust_Crop_Core(Location_In=Location_Camera_In.Horizon,Length_In=Crop_In.Horizon, IsWidth_In = True,Ratio_Resize_In = Ratio_Resize_Image_In )
# Crop_Height_Based_On_Width=Approximate_To_Integer(Crop_Width_Based_On_Width/Ratio_Global)
#
# # # Debug
# # print(F"After generating Crop based on Width in {Inspect.currentframe().f_code.co_name}()")
# # print(F"{Crop_Width_Based_On_Width=},{Crop_Height_Based_On_Width=}")
# # print(F"Ratio: {Crop_Width_Based_On_Width/Crop_Height_Based_On_Width}")
# # print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
#
# Crop_Height_Based_On_Height=Adjust_Crop_Core(Location_In=Location_Camera_In.Vertical,Length_In=Crop_In.Vertical, IsWidth_In = False,Ratio_Resize_In = Ratio_Resize_Image_In )
# Crop_Width_Based_On_Height=Approximate_To_Integer(Crop_Height_Based_On_Height*Ratio_Global)
#
# # # Debug
# # print(F"After generating Crop based on Height in {Inspect.currentframe().f_code.co_name}()")
# # print(F"{Crop_Width_Based_On_Height=},{Crop_Height_Based_On_Height=}")
# # print(F"Ratio: {Crop_Width_Based_On_Height/Crop_Height_Based_On_Height}")
# # print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
#
# if(Crop_Width_Based_On_Height<=Crop_Width_Based_On_Width\
# and Crop_Height_Based_On_Height<=Crop_Height_Based_On_Width): # Crop的高度更接近边缘,以高度为准获取Crop
# Crop_Processing=Location_Point(Crop_Width_Based_On_Height,Crop_Height_Based_On_Height )
# elif(Crop_Width_Based_On_Width<=Crop_Width_Based_On_Height\
# and Crop_Height_Based_On_Width<=Crop_Height_Based_On_Height): # Crop的宽度更接近边缘,以宽度为准获取Crop
# Crop_Processing=Location_Point(Crop_Width_Based_On_Width,Crop_Height_Based_On_Width )
# else: # 意外值,需要完全消除的分支
# print(F"Stuck in unknown Branch:\n")
# print(F"{Crop_Width_Based_On_Width=}")
# print(F"{Crop_Width_Based_On_Height=}")
# print(F"{Crop_Height_Based_On_Width=}")
# print(F"{Crop_Height_Based_On_Height=}")
#
# pass
# # Debug
# print(F"After generating Crop-Processing in {Inspect.currentframe().f_code.co_name}()")
# print(F"{Crop_Processing.Horizon=},{Crop_Processing.Vertical=}")
# print(F"Ratio: {Crop_Processing.Horizon/Crop_Processing.Vertical}")
# print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
# Processing: Adjust Camera Location with Crop Ratio Limit
Limit_Lower=Approximate_To_Integer( Width_Global * Ratio_Resize_Image_In * Limit_Ratio_Resize_Crop_In )
# Adjust Crop basically, ∈ (Minimum Size, Image Size)
if Crop_In.Horizon<Limit_Lower:
Crop_Processing=Location_Point(Limit_Lower,Approximate_To_Integer(Limit_Lower/Ratio_Global))
elif Crop_In.Horizon>Size_Original.Horizon:
Crop_Processing = Size_Original
else:
Crop_Processing=Crop_In
# # Debug
# print(F"{Inspect.currentframe().f_code.co_name}()")
# print(F"{Limit_Lower=}" )
# if(Crop_Processing.Horizon<Limit_Lower):
# # Debug
# print(F"After generating Crop based on Height in {Inspect.currentframe().f_code.co_name}()")
# print(F"{Crop_Width_Based_On_Height=},{Crop_Height_Based_On_Height=}")
# print(F"Ratio: {Crop_Width_Based_On_Height/Crop_Height_Based_On_Height}")
# print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
# # Difference_Width=Limit_Lower-Crop_Processing.Horizon
# Ratio_Scaling=Limit_Lower / Crop_Processing.Horizon # 始终>1
# # Debug
# print(F"{Ratio_Scaling=}" )
# Crop_Processing=Location_Point(Limit_Lower,Approximate_To_Integer(Limit_Lower/Ratio_Global))
# # Debug
# print(F"After generating Crop-Processing in {Inspect.currentframe().f_code.co_name}()")
# print(F"{Crop_Processing.Horizon=},{Crop_Processing.Vertical=}")
# print(F"Ratio: {Crop_Processing.Horizon/Crop_Processing.Vertical}")
# print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
# # Location_Camera_Return= Adjust_Camera_Location ( Location_Camera_In , Difference_Width )
# Location_Camera_Return= Adjust_Camera_Location ( Location_Camera_In,Ratio_Scaling_In = Ratio_Scaling )
Location_Camera_Return=Centralise_Camera(Location_Camera_In,Crop_Processing,Size_Original)
# # Debug
# print(F"After generating Camera Location in {Inspect.currentframe().f_code.co_name}()")
# print(F"{Location_Camera_Return.Horizon=},{Location_Camera_Return.Vertical=}")
# print(F"Ratio: {Crop_Processing.Horizon/Crop_Processing.Vertical}")
# print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
# else:
# Location_Camera_Return=Location_Camera_In
Crop_Return=Crop_Processing
return\
[
Location_Camera_Return,
Crop_Return,
]
def Adjust_Crop_Core ( Location_In,Length_In , IsWidth_In, Ratio_Resize_In=1 ) :
Limit_Lower=0
Limit_Higher=None
Difference_Lower=Location_In-Limit_Lower
Difference_Higher=None
Crop_Return=None
if(IsWidth_In):
Limit_Higher=Approximate_To_Integer(Width_Global*Ratio_Resize_In)
else:
Limit_Higher=Approximate_To_Integer(Height_Global*Ratio_Resize_In)
Difference_Higher = Limit_Higher - Location_In
Limit_Crop=min ( Difference_Lower , Difference_Higher ) * 2
Crop_Return =min(Limit_Crop,Length_In)
return Crop_Return
IsFullImageRequired=lambda Width_In,Ratio_Resize_In=1 :\
True\
if Width_In==Approximate_To_Integer(Width_Global*Ratio_Resize_In)\
else False
# !需要重新规划备份代码的位置
# if Width_In==Width_Global\
# or Width_In==0\
def DoOnButton_Generate_Camera_View_Stepping_TabClicking\
(
IsInpainting_In,
Ratio_Crop_Camera_Start_In,
# Width_Camera_Start_In,
# Height_Camera_Start_In,
Ratio_Crop_Camera_End_In,
# Width_Camera_End_In,
# Height_Camera_End_In,
Number_Frame_In,
IsUsingAutoZoom_In,
Depthor_In,
IsDepthRequired_In,
) :
global Configuration_Global
global List_Frame_Global
IsVerbosing_In=IsVerbosing_Global
# Debug
print(F"{IsVerbosing_In=} in {Inspect.currentframe().f_code.co_name}()")
List_PositiveFilm_Return=[]
List_Mask_Return=[]
List_Frame_Return=None
Configuration_Carrier=None
if (IsUsingAutoZoom_In):
# Debug
print(F"Scale Down in {Inspect.currentframe().f_code.co_name} before Auto Zoom")
# print(F"{Image_In.shape=}")
print(F"{Configuration_Global.int_width=},{Configuration_Global.int_height=}")
print(F"Ratio: {Configuration_Global.int_width/Configuration_Global.int_height}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
with Engine.no_grad () :
Crop_Camera_Start=Location_Point(Configuration_Global.int_width / 2.0,Configuration_Global.int_height / 2.0)
Crop_Camera_End=Location_Point(Configuration_Global.int_width / 2.0,Configuration_Global.int_height / 2.0)
Camera_Start =\
{
'fltCenterU' : Crop_Camera_Start.Horizon ,
'fltCenterV' : Crop_Camera_Start.Vertical ,
'intCropWidth' : Approximate_To_Integer(Ratio_Crop_AutoZoomed*Configuration_Global.int_width),
'intCropHeight' : Approximate_To_Integer(Ratio_Crop_AutoZoomed*Configuration_Global.int_height),
}
Camera_End = Anime3D_KenBurns.process_autozoom\
(
{
'fltShift' : 100.0 ,
'fltZoom' : 1.25 ,
'objFrom' : Camera_Start,
} ,
Configuration_Global,
)
# Debug
print(F"Scale Down in {Inspect.currentframe().f_code.co_name} before Process Ken Burns")
# print(F"{Image_In.shape=}")
print(F"{Configuration_Global.int_width=},{Configuration_Global.int_height=}")
# print(F"{Camera_Start_Global.Horizon=},{Camera_Start_Global.Vertical=}")
# print(F"{Camera_End_Global.Horizon=},{Camera_End_Global.Vertical=}")
print(F"{Camera_Start=}")
print(F"{Camera_End=}")
print(F"{Crop_Camera_Start=}")
print(F"{Crop_Camera_End=}")
print(F"Ratio: {Configuration_Global.int_width/Configuration_Global.int_height}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
List_Frame_Return,Configuration_Carrier = Pipeline.process_kenburns\
(
objSettings =\
{
'fltSteps' : Number.linspace\
(
start = 0.0 ,
stop = 1.0 ,
num = 75,
)\
.tolist () ,
'objFrom' : Camera_Start ,
'objTo' : Camera_End ,
'boolInpaint' : IsInpainting_In,
} ,
objCommon = Configuration_Global ,
inpaint = IsInpainting_In ,
verbose = IsVerbosing_In,
# Depthor_In = Depthor_In,
# IsDepthRequired_In = IsDepthRequired_In,
)
# Debug
print(F"Scale Down in {Inspect.currentframe().f_code.co_name} after Auto Zoom")
# print(F"{Image_In.shape=}")
print(F"{Configuration_Global.int_width=},{Configuration_Global.int_height=}")
print(F"Ratio: {Configuration_Global.int_width/Configuration_Global.int_height}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
else:
Crop_Camera_Start_Input = Location_Point ( Approximate_To_Integer ( Configuration_Global.int_width * Ratio_Crop_Camera_Start_In ) , Approximate_To_Integer ( Configuration_Global.int_height * Ratio_Crop_Camera_Start_In ) )
Crop_Camera_End_Input = Location_Point ( Approximate_To_Integer ( Configuration_Global.int_width * Ratio_Crop_Camera_End_In ) , Approximate_To_Integer ( Configuration_Global.int_height * Ratio_Crop_Camera_End_In ) )
# Pre-Processing
Crop_Camera_Start=Crop_Camera_Start_Input
# Crop_Camera_Start=Crop_Camera_Start_Input\
# if IsFullImageRequired(Width_Camera_Start_In)\
# else Adjust_Crop(Location_In = Camera_Start_Global,Crop_In = Crop_Camera_Start_Input)
Crop_Camera_End=Crop_Camera_End_Input
# Crop_Camera_End=Crop_Camera_End_Input\
# if IsFullImageRequired(Width_Camera_End_In)\
# else Adjust_Crop(Location_In = Camera_Start_Global,Crop_In=Crop_Camera_End_Input)
with Engine.no_grad () :
Camera_Start =\
{
'fltCenterU' : Camera_Start_Global.Horizon ,
'fltCenterV' : Camera_Start_Global.Vertical ,
'intCropWidth' : Crop_Camera_Start.Horizon,
'intCropHeight' : Crop_Camera_Start.Vertical,
# 'intCropHeight' : Height_Camera_Start_In,
}
Camera_End =\
{
'fltCenterU' : Camera_End_Global.Horizon ,
'fltCenterV' : Camera_End_Global.Vertical ,
'intCropWidth' : Crop_Camera_End.Horizon,
'intCropHeight' : Crop_Camera_End.Vertical,
# 'intCropHeight' : Height_Camera_End_In,
}
# Debug
print(F"Scale Down in {Inspect.currentframe().f_code.co_name} before Process Ken Burns")
# print(F"{Image_In.shape=}")
print(F"{Configuration_Global.int_width=},{Configuration_Global.int_height=}")
print(F"{Camera_Start_Global.Horizon=},{Camera_Start_Global.Vertical=}")
print(F"{Camera_End_Global.Horizon=},{Camera_End_Global.Vertical=}")
print(F"{Crop_Camera_Start.Horizon=},{Crop_Camera_Start.Vertical=}")
print(F"{Crop_Camera_End.Horizon=},{Crop_Camera_End.Vertical=}")
print(F"Ratio: {Configuration_Global.int_width/Configuration_Global.int_height}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
List_Frame_Return,Configuration_Carrier = Pipeline.process_kenburns\
(
objSettings =\
{
'fltSteps' : Number.linspace\
(
start = 0.0 ,
stop = 1.0 ,
num = Number_Frame_In,
)\
.tolist () ,
'objFrom' : Camera_Start ,
'objTo' : Camera_End ,
'boolInpaint' : IsInpainting_In,
} ,
objCommon = Configuration_Global ,
inpaint = IsInpainting_In ,
verbose = IsVerbosing_In,
# Depthor_In = Depthor_In,
# IsDepthRequired_In = IsDepthRequired_In,
)
# Debug
print(F"Scale Down in {Inspect.currentframe().f_code.co_name} after Process Ken Burns")
# print(F"{Image_In.shape=}")
print(F"{Configuration_Global.int_width=},{Configuration_Global.int_height=}")
print(F"Ratio: {Configuration_Global.int_width/Configuration_Global.int_height}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
# for Carrier_Image_PositiveFilm in Configuration_Carrier.stage_inpainted_imgs :
# List_PositiveFilm_Return.append(Carrier_Image_PositiveFilm )
if(Configuration_Carrier.stage_inpainted_imgs):
# Debug
# print(F"{Configuration_Carrier.stage_inpainted_imgs=}")
List_PositiveFilm_Return.append(Configuration_Carrier.stage_inpainted_imgs[-2] ) # 倒数2nd张
List_PositiveFilm_Return.append(Configuration_Carrier.stage_inpainted_imgs[-1] ) # 倒数1st张
else:
pass
# for Carrier_Image_Mask in Configuration_Carrier.stage_inpainted_masks :
# List_Mask_Return.append(Carrier_Image_Mask)
if(Configuration_Carrier.stage_inpainted_masks):
# Debug
# print(F"{Configuration_Carrier.stage_inpainted_masks=}")
List_Mask_Return.append(Configuration_Carrier.stage_inpainted_masks[-2] ) # 倒数2nd张
List_Mask_Return.append(Configuration_Carrier.stage_inpainted_masks[-1] ) # 倒数1st张
# Post-Processing
List_Frame_Global=List_Frame_Return
Configuration_Global=Configuration_Carrier
return \
[
List_PositiveFilm_Return[0],
List_PositiveFilm_Return[1],
List_Mask_Return[0],
List_Mask_Return[1],
List_Frame_Return,
#
#
Framework.update(interactive = True),
# Reset Video Box
None,
#
#
# Update Progress
F"Cameras generated successfully.",
]
def DoOnButton_Encode_Video_Stepping_TabClicking() :
IsVerbosing_In=IsVerbosing_Global
# Debug
print(F"{IsVerbosing_In=} in {Inspect.currentframe().f_code.co_name}()")
Path_Video_Return=F"Result-Downloading.mp4"
# !此处为了抵消AIS代码中Frame List→Video时对单Frame进行的BGR→RGB,进行了1次转换
List_Frame_BGR=\
[
Carrier_Frame[ :, :, : :-1 ]\
for Carrier_Frame\
in List_Frame_Global
]
Anime3D_KenBurns.npyframes2video\
(
List_Frame_BGR,
Path_Video_Return,
)
# !VideoBox返回时至少2个值,否则始终报错
return\
[
Path_Video_Return,
Path_Video_Return,
]
def DoOnImageBox_Input_Original_Stepping_TabChanged\
(
Image_In:Number.ndarray,
Ratio_Crop_Camera_Start_In,
Ratio_Crop_Camera_End_In,
) :
"""
Clear all results previous while new processing starting.
Args:
Image_In ():
Returns:
"""
global Height_Global
global Width_Global
global Ratio_Global
global Ratio_Resize_Global
Height_Original=None
Width_Original=None
Ratio_Resize:float=1
# !需要提取为新的函数、Constant
List_Return = \
[
None ,
None ,
None ,
None ,
#
True,
True,
True,
False,
Mask_α_Default,
#
None ,
None ,
None ,
None ,
#
False,
None ,
None ,
#
PlaceHolder_Label_Camera ,
PlaceHolder_Label_Camera ,
#
75,
True,
#
#
True,
#
#
]
if(Image_In is None):
List_Return.append(Ratio_Crop_Camera_Start_Deault)
List_Return.append ( None )
List_Return.append ( None )
#
List_Return.append(Ratio_Crop_Camera_End_Deault)
List_Return.append ( None )
List_Return.append ( None )
#
List_Return.append ( Image_In )
List_Return.append ( Image_In )
#
#
#
# List_Return.append ( None )
List_Return.append ( Progress_Default )
List_Return.append ( Progress_Default )
else:
Height_Original,Width_Original=Image_In.shape[:2]
IsHorizonRectangle=True\
if Width_Original>Height_Original\
else False
Ratio_Global=Width_Original/Height_Original # Save Ratio of Image Input as Single
# Processing: 计算Down Scale后的Ratio、Pixel坐标
if(IsHorizonRectangle):
Ratio_Resize=Width_Original/Configuration_AIS.max_size # !考虑更换获取来源,更统一一些,而不是当前的Legacy的Pipeline的残留来源
Width_Global=Configuration_AIS.max_size # 直接获取;或Original通过Ratio计算
Height_Global=Approximate_To_Integer(Height_Original/Ratio_Resize) # 直接Original通过Ratio计算;或给定值通过长宽Ratio计算
else:
Ratio_Resize=Height_Original/Configuration_AIS.max_size # !考虑更换获取来源,更统一一些,而不是当前的Legacy的Pipeline的残留来源
Width_Global=Approximate_To_Integer(Width_Original/Ratio_Resize) # 直接Original通过Ratio计算;或给定值通过长宽Ratio计算
Height_Global=Configuration_AIS.max_size # 直接获取;或Original通过Ratio计算
# Debug
print ( F"After generating Down Scaled Image in {Inspect.currentframe ().f_code.co_name}()" )
print ( F"{Width_Global=}, {Height_Global=}" )
print ( F"{Width_Original=}, {Height_Original=}" )
print ( F"Ratio: {Width_Global / Height_Global}" )
print ( F"Ratio Global | Original as contrast: {Ratio_Global=}" )
Width_Preferred=Approximate_To_Integer( Width_Global * Ratio_Crop_Camera_Start_In )
Height_Preferred=Approximate_To_Integer( Height_Global * Ratio_Crop_Camera_End_In )
List_Return.append(Ratio_Crop_Camera_Start_Deault)
List_Return.append(Width_Preferred)
List_Return.append(Height_Preferred)
#
List_Return.append(Ratio_Crop_Camera_End_Deault)
List_Return.append(Width_Preferred)
List_Return.append(Height_Preferred)
#
List_Return.append ( Image_In )
List_Return.append ( Image_In )
#
#
#
List_Return.append ( Progress_Default )
List_Return.append ( Progress_Default )
# Post-Processing
Ratio_Resize_Global=Ratio_Resize
# List_Return.append(Framework.update(width=Width_Global,height=Height_Global))
return List_Return
# !需要拆分Wrapper、合并内容
def DoOnImageBox_Stepping_TabSelecting\
(
Image_BackUp_In,
Image_In,
# Width_Crop_Camera_Start_In,
# Width_Crop_Camera_End_In,
#
Ratio_Crop_Camera_Start_In,
Ratio_Crop_Camera_End_In,
#
#
Argument_System:Framework.SelectData,
) :
global IsStartingCameraSetting_Global
global Camera_Start_Global
global Camera_End_Global
List_Return=None
Image_Return=None
if(IsStartingCameraSetting_Global):
# Pre-Processing
# 清除前次的痕迹
Image_In=Number.copy(Image_BackUp_In)
Location_Camera_Start_Original=Location_Point(Argument_System.index [ 0 ],Argument_System.index[1 ] )
# Debug
print(F"Before Processing Start Camera Location in {Inspect.currentframe().f_code.co_name}()")
print(F"{Location_Camera_Start_Original.Horizon=},{Location_Camera_Start_Original.Vertical=}")
print(F"Ratio: {Location_Camera_Start_Original.Horizon/Location_Camera_Start_Original.Vertical}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
#
print(F"Resized Image Size should be :")
print(F"Horizon : {Location_Camera_Start_Original.Horizon/Ratio_Resize_Global}, Vertical : {Location_Camera_Start_Original.Vertical/Ratio_Resize_Global}")
# Width_Crop_Camera_Start_Original=Approximate_To_Integer(Width_Crop_Camera_Start_In*Ratio_Resize_Global)
Image_Return,Location_Camera_Start= HighLight_Crop_Using_Ratio ( Image_In , Location_Camera_Start_Original , Ratio_Crop_Camera_Start_In, Color_In = (255 , 165, 0) ) # !需要Constant化:Orange
List_Return=\
[
Image_Return,
# Width_Crop_Camera_Start_Return,
# Width_Crop_Camera_End_In,
# 为了保证数值的精度,Original的坐标使用原始数据
# !需要合并、提取函数+Constant
F"#### Horizon: {Location_Camera_Start.Horizon} (Original: {Location_Camera_Start_Original.Horizon }), Vertical: {Location_Camera_Start.Vertical} (Original: {Location_Camera_Start_Original.Vertical })",
PlaceHolder_Label_Camera,
]
IsStartingCameraSetting_Global=False
Camera_Start_Global=Location_Camera_Start
else:
Location_Camera_End_Original=Location_Point(Argument_System.index [ 0 ],Argument_System.index[1])
# Debug
print(F"Before Processing End Camera Location in {Inspect.currentframe().f_code.co_name}()")
print(F"{Location_Camera_End_Original.Horizon=},{Location_Camera_End_Original.Vertical=}")
print(F"Ratio: {Location_Camera_End_Original.Horizon/Location_Camera_End_Original.Vertical}")
print(F"Ratio Global | Original as contrast: {Ratio_Global=}")
#
print(F"Resized Image Size should be :")
print(F"Horizon : {Location_Camera_End_Original.Horizon/Ratio_Resize_Global}, Vertical : {Location_Camera_End_Original.Vertical/Ratio_Resize_Global}")
# Width_Crop_Camera_End_Original=Approximate_To_Integer(Width_Crop_Camera_End_In*Ratio_Resize_Global)
Image_Return, Location_Camera_End= HighLight_Crop_Using_Ratio ( Image_In , Location_Camera_End_Original , Ratio_Crop_Camera_End_In, Color_In = (255 , 0 , 255) ) # !需要Constant化:Magenta
List_Return=\
[
Image_Return ,
# Width_Crop_Camera_Start_In,
# Width_Crop_Camera_End_Return,
F"#### Horizon: {Camera_Start_Global.Horizon} (Original: {Approximate_To_Integer(Camera_Start_Global.Horizon*Ratio_Resize_Global)}), Vertical: {Camera_Start_Global.Vertical} (Original: {Approximate_To_Integer(Camera_Start_Global.Vertical*Ratio_Resize_Global)})",
# 为了保证数值的精度,Original的坐标使用原始数据
F"#### Horizon: {Location_Camera_End.Horizon} (Original: {Approximate_To_Integer(Location_Camera_End_Original.Horizon)}), Vertical: {Location_Camera_End.Vertical} (Original: {Approximate_To_Integer(Location_Camera_End_Original.Vertical)})",
]
IsStartingCameraSetting_Global=True
Camera_End_Global=Location_Camera_End
return List_Return
# !考虑合并Event Handler到1个
def DoOnSlider_Camera_Start_Width_Stepping_TabChanged (Width_In) :
return Adjust_Ratio(Width_In = Width_In)
def DoOnSlider_Camera_Start_Height_Stepping_TabChanged (Height_In) :
return Adjust_Ratio(Height_In=Height_In)
def DoOnSlider_Camera_End_Width_Stepping_TabChanged (Width_In) :
return Adjust_Ratio(Width_In=Width_In)
def DoOnSlider_Camera_End_Height_Stepping_TabChanged (Height_In) :
return Adjust_Ratio(Height_In=Height_In)
#region Core
def Adjust_Ratio\
(
Width_In=None,
Height_In=None,
) :
Value_Return=None
if(Width_In is not None):
Value_Return=Approximate_To_Integer(Width_In/Ratio_Global)
else:
Value_Return=Approximate_To_Integer(Height_In*Ratio_Global)
return Value_Return
#endregion Core
#region Utility
def Approximate_To_Integer ( Input_In ) :
# return Mathemastics.floor(Input_In) # 比较合理的估算方式:保障坐标不会超出范围
# return int(Input_In) # 是截尾法,是比较合理的估算方式:保障坐标不会超出范围,同时对负数值的处理符合预期(趋向〇,而非-∞)
return int(round(Input_In)) # AIS源码|调用的Python源码中主要的坐标的处理逻辑
def HighLight_Crop_Using_Ratio\
(
Image_In,
Location_Camera_Original_In:Location_Point,
Ratio_Crop_In,
Color_In,
):
Height_Original,Width_Original=Image_In.shape[:2]
# Crop_Original_Input = Location_Point ( Width_Original_In , Approximate_To_Integer ( Width_Original_In / Ratio_Global ) )
Crop_Original_Input = Location_Point ( Approximate_To_Integer(Width_Original*Ratio_Crop_In) , Approximate_To_Integer ( Height_Original*Ratio_Crop_In ) )
Size_Original=Location_Point ( Width_Original , Height_Original )
return HighLight_Crop_Core(Image_In,Location_Camera_Original_In,Crop_Original_Input,Color_In,Size_Original)
def HighLight_Crop_Using_Crop\
(
Image_In,
Location_Camera_Original_In:Location_Point,
Crop_Original_In:Location_Point,
Color_In,
):
Height_Original,Width_Original=Image_In.shape[:2]
Size_Original=Location_Point ( Width_Original , Height_Original )
return HighLight_Crop_Core(Image_In,Location_Camera_Original_In,Crop_Original_In,Color_In,Size_Original)
def HighLight_Crop_Core\
(
Image_In,
Location_Camera_Original_In:Location_Point,
Crop_Original_In:Location_Point,
Color_In,
Size_Original_In:Location_Point,
):
# Debug
print(F"{Inspect.currentframe().f_code.co_name}()")
print(F"{Color_In=}")
Image_Return=Number.copy(Image_In)
Location_Camera_Return:Location_Point=None
Width_Return=None
Location_Camera_Original:Location_Point=None
Crop_Original=None
# Pre-Processing
# Crop_Camera = Crop_Camera \
# if IsFullImageRequired ( Width_In,Ratio_Resize_Global ) \
# else Adjust_Crop ( Location_In = Location_Camera_In , Crop_In = Crop_Camera ,Ratio_Resize_In = Ratio_Resize_Global)
# Location_Camera_Original,Crop_Original = Adjust_Crop ( Location_Camera_In = Location_Camera_Original_In , Crop_In = Crop_Original_Input , Ratio_Resize_Image_In = Ratio_Resize_Global , Limit_Ratio_Resize_Crop_In = Ratio_Crop_In )
Crop_Original=Crop_Original_In
Location_Camera_Original=Centralise_Camera(Location_Camera_Original_In,Crop_Original_In,Size_Original_In)
# Processing: Add Rectangle to mark Selection
# ?是否需要进行Open CV的颜色顺序的转换
Location_Start_Original,Location_End_Original=ConvertLocation_From_Center_To_Corner(Location_Camera_Original,Crop_Original )
Vision.rectangle\
(
img = Image_Return ,
pt1 = Location_Start_Original , # Start Location
pt2 = Location_End_Original , # End Location
color = Color_In ,
# thickness = 2, # !需要Constant化
# thickness = 5, # !需要Constant化
thickness = 10, # !需要Constant化
)
# ?Python语法是否对Structure的算术运算有简化
# !需要提取函数
Location_Camera_Return=Location_Point ( Approximate_To_Integer ( Location_Camera_Original.Horizon / Ratio_Resize_Global ), Approximate_To_Integer(Location_Camera_Original.Vertical / Ratio_Resize_Global ) )
Width_Return=Approximate_To_Integer( Crop_Original.Horizon / Ratio_Resize_Global )
return\
[
Image_Return,
Location_Camera_Return,
# Width_Return,
]
def ConvertLocation_From_Center_To_Corner\
(
Camera_In:Location_Point,
Crop_In:Location_Point,
) :
# 计算起止点坐标
Location_Start_Return = Location_Point\
(
Camera_In.Horizon - Approximate_To_Integer ( Crop_In.Horizon / 2 ) ,
Camera_In.Vertical - Approximate_To_Integer ( Crop_In.Vertical / 2 ) ,
)
Location_End_Return = Location_Point\
(
Camera_In.Horizon + Approximate_To_Integer ( Crop_In.Horizon / 2 ) ,
Camera_In.Vertical + Approximate_To_Integer ( Crop_In.Vertical / 2 ) ,
)
# 返回结果
return\
[
Location_Start_Return,
Location_End_Return,
]
def Centralise_Camera(Location_Camera_In:Location_Point,Crop_In:Location_Point,Size_In:Location_Point):
Location_Camera_Return:Location_Point=None
Location_Start:Location_Point
Location_End:Location_Point
Location_Start,Location_End=ConvertLocation_From_Center_To_Corner(Location_Camera_In,Crop_In)
ΔHorizon=0
ΔVertical=0
if Location_Start.Horizon<0:
ΔHorizon=-Location_Start.Horizon
elif Location_End.Horizon>Size_In.Horizon:
ΔHorizon= Size_In.Horizon - Location_End.Horizon
else:
pass
if Location_Start.Vertical<0:
ΔVertical=-Location_Start.Vertical
elif Location_End.Vertical>Size_In.Vertical:
ΔVertical= Size_In.Vertical - Location_End.Vertical
else:
pass
Location_Camera_Return=Location_Point(Location_Camera_In.Horizon+ΔHorizon,Location_Camera_In.Vertical+ΔVertical)
return Location_Camera_Return
#endregion Utility
#endregion Event Handler
#region Customised
#region Anime Instance Segmentation
def HighLight_Crop_AutoZoom (Image_In,Configuration_In) :
# with Engine.no_grad():
Image_Return=None
# Image_Return=Image_In
if \
(Image_In is not None)\
and (Configuration_In is not None):
Height_Original , Width_Original = Image_In.shape [ :2 ]
Location_Camera_Start_Original = Location_Point ( Approximate_To_Integer ( Width_Original / 2 ) , Approximate_To_Integer ( Height_Original / 2 ) )
Camera_Start = \
{
'fltCenterU' : Location_Camera_Start_Original.Horizon ,
'fltCenterV' : Location_Camera_Start_Original.Vertical ,
'intCropWidth' : Approximate_To_Integer ( Ratio_Crop_AutoZoomed * Configuration_In.int_width ) ,
'intCropHeight' : Approximate_To_Integer ( Ratio_Crop_AutoZoomed * Configuration_In.int_height ) ,
}
# Camera_End=Anime3D_KenBurns.process_autozoom\
# (
# {
# 'fltShift' : 100.0 ,
# 'fltZoom' : 1.25 ,
# 'objFrom' : Camera_Start,
# } ,
# Configuration_In,
# )
# Location_Camera_End_Original=Location_Point(Camera_End[F"fltCenterU"],Camera_End[F"fltCenterV"])
Location_Camera_End_Original = Location_Point ( Location_Camera_Start_Original.Horizon + 20 , Location_Camera_Start_Original.Vertical + 20 )
# Crop_Camera_End_Original=Location_Point(Camera_End[F"intCropWidth"],Camera_End[F"intCropHeight"])
# Start Camera
Image_Processing , _ = HighLight_Crop_Using_Ratio ( Image_In , Location_Camera_Start_Original , Ratio_Crop_AutoZoomed , Color_In = (255 , 165 , 0) ) # !需要Constant化:Orange
# End Camera
# Image_Return , _ = HighLight_Crop_Using_Crop ( Image_Processing , Location_Camera_End_Original , Crop_Original_In = Crop_Camera_End_Original , Color_In = (255 , 0 , 255) ) # !需要Constant化:Magenta
Image_Return , _ = HighLight_Crop_Using_Ratio ( Image_Processing , Location_Camera_End_Original , Ratio_Crop_In = Ratio_Crop_AutoZoomed * 0.8 , Color_In = (255 , 0 , 255) ) # !需要Constant化:Magenta
elif Configuration_In is None:
Image_Return=Image_In
else:
pass
return Image_Return
def DoOnCheckBox_Auto_Zoom_Stepping_TabChanged (IsAutoZoomed_In,Image_In) :
Image_Return=None
if(IsAutoZoomed_In):
Image_Return=HighLight_Crop_AutoZoom(Image_In,Configuration_Global)
else:
Image_Return=Image_In
return Image_Return
def Create_Stepping_Demonstration_Tab () :
Title=F"3D Ken Burns"
with Framework.Tab ( Title ) as Page:
# Pre-Processing
Page_Global = Page
# Framework.Markdown(Title)
# Framework.Markdown()
# Framework.Markdown()
Framework.Markdown ( F"# Step 0. Choose Image")
with Framework.Row():
with Framework.Column():
Title_Image_Input_Original=F"Input Image"
Framework.Markdown ( F"#### {Title_Image_Input_Original}" )
# !需要需要禁用更改Image功能,仅作为大屏展示|操作
ImageBox_Input_Original_Stepping_Tab = Framework.Image \
(
label = Title_Image_Input_Original ,
show_label = False,
#
# type=F"pil",
type=F"numpy",
#
interactive = True,
# editable = False,
# height = 600,
)
# with Framework.Row\
# (
# # wrap=False,
# # min_width = 180,
# ):
# with Framework.Column\
# (
# min_width = 160,
# ):
# CheckBox_Convert_To_BGR_Stepping_Tab = Create_Step_CheckBox\
# (
# Name_In = F"RGB → BGR",
# Value_Default_In = True,
# )
# with Framework.Column\
# (
# min_width = 180,
# ):
# ImageBox_After_1st_Process_Stepping_Tab=Framework.Image\
# (
# label = F"Image-After 1st Process",
# # type=F"pil",
# type=F"numpy",
# )
# Button_Submit_After_1st_Process_Stepping_Tab=Framework.Button\
# (
# F"Submit",
# )
# CheckBox_After_1st_Process_Stepping_Tab=Create_Step_CheckBox\
# (
# Name_In = F"1st",
# Value_Default_In = True,
# )
# with Framework.Row():
with Framework.Column():
List_Example_Stepping_Tab=Framework.Examples\
(
examples=\
[
OS.path.join ( Path_List_Sample , Carrier_Path_Image ) for Carrier_Path_Image in OS.listdir ( Path_List_Sample )
],
inputs = \
[
ImageBox_Input_Original_Stepping_Tab,
],
examples_per_page = 40,
)
Framework.Markdown ( F"---" )
Framework.Markdown ( F"# Step 1. Generate Instance Masks")
with Framework.Row():
with Framework.Column \
(
min_width = 400 ,
) :
Title_After_Drawing_Instances=F"Instances"
Framework.Markdown(F"#### {Title_After_Drawing_Instances}")
ImageBox_After_2nd_Process_Stepping_Tab = Framework.Image \
(
label = Title_After_Drawing_Instances ,
show_label = False,
# type=F"pil",
type = F"numpy" ,
interactive = False,
# editable = False,
height = 600,
)
# Button_Submit_After_2nd_Process_Stepping_Tab=Framework.Button\
# (
# F"Submit",
# )
# CheckBox_After_2nd_Process_Stepping_Tab = Create_Step_CheckBox\
# (
# Name_In = F"2nd",
# Value_Default_In = True,
# )
with Framework.Column \
(
min_width = 180 ,
) :
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"#### Options")
CheckBox_BoundingBox_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Bounding Box",
Value_Default_In = True,
)
CheckBox_InstanceMask_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Instance Mask",
Value_Default_In = True,
)
CheckBox_InstanceContour_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Instance Contour",
Value_Default_In = True,
IsVisible_In = IsAllActivatedControlDisplayed,
)
# 生成Text Tag
CheckBox_Tag_List_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Tag",
Value_Default_In = False,
IsVisible_In = IsAllActivatedControlDisplayed,
)
Slider_Mask_α_Stepping_Tab=Framework.Slider\
(
value = Mask_α_Default, # 相当于default
minimum = 0,
maximum = 1,
step = 0.01,
# multiselect = True,
label = F"Transparency of Mask",
# info = F"The higher the value set, the brighter the brightness is.",
)
# with Framework.Row():
# with Framework.Column():
CheckBox_IsVerbosing_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Verbose",
Value_Default_In = False,
Tip_In = F"If checked, Programme will generate intermediate | temporary Image Results in its Root Directory.",
IsVisible_In = IsAllActivatedControlDisplayed,
)
Button_Run_With_Steps_Stepping_Tab=Framework.Button\
(
F"Run",
)
with Framework.Row():
# !需要命名为F"Intermediate Masks"
# with Framework.Group():
with Framework.Column \
(
min_width = 160 ,
) :
Title_After_Generating_Coarse_Depth=F"Coarse Depth"
Framework.Markdown(F"#### {Title_After_Generating_Coarse_Depth}")
ImageBox_After_3rd_Process_Stepping_Tab = Framework.Image \
(
label = Title_After_Generating_Coarse_Depth ,
show_label = False,
# type=F"pil",
type = F"numpy" ,
interactive = False,
# editable = False,
)
# Button_Submit_After_3rd_Process_Stepping_Tab=Framework.Button\
# (
# F"Submit",
# )
# CheckBox_After_3rd_Process_Stepping_Tab = Create_Step_CheckBox\
# (
# Name_In = F"3rd",
# Value_Default_In = True,
# )
with Framework.Column \
(
min_width = 160 ,
) :
Title_After_Generating_Adjusted_Depth=F"Adjusted Depth"
Framework.Markdown(F"#### {Title_After_Generating_Adjusted_Depth}")
ImageBox_After_4th_Process_Stepping_Tab = Framework.Image \
(
label = Title_After_Generating_Adjusted_Depth ,
show_label = False,
# type=F"pil",
type = F"numpy" ,
interactive = False,
# editable = False,
)
# Button_Submit_After_4th_Process_Stepping_Tab=Framework.Button\
# (
# F"Submit",
# )
# CheckBox_After_4th_Process_Stepping_Tab = Create_Step_CheckBox\
# (
# Name_In = F"4th",
# Value_Default_In = True,
# )
with Framework.Column \
(
min_width = 160 ,
) :
Title_After_Generating_Final_Depth=F"Final Depth"
Framework.Markdown(F"#### {Title_After_Generating_Final_Depth}")
ImageBox_After_5th_Process_Stepping_Tab = Framework.Image \
(
label = Title_After_Generating_Final_Depth ,
show_label = False,
# type=F"pil",
type = F"numpy" ,
interactive = False,
# editable = False,
)
# Button_Submit_After_5th_Process_Stepping_Tab=Framework.Button\
# (
# F"Submit",
# )
# CheckBox_After_5th_Process_Stepping_Tab = Create_Step_CheckBox\
# (
# Name_In = F"5th",
# Value_Default_In = True,
# )
Framework.Markdown ( F"---" )
# Frame List Generating Part
Framework.Markdown ( F"# Step 2. Set Camera View at Start and End" )
Framework.Markdown(F"## The <span style='color:rgb(255,165,0)'>ORANGE</span> box shows camera view at start. The <span style='color:rgb(255,0,255)'>MAGENTA</span> box shows camera view at end.")
# Framework.Markdown(F"## Crop of Start Camera in <span style='color:rgb(255,165,0)'>Orange</span>, Crop of End Camera in <span style='color:rgb(255,0,255)'>Magenta</span>.")
with Framework.Row():
with Framework.Column () :
Title_ImageBox_Output_Original=F"Input Image with Camera Views at Start and End"
Framework.Markdown ( F"#### {Title_ImageBox_Output_Original}" )
# !需要需要禁用更改Image功能,仅作为大屏展示|操作
ImageBox_Output_Original_Stepping_Tab=Framework.Image\
(
label = Title_ImageBox_Output_Original,
show_label = False,
# type=F"pil",
type=F"numpy",
#
# interactive = False,
# Due to the bug under solving, we have to work in interactive mode: https://github.com/gradio-app/gradio/issues/5945
interactive = True,
#
# editable = False,
# height = 600,
)
# with Framework.Row():
with Framework.Column () :
Framework.Markdown(F"#### Progress:")
Label_Progress_Camera_Generating=Framework.Label\
(
value =Progress_Default,
# label = F"Progress:",
label = F"",
# show_label = False,
)
Framework.Markdown(F"---")
Framework.Markdown ( F"### Method 1: Auto Zoom (Pre-set Camera Views)" )
CheckBox_Auto_Zoom_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Auto Zoom",
Value_Default_In = True,
)
Framework.Markdown ( F"---" )
Framework.Markdown ( F"### Method 2: Set Camera Views Manually" )
# Label_Camera_Start_Stepping_Tab=Framework.Label\
# (
# value =PlaceHolder_Label_Camera,
# label = F"Start Camera Location",
# # elem_classes = F"Label-Display-Position",
# )
Label_Camera_Start_Stepping_Tab=Framework.Markdown\
(
PlaceHolder_Label_Camera,
visible = IsAllActivatedControlDisplayed,
)
Title_Ratio_Crop_Start=F"Camera View at Start"
Framework.Markdown ( F"{Title_Ratio_Crop_Start}" )
Slider_Ratio_Crop_Camera_Start = Framework.Slider \
(
value = Ratio_Crop_Camera_Start_Deault , # 相当于default
minimum = Ratio_Crop_Minimum , # !考虑改为Constant
maximum = 1 , # !考虑改为Constant
step = 0.01 ,
# multiselect = True,
# label = Title_Ratio_Crop_Start ,
label = F"Width of Camera View at Start: Width of Input Image" ,
# show_label = False,
show_label = True,
)
Framework.Markdown\
(
F"---",
visible = IsAllActivatedControlDisplayed,
)
# with Framework.Row():
# with Framework.Column () :
Slider_Camera_Start_Width = Framework.Slider \
(
value = Width_Global , # 相当于default
minimum = Limit_Minimum , # !考虑改为Constant
maximum = Limit_Maxmum , # !考虑改为Constant
step = 1 ,
# multiselect = True,
label = F"Start Camera-Width (After Down Scaling)" ,
visible = IsAllActivatedControlDisplayed,
)
Slider_Camera_Start_Height = Framework.Slider \
(
value = Height_Global , # 相当于default
minimum = Limit_Minimum , # !考虑改为Constant
maximum = Limit_Maxmum , # !考虑改为Constant
step = 1 ,
# multiselect = True,
label = F"Start Camera-Height (After Down Scaling)" ,
visible = False,
)
# with Framework.Column () :
# Label_Camera_End_Stepping_Tab=Framework.Label\
# (
# value = PlaceHolder_Label_Camera,
# label = F"End Camera Location",
# # elem_classes = F"Label-Display-Position",
# )
Label_Camera_End_Stepping_Tab=Framework.Markdown\
(
PlaceHolder_Label_Camera,
visible = IsAllActivatedControlDisplayed,
)
Title_Ratio_Crop_End=F"Camera View at End"
Framework.Markdown ( F"{Title_Ratio_Crop_End}" )
Slider_Ratio_Crop_Camera_End = Framework.Slider \
(
value = Ratio_Crop_Camera_End_Deault , # 相当于default
minimum = Ratio_Crop_Minimum , # !考虑改为Constant
maximum = 1 , # !考虑改为Constant
step = 0.01 ,
# multiselect = True,
# label = Title_Ratio_Crop_End ,
label = F"Width of Camera View at End: Width of Input Image" ,
# show_label = False,
show_label = True,
)
Slider_Camera_End_Width = Framework.Slider \
(
value = Width_Global , # 相当于default
minimum = Limit_Minimum ,
maximum = Limit_Maxmum ,
step = 1 ,
# multiselect = True,
label = F"End Camera-Width (After Down Scaling)" ,
visible = IsAllActivatedControlDisplayed,
)
Slider_Camera_End_Height = Framework.Slider \
(
value = Height_Global , # 相当于default
minimum = Limit_Minimum ,
maximum = Limit_Maxmum ,
step = 1 ,
# multiselect = True,
label = F"End Camera-Height (After Down Scaling)" ,
visible = False,
)
Framework.Markdown ( F"---" )
Button_Generate_Camera_View_Stepping_Tab=Framework.Button\
(
F"Generate Camera View",
interactive = False,
)
# Framework.Markdown(F"#### The closer the Cameras are, the steadier the effect is.")
with Framework.Row\
(
visible = IsAllActivatedControlDisplayed,
):
Slider_Number_Frame_Stepping_Tab = Framework.Slider \
(
value = 75 , # 相当于default
minimum = 0 ,
maximum = 100 , # !Pending
step = 1 ,
# multiselect = True,
label = F"Frame Number" ,
)
CheckBox_IsInpainting_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Inpainting",
Value_Default_In = True,
)
Slider_Depthor_Stepping_Tab = Framework.Slider \
(
value = 3 , # 相当于default
minimum = 0 ,
maximum = 10 , # !Pending
step = 1 ,
# multiselect = True,
label = F"Depth Factor" ,
visible = False, # 目前认为不需要进行手动设置
)
Framework.Markdown(F"#### Inpainted Backgrounds")
with Framework.Row():
with Framework.Column():
Title_Camera_PositiveFilm_Start=F"Start"
Framework.Markdown(F"{Title_Camera_PositiveFilm_Start}")
ImageBox_Output_PositiveFilm_Start_Stepping_Tab=Framework.Image\
(
label = Title_Camera_PositiveFilm_Start ,
show_label = False,
# type=F"pil",
type=F"numpy",
interactive = False,
# editable = False,
height = 600 ,
)
with Framework.Column () :
Title_Camera_PositiveFilm_End = F"End"
Framework.Markdown ( F"{Title_Camera_PositiveFilm_End}" )
ImageBox_Output_PositiveFilm_End_Stepping_Tab=Framework.Image\
(
label = Title_Camera_PositiveFilm_End ,
show_label = False,
# type=F"pil",
type=F"numpy",
interactive = False,
# editable = False,
height = 600 ,
)
Framework.Markdown(F"#### Masks for Background Inpainting")
with Framework.Row():
with Framework.Column () :
Title_Camera_Mask_Start = F"Start"
Framework.Markdown ( F"{Title_Camera_Mask_Start}" )
ImageBox_Output_Mask_Start_Stepping_Tab=Framework.Image\
(
label = Title_Camera_Mask_Start ,
show_label = False,
# type=F"pil",
type=F"numpy",
interactive = False,
# editable = False,
height = 600 ,
)
with Framework.Column () :
Title_Camera_Mask_End = F"End"
Framework.Markdown ( F"{Title_Camera_Mask_End}" )
ImageBox_Output_Mask_End_Stepping_Tab=Framework.Image\
(
label = Title_Camera_Mask_End ,
show_label = False,
# type=F"pil",
type=F"numpy",
interactive = False,
# editable = False,
height = 600 ,
)
Framework.Markdown ( F"---" )
# Video Encoding Part
with Framework.Row():
with Framework.Column\
(
min_width = 200,
):
Framework.Markdown ( F"# Step 3. 3D Ken Burns Result" )
CheckBox_Depth_Field_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Depth Field",
Value_Default_In = False,
IsVisible_In = False,
)
with Framework.Column\
(
min_width = 200,
):
Button_Encode_Video_Stepping_Tab=Framework.Button\
(
F"Encode Video",
interactive = False,
# disable = True,
)
# Video Box已自带,不再需要,但是Video无法独立使用
with Framework.Column\
(
min_width = 200,
visible = IsAllActivatedControlDisplayed,
):
File_Output_Downloaing_Stepping_Tab=Framework.File \
(
# size=(300,100),
)
with Framework.Row():
# !需要缩小占用,最好以Button+浮层形式展示;或最佳的是类似Clip工具的横向Frame轴形式拉动(横向Scroll,纵向以单张Frame Height自适应)
with Framework.Column \
(
min_width = 200 ,
visible = IsAllActivatedControlDisplayed,
) :
Framework.Markdown\
(
F"#### After 1 Image clicked, use Left (**←**) | Right (**→**) to experience the animation effect.",
# visible = IsAllActivatedControlDisplayed,
)
BatchedImageBox_Output_ListFrame_Stepping_Tab = Create_Output_BatchedImageBox \
(
Name_In = F"Frame List" ,
Type_In = F"numpy" ,
# IsPreviewMode_In = True, # !慎用,会导致UI Thread死循环,UI直接卡死
Height_In = 400 ,
)
with Framework.Column(min_width = 300,visible = IsAllActivatedControlDisplayed):
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\
(
min_width = 100,
# visible = False,
):
Framework.Checkbox(visible = False)
with Framework.Column\
(
# width=1000,
) :
Framework.Markdown(F"### A **Five** Seconds Video in variant Frame Ratio.")
# with Framework.Row():
# Choose 1 Video related Control, then combined with File Control in same Column
VideoBox_Output_Stepping_Tab = Framework.PlayableVideo \
(
show_label = False,
# style={ "height" : "600px" },
# height=600,
# width=800,
# width=F"60%",
height = 600,
)
with Framework.Column\
(
min_width = 100,
# visible = False,
):
Framework.Checkbox(visible = False)
# !Add basic authority | permission, authors, references
# Bind Event handler
# Button_Submit_After_1st_Process_Stepping_Tab.click\
# (
# fn = DoOnButtonSubmit_AIS_Instance_Segmentation_Clicking,
# inputs =\
# [
# ImageBox_Input_Original_Stepping_Tab,
# ],
# outputs =\
# [
# ImageBox_After_1st_Process_Stepping_Tab,
# ],
# )
# Button_Submit_After_2nd_Process_Stepping_Tab.click\
# (
# fn = DoOnButtonSubmit_AIS_Infer_Disparity_Depth_Estimation_Clicking,
# inputs =\
# [
# # ImageBox_After_1st_Process_Stepping_Tab,
# ],
# outputs =\
# [
# ImageBox_After_2nd_Process_Stepping_Tab,
# ],
# )
# Button_Submit_After_3rd_Process_Stepping_Tab.click\
# (
# fn = DoOnButtonSubmit_AIS_Infer_Disparity_Depth_Coarse_Clicking,
# inputs =\
# [
# # ImageBox_After_2nd_Process_Stepping_Tab,
# ],
# outputs =\
# [
# ImageBox_After_3rd_Process_Stepping_Tab,
# ],
# )
# Button_Submit_After_4th_Process_Stepping_Tab.click\
# (
# fn = DoOnButtonSubmit_AIS_Infer_Disparity_Depth_Adjusted_Depth_Clicking,
# inputs =\
# [
# # ImageBox_After_3rd_Process_Stepping_Tab,
# ],
# outputs =\
# [
# ImageBox_Disparity_After_4th_Process_Stepping_Tab,
# ImageBox_After_4th_Process_Stepping_Tab,
# ],
# )
# Button_Submit_After_5th_Process_Stepping_Tab.click\
# (
# fn = DoOnButtonSubmit_AIS_Adjustment_Anime_Segmentation_TabClicking,
# inputs =\
# [
# # ImageBox_After_4th_Process_Stepping_Tab,
# ],
# outputs =\
# [
# ImageBox_Disparity_After_5th_Process_Stepping_Tab,
# ImageBox_After_5th_Process_Stepping_Tab,
# ],
# )
# ImageBox_Input_Original_Stepping_Tab.change\
# (
# # fn=DoOnImageBox_Input_Original_Stepping_TabChanged,
# fn=lambda Image_In_Out:[Image_In_Out,Image_In_Out,Image_In_Out,Image_In_Out,],
# inputs =\
# [
# ImageBox_Input_Original_Stepping_Tab,
# ],
# outputs =\
# [
# # ImageBox_After_1st_Process_Stepping_Tab,
# ImageBox_After_2nd_Process_Stepping_Tab,
# ImageBox_After_3rd_Process_Stepping_Tab,
# ImageBox_After_4th_Process_Stepping_Tab,
# ImageBox_After_5th_Process_Stepping_Tab,
# ],
# )
#
# ImageBox_Input_Original_Stepping_Tab.select\
# (
# fn=DoOnImageBox_Stepping_TabSelecting,
# inputs = \
# [
# Slider_Camera_Start_Width,
# Slider_Camera_End_Width,
# ] ,
# outputs = \
# [
# Label_Camera_Start_Stepping_Tab,
# Label_Camera_End_Stepping_Tab,
# ] ,
# )
ImageBox_Input_Original_Stepping_Tab.change\
(
fn=DoOnImageBox_Input_Original_Stepping_TabChanged,
inputs = \
[
ImageBox_Input_Original_Stepping_Tab,
Slider_Ratio_Crop_Camera_Start,
Slider_Ratio_Crop_Camera_End,
] ,
outputs = \
[
ImageBox_After_2nd_Process_Stepping_Tab,
ImageBox_After_3rd_Process_Stepping_Tab,
ImageBox_After_4th_Process_Stepping_Tab,
ImageBox_After_5th_Process_Stepping_Tab,
#
CheckBox_BoundingBox_Stepping_Tab,
CheckBox_InstanceMask_Stepping_Tab,
CheckBox_InstanceContour_Stepping_Tab,
CheckBox_Tag_List_Stepping_Tab,
Slider_Mask_α_Stepping_Tab,
#
ImageBox_Output_PositiveFilm_Start_Stepping_Tab,
ImageBox_Output_PositiveFilm_End_Stepping_Tab,
ImageBox_Output_Mask_Start_Stepping_Tab,
ImageBox_Output_Mask_End_Stepping_Tab,
#
CheckBox_Depth_Field_Stepping_Tab,
BatchedImageBox_Output_ListFrame_Stepping_Tab,
VideoBox_Output_Stepping_Tab,
#
Label_Camera_Start_Stepping_Tab,
Label_Camera_End_Stepping_Tab,
#
Slider_Number_Frame_Stepping_Tab,
CheckBox_IsInpainting_Stepping_Tab,
#
#
CheckBox_Auto_Zoom_Stepping_Tab,
#
#
Slider_Ratio_Crop_Camera_Start,
Slider_Camera_Start_Width,
Slider_Camera_Start_Height,
#
Slider_Ratio_Crop_Camera_End,
Slider_Camera_End_Width,
Slider_Camera_End_Height,
#
ImageBox_Output_Original_Stepping_Tab,
ImageBox_Output_Original_Contrast,
#
#
#
# VideoBox_Output_Stepping_Tab,
Label_Progress_Instance_Generating,
Label_Progress_Camera_Generating,
] ,
)
# ImageBox_Output_Original_Stepping_Tab.change\
# (
# fn=DoOnImageBox_Output_Original_Stepping_TabChanged,
# inputs = \
# [
# ImageBox_Output_Original_Stepping_Tab,
# ] ,
# outputs = \
# [
# ImageBox_Output_Original_Stepping_Tab,
# ] ,
# )
ImageBox_Output_Original_Stepping_Tab.select\
(
fn=DoOnImageBox_Stepping_TabSelecting,
inputs = \
[
ImageBox_Input_Original_Stepping_Tab,
ImageBox_Output_Original_Stepping_Tab,
# Slider_Camera_Start_Width,
# Slider_Camera_End_Width,
#
Slider_Ratio_Crop_Camera_Start,
Slider_Ratio_Crop_Camera_End,
] ,
outputs = \
[
ImageBox_Output_Original_Stepping_Tab,
# Slider_Camera_Start_Width,
# Slider_Camera_End_Width,
Label_Camera_Start_Stepping_Tab,
Label_Camera_End_Stepping_Tab,
] ,
)
CheckBox_Auto_Zoom_Stepping_Tab.change\
(
fn=DoOnCheckBox_Auto_Zoom_Stepping_TabChanged,
inputs = \
[
CheckBox_Auto_Zoom_Stepping_Tab,
ImageBox_Input_Original_Stepping_Tab,
] ,
outputs = \
[
ImageBox_Output_Original_Stepping_Tab,
] ,
)
# Slider_Camera_Start_Width.change\
# (
# fn = DoOnSlider_Camera_Start_Width_Stepping_TabChanged,
# inputs =\
# [
# Slider_Camera_Start_Width,
# ],
# outputs =\
# [
# # Slider_Camera_Start_Width,
# ],
# )
# Slider_Camera_Start_Height.change\
# (
# fn = DoOnSlider_Camera_Start_Height_Stepping_TabChanged,
# inputs =\
# [
# Slider_Camera_Start_Height,
# ],
# outputs =\
# [
# # Slider_Camera_Start_Height,
# ],
# )
# Slider_Camera_End_Width.change\
# (
# fn = DoOnSlider_Camera_End_Width_Stepping_TabChanged,
# inputs =\
# [
# Slider_Camera_End_Width,
# ],
# outputs =\
# [
# # Slider_Camera_End_Width,
# ],
# )
# Slider_Camera_End_Height.change\
# (
# fn = DoOnSlider_Camera_End_Height_Stepping_TabChanged,
# inputs =\
# [
# Slider_Camera_End_Height,
# ],
# outputs =\
# [
# # Slider_Camera_End_Height,
# ],
# )
Button_Run_With_Steps_Stepping_Tab.click\
(
fn = DoOnButton_Run_With_Steps_Stepping_TabClicking,
inputs =\
[
ImageBox_Input_Original_Stepping_Tab,
CheckBox_BoundingBox_Stepping_Tab,
CheckBox_InstanceMask_Stepping_Tab,
CheckBox_InstanceContour_Stepping_Tab,
CheckBox_Tag_List_Stepping_Tab,
Slider_Mask_α_Stepping_Tab,
],
outputs =\
[
# ImageBox_After_1st_Process_Stepping_Tab,
#
ImageBox_After_2nd_Process_Stepping_Tab,
#
ImageBox_After_3rd_Process_Stepping_Tab,
#
ImageBox_After_4th_Process_Stepping_Tab,
#
ImageBox_After_5th_Process_Stepping_Tab,
#
#
ImageBox_Output_Original_Stepping_Tab,
#
#
Button_Generate_Camera_View_Stepping_Tab,
#
#
Label_Progress_Instance_Generating,
],
)
Button_Generate_Camera_View_Stepping_Tab.click\
(
fn = DoOnButton_Generate_Camera_View_Stepping_TabClicking,
inputs =\
[
CheckBox_IsInpainting_Stepping_Tab,
#
Slider_Ratio_Crop_Camera_Start,
# Slider_Camera_Start_Width,
# Slider_Camera_Start_Height,
#
Slider_Ratio_Crop_Camera_End,
# Slider_Camera_End_Width,
# Slider_Camera_End_Height,
#
Slider_Number_Frame_Stepping_Tab,
CheckBox_Auto_Zoom_Stepping_Tab,
#
Slider_Depthor_Stepping_Tab,
CheckBox_Depth_Field_Stepping_Tab,
],
outputs =\
[
ImageBox_Output_PositiveFilm_Start_Stepping_Tab,
ImageBox_Output_PositiveFilm_End_Stepping_Tab,
ImageBox_Output_Mask_Start_Stepping_Tab,
ImageBox_Output_Mask_End_Stepping_Tab,
BatchedImageBox_Output_ListFrame_Stepping_Tab,
#
#
Button_Encode_Video_Stepping_Tab,
VideoBox_Output_Stepping_Tab,
#
#
Label_Progress_Camera_Generating,
],
)
Button_Encode_Video_Stepping_Tab.click\
(
fn = DoOnButton_Encode_Video_Stepping_TabClicking,
# inputs =\
# [
# # To Do
# ],
outputs =\
[
VideoBox_Output_Stepping_Tab,
File_Output_Downloaing_Stepping_Tab,
],
# outputs = VideoBox_Output_Stepping_Tab,
)
# !Gradio不能直接呈现URL,只能呈现HTML,但是Flask是基于URL,仅HTML则只有静态Framework
def Create_Original_Demonstration_Tab () :
with Framework.Tab ( F"Original Demonstration-Ken Burns" ) :
Framework.HTML(F"<a href=\"http://localhost:8080\">Original Demonstration</a>")
#endregion Anime Instance Segmentation
#endregion Customised
def Create_Information_Tab () :
with Framework.Tab ( F"Information" ): # Including Image information and Model information
with Framework.Row():
ImageBox_Input_TabInformation=Create_Batch_Input_ImageBox()
ImageBox_Output=Create_Output_BatchedImageBox() # !Need to be changed to Status Control|Component
def DoOnCheckBox_IsVerbosing_Setting_TabChanged (IsVerbosing_In) :
global IsVerbosing_Global
IsVerbosing_Global=IsVerbosing_In
# Debug
print(F"{IsVerbosing_In=} in {Inspect.currentframe().f_code.co_name}()")
print(F"{IsVerbosing_Global=} in {Inspect.currentframe().f_code.co_name}()")
def Create_Setting_Tab () :
with Framework.Tab ( F"Setting" ):
# with Framework.Row():
# Button_Apply_Setting = Create_ApplySetting_Button ()
# Button_Restart = Create_Restart_Button ()
with Framework.Row\
(
Title=F"Option",
# wrap=False,
# min_width = 180,
):
with Framework.Column():
CheckBox_IsVerbosing_Stepping_Tab = Create_Step_CheckBox\
(
Name_In = F"Verbose",
Value_Default_In = False,
Tip_In = F"If checked, Programme will generate intermediate | temporary Image Results in its Root Directory.",
)
#
CheckBox_IsVerbosing_Stepping_Tab.change\
(
fn = DoOnCheckBox_IsVerbosing_Setting_TabChanged,
inputs =\
[
CheckBox_IsVerbosing_Stepping_Tab,
],
outputs =\
[
# To Do
],
)
#endregion Function | Method