smartdigitalnetworks commited on
Commit
0a58477
·
verified ·
1 Parent(s): c68d848

Upload generativeexpressioneditor.py

Browse files
Files changed (1) hide show
  1. generativeexpressioneditor.py +172 -0
generativeexpressioneditor.py ADDED
@@ -0,0 +1,172 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import gradio as gr
3
+ from gradio_i18n import Translate, gettext as _
4
+
5
+ from modules.live_portrait.live_portrait_inferencer import LivePortraitInferencer
6
+ from modules.utils.paths import *
7
+ from modules.utils.helper import str2bool
8
+ from modules.utils.constants import *
9
+
10
+
11
+ class App:
12
+ def __init__(self,
13
+ args=None):
14
+ self.args = args
15
+ self.app = gr.Blocks(css="footer {display:none !important}")
16
+ self.i18n = Translate(I18N_YAML_PATH)
17
+ self.inferencer = LivePortraitInferencer(
18
+ model_dir=args.model_dir if args else MODELS_DIR,
19
+ output_dir=args.output_dir if args else OUTPUTS_DIR
20
+ )
21
+
22
+ @staticmethod
23
+ def create_expression_parameters():
24
+ return [
25
+ gr.Dropdown(label=_("Model Type"), visible=False, interactive=False,
26
+ choices=[item.value for item in ModelType], value=ModelType.HUMAN.value),
27
+ gr.Slider(label=_("Rotate Pitch"), minimum=-20, maximum=20, step=0.5, value=0),
28
+ gr.Slider(label=_("Rotate Yaw"), minimum=-20, maximum=20, step=0.5, value=0),
29
+ gr.Slider(label=_("Rotate Roll"), minimum=-20, maximum=20, step=0.5, value=0),
30
+ gr.Slider(label=_("Blink"), info=_("Value above 5 may appear distorted"), elem_id="blink_slider",
31
+ minimum=-20, maximum=20, step=0.5, value=0),
32
+ gr.Slider(label=_("Eyebrow"), minimum=-40, maximum=20, step=0.5, value=0),
33
+ gr.Slider(label=_("Wink"), minimum=0, maximum=25, step=0.5, value=0),
34
+ gr.Slider(label=_("Pupil X"), minimum=-20, maximum=20, step=0.5, value=0),
35
+ gr.Slider(label=_("Pupil Y"), minimum=-20, maximum=20, step=0.5, value=0),
36
+ gr.Slider(label=_("AAA"), minimum=-30, maximum=120, step=1, value=0),
37
+ gr.Slider(label=_("EEE"), minimum=-20, maximum=20, step=0.2, value=0),
38
+ gr.Slider(label=_("WOO"), minimum=-20, maximum=20, step=0.2, value=0),
39
+ gr.Slider(label=_("Smile"), minimum=-2.0, maximum=2.0, step=0.01, value=0),
40
+ gr.Slider(label=_("Source Ratio"), minimum=0, maximum=1, step=0.01, value=1),
41
+ gr.Slider(label=_("Sample Ratio"), minimum=-0.2, maximum=1.2, step=0.01, value=1, visible=False),
42
+ gr.Dropdown(label=_("Sample Parts"), visible=False,
43
+ choices=[part.value for part in SamplePart], value=SamplePart.ALL.value),
44
+ gr.Slider(label=_("Face Crop Factor"), minimum=1.5, maximum=2.5, step=0.1, value=2),
45
+ gr.Checkbox(label=_("Enable Image Restoration"),
46
+ info=_("This enables image restoration with RealESRGAN but slows down the speed"), value=False)
47
+ ]
48
+
49
+ @staticmethod
50
+ def create_video_parameters():
51
+ return [
52
+ gr.Dropdown(label=_("Model Type"), visible=False, interactive=False,
53
+ choices=[item.value for item in ModelType],
54
+ value=ModelType.HUMAN.value),
55
+ gr.Slider(label=_("First frame eyes alignment factor"), minimum=0, maximum=1, step=0.01, value=1),
56
+ gr.Slider(label=_("First frame mouth alignment factor"), minimum=0, maximum=1, step=0.01, value=1),
57
+ gr.Slider(label=_("Face Crop Factor"), minimum=1.5, maximum=2.5, step=0.1, value=2),
58
+ gr.Checkbox(label=_("Enable Image Restoration"),
59
+ info=_("This enables image restoration with RealESRGAN but slows down the speed"), value=False)
60
+ ]
61
+
62
+ def launch(self):
63
+ with self.app:
64
+ with self.i18n:
65
+ gr.Markdown("# 📋 Generative Expression Editor")
66
+
67
+ with gr.Tabs():
68
+ with gr.TabItem(_("Expression Editor")):
69
+ with gr.Row():
70
+ with gr.Column():
71
+ img_ref = gr.Image(label=_("Reference Image"))
72
+ with gr.Row():
73
+ btn_gen = gr.Button("GENERATE", visible=False)
74
+ with gr.Row(equal_height=True):
75
+ with gr.Column(scale=9):
76
+ img_out = gr.Image(label=_("Output Image"))
77
+ with gr.Column(scale=1):
78
+ expression_parameters = self.create_expression_parameters()
79
+ btn_openfolder = gr.Button('📂')
80
+ with gr.Accordion("Opt in features", visible=False):
81
+ img_sample = gr.Image()
82
+
83
+ params = expression_parameters + [img_ref]
84
+ opt_in_features_params = [img_sample]
85
+
86
+ gr.on(
87
+ triggers=[param.change for param in params],
88
+ fn=self.inferencer.edit_expression,
89
+ inputs=params + opt_in_features_params,
90
+ outputs=img_out,
91
+ queue=True
92
+ )
93
+
94
+ btn_openfolder.click(
95
+ fn=lambda: self.open_folder(self.args.output_dir), inputs=None, outputs=None
96
+ )
97
+
98
+ btn_gen.click(self.inferencer.edit_expression,
99
+ inputs=params + opt_in_features_params,
100
+ outputs=img_out)
101
+
102
+ with gr.TabItem(_("Video Driven")):
103
+ with gr.Row():
104
+ img_ref = gr.Image(label=_("Reference Image"))
105
+ vid_driven = gr.Video(label=_("Expression Video"), max_length=2)
106
+ with gr.Column():
107
+ vid_params = self.create_video_parameters()
108
+
109
+ with gr.Row():
110
+ btn_gen = gr.Button(_("GENERATE"), variant="primary")
111
+ with gr.Row(equal_height=True):
112
+ with gr.Column(scale=9):
113
+ vid_out = gr.Video(label=_("Output Video"), scale=9)
114
+ with gr.Column(scale=1):
115
+ btn_openfolder = gr.Button('📂')
116
+
117
+ params = vid_params + [img_ref, vid_driven]
118
+
119
+ btn_gen.click(
120
+ fn=self.inferencer.create_video,
121
+ inputs=params,
122
+ outputs=vid_out
123
+ )
124
+ btn_openfolder.click(
125
+ fn=lambda: self.open_folder(os.path.join(self.args.output_dir, "videos")),
126
+ inputs=None, outputs=None
127
+ )
128
+
129
+ gradio_launch_args = {
130
+ "inbrowser": self.args.inbrowser,
131
+ "share": self.args.share,
132
+ "server_name": self.args.server_name,
133
+ "server_port": self.args.server_port,
134
+ "root_path": self.args.root_path,
135
+ "auth": (self.args.username, self.args.password) if self.args.username and self.args.password else None,
136
+ }
137
+ self.app.queue(
138
+ default_concurrency_limit=1
139
+ ).launch(**gradio_launch_args)
140
+
141
+ @staticmethod
142
+ def open_folder(folder_path: str):
143
+ if not os.path.exists(folder_path):
144
+ os.makedirs(folder_path, exist_ok=True)
145
+ print(f"The directory path {folder_path} has newly created.")
146
+ os.system(f"start {folder_path}")
147
+
148
+ # Agent5.com producers JulieConn.com JerryHesketh.com SmartDigitalNetworks.com
149
+
150
+ if __name__ == "__main__":
151
+
152
+ parser = argparse.ArgumentParser()
153
+ parser.add_argument('--share', type=str2bool, default=False, nargs='?', const=True, help='Gradio share value')
154
+ parser.add_argument('--inbrowser', type=str2bool, default=True, nargs='?', const=True,
155
+ help='Whether to automatically starts on the browser or not')
156
+ parser.add_argument('--server_name', type=str, default=None, help='Gradio server host')
157
+ parser.add_argument('--server_port', type=int, default=None, help='Gradio server port')
158
+ parser.add_argument('--root_path', type=str, default=None, help='Gradio root path')
159
+ parser.add_argument('--username', type=str, default=None, help='Gradio authentication username')
160
+ parser.add_argument('--password', type=str, default=None, help='Gradio authentication password')
161
+ parser.add_argument('--model_dir', type=str, default=MODELS_DIR,
162
+ help='Directory path of the LivePortrait models')
163
+ parser.add_argument('--output_dir', type=str, default=OUTPUTS_DIR,
164
+ help='Directory path of the outputs')
165
+ _args = parser.parse_args()
166
+
167
+ app = App(args=_args)
168
+ app.launch()
169
+
170
+
171
+
172
+