functional gallery for movie frames
This commit is contained in:
parent
2a2886157f
commit
1950844705
|
@ -50,17 +50,19 @@ class BlendingFrontend():
|
||||||
self.list_seeds = []
|
self.list_seeds = []
|
||||||
self.list_images_preview = []
|
self.list_images_preview = []
|
||||||
self.data = []
|
self.data = []
|
||||||
self.idx_img_selected = None
|
self.idx_img_preview_selected = None
|
||||||
|
self.idx_img_movie_selected = None
|
||||||
self.jpg_quality = 80
|
self.jpg_quality = 80
|
||||||
self.fp_movie = ''
|
self.fp_movie = ''
|
||||||
self.duration_single_trans = 10
|
self.duration_single_trans = 10
|
||||||
|
|
||||||
|
|
||||||
def preview_img_selected(self, data: gr.SelectData, button):
|
def preview_img_selected(self, data: gr.SelectData, button):
|
||||||
self.idx_img_selected = data.index
|
self.idx_img_preview_selected = data.index
|
||||||
print(f"gallery image {self.idx_img_selected} selected, seed {self.list_seeds[self.idx_img_selected]}")
|
print(f"preview image {self.idx_img_preview_selected} selected, seed {self.list_seeds[self.idx_img_preview_selected]}")
|
||||||
return gr.Button(interactive=True)
|
|
||||||
|
|
||||||
|
def movie_img_selected(self, data: gr.SelectData, button):
|
||||||
|
self.idx_img_movie_selected = data.index
|
||||||
|
print(f"movie image {self.idx_img_movie_selected} selected")
|
||||||
|
|
||||||
def compute_imgs(self, prompt, negative_prompt):
|
def compute_imgs(self, prompt, negative_prompt):
|
||||||
self.prompt = prompt
|
self.prompt = prompt
|
||||||
|
@ -70,7 +72,7 @@ class BlendingFrontend():
|
||||||
self.be.set_negative_prompt(negative_prompt)
|
self.be.set_negative_prompt(negative_prompt)
|
||||||
self.list_seeds = []
|
self.list_seeds = []
|
||||||
self.list_images_preview = []
|
self.list_images_preview = []
|
||||||
self.idx_img_selected = None
|
self.idx_img_preview_selected = None
|
||||||
for i in range(self.nmb_preview_images):
|
for i in range(self.nmb_preview_images):
|
||||||
seed = np.random.randint(0, np.iinfo(np.int32).max)
|
seed = np.random.randint(0, np.iinfo(np.int32).max)
|
||||||
self.be.seed1 = seed
|
self.be.seed1 = seed
|
||||||
|
@ -85,15 +87,21 @@ class BlendingFrontend():
|
||||||
|
|
||||||
|
|
||||||
def get_list_images_movie(self):
|
def get_list_images_movie(self):
|
||||||
return [entry["preview_image"] for entry in self.data[1:]]
|
return [entry["preview_image"] for entry in self.data]
|
||||||
|
|
||||||
|
|
||||||
def init_new_movie(self):
|
def init_new_movie(self):
|
||||||
current_time = datetime.datetime.now()
|
current_time = datetime.datetime.now()
|
||||||
self.fp_movie = "movie_" + current_time.strftime("%y%m%d_%H%M") + ".mp4"
|
self.fp_movie = "movie_" + current_time.strftime("%y%m%d_%H%M") + ".mp4"
|
||||||
self.fp_json = "movie_" + current_time.strftime("%y%m%d_%H%M") + ".json"
|
self.fp_json = "movie_" + current_time.strftime("%y%m%d_%H%M") + ".json"
|
||||||
self.data.append({"settings": "sdxl", "width": bf.be.dh.width_img, "height": self.be.dh.height_img, "num_inference_steps": self.be.dh.num_inference_steps})
|
|
||||||
|
|
||||||
|
def write_json(self):
|
||||||
|
# Write the data list to a JSON file
|
||||||
|
data_copy = self.data.copy()
|
||||||
|
data_copy.insert(0, {"settings": "sdxl", "width": self.be.dh.width_img, "height": self.be.dh.height_img, "num_inference_steps": self.be.dh.num_inference_steps})
|
||||||
|
with open(self.fp_json, 'w') as f:
|
||||||
|
json.dump(data_copy, f, indent=4)
|
||||||
|
|
||||||
def add_image_to_video(self):
|
def add_image_to_video(self):
|
||||||
if self.prompt is None:
|
if self.prompt is None:
|
||||||
|
@ -103,21 +111,45 @@ class BlendingFrontend():
|
||||||
self.init_new_movie()
|
self.init_new_movie()
|
||||||
|
|
||||||
self.data.append({"iteration": self.idx_movie,
|
self.data.append({"iteration": self.idx_movie,
|
||||||
"seed": self.list_seeds[self.idx_img_selected],
|
"seed": self.list_seeds[self.idx_img_preview_selected],
|
||||||
"prompt": self.prompt,
|
"prompt": self.prompt,
|
||||||
"negative_prompt": self.negative_prompt,
|
"negative_prompt": self.negative_prompt,
|
||||||
"preview_image": self.list_images_preview[self.idx_img_selected]
|
"preview_image": self.list_images_preview[self.idx_img_preview_selected]
|
||||||
})
|
})
|
||||||
|
|
||||||
# Write the data list to a JSON file
|
self.write_json()
|
||||||
with open(self.fp_json, 'w') as f:
|
|
||||||
json.dump(self.data, f, indent=4)
|
|
||||||
|
|
||||||
self.idx_movie += 1
|
self.idx_movie += 1
|
||||||
self.prompt = None
|
|
||||||
|
|
||||||
return self.get_list_images_movie()
|
return self.get_list_images_movie()
|
||||||
|
|
||||||
|
def img_movie_delete(self):
|
||||||
|
if self.idx_img_movie_selected is not None and 0 <= self.idx_img_movie_selected < len(self.data)+1:
|
||||||
|
del self.data[self.idx_img_movie_selected]
|
||||||
|
self.idx_img_movie_selected = None
|
||||||
|
else:
|
||||||
|
print("Invalid movie image index for deletion.")
|
||||||
|
return self.get_list_images_movie()
|
||||||
|
|
||||||
|
def img_movie_later(self):
|
||||||
|
if self.idx_img_movie_selected is not None and self.idx_img_movie_selected < len(self.data):
|
||||||
|
# Swap the selected image with the next one
|
||||||
|
self.data[self.idx_img_movie_selected], self.data[self.idx_img_movie_selected + 1] = \
|
||||||
|
self.data[self.idx_img_movie_selected+1], self.data[self.idx_img_movie_selected]
|
||||||
|
self.idx_img_movie_selected = None
|
||||||
|
else:
|
||||||
|
print("Cannot move the image later in the sequence.")
|
||||||
|
return self.get_list_images_movie()
|
||||||
|
|
||||||
|
def img_movie_earlier(self):
|
||||||
|
if self.idx_img_movie_selected is not None and self.idx_img_movie_selected > 0:
|
||||||
|
# Swap the selected image with the previous one
|
||||||
|
self.data[self.idx_img_movie_selected-1], self.data[self.idx_img_movie_selected] = \
|
||||||
|
self.data[self.idx_img_movie_selected], self.data[self.idx_img_movie_selected-1]
|
||||||
|
self.idx_img_movie_selected = None
|
||||||
|
else:
|
||||||
|
print("Cannot move the image earlier in the sequence.")
|
||||||
|
return self.get_list_images_movie()
|
||||||
|
|
||||||
|
|
||||||
def generate_movie(self):
|
def generate_movie(self):
|
||||||
print("starting movie gen")
|
print("starting movie gen")
|
||||||
list_prompts = []
|
list_prompts = []
|
||||||
|
@ -125,7 +157,7 @@ class BlendingFrontend():
|
||||||
list_seeds = []
|
list_seeds = []
|
||||||
|
|
||||||
# Extract prompts, negative prompts, and seeds from the data
|
# Extract prompts, negative prompts, and seeds from the data
|
||||||
for item in self.data[1:]: # Skip the first item as it contains settings
|
for item in self.data:
|
||||||
list_prompts.append(item["prompt"])
|
list_prompts.append(item["prompt"])
|
||||||
list_negative_prompts.append(item["negative_prompt"])
|
list_negative_prompts.append(item["negative_prompt"])
|
||||||
list_seeds.append(item["seed"])
|
list_seeds.append(item["seed"])
|
||||||
|
@ -183,8 +215,7 @@ if __name__ == "__main__":
|
||||||
prompt = gr.Textbox(label="prompt")
|
prompt = gr.Textbox(label="prompt")
|
||||||
negative_prompt = gr.Textbox(label="negative prompt")
|
negative_prompt = gr.Textbox(label="negative prompt")
|
||||||
b_compute = gr.Button('generate preview images', variant='primary')
|
b_compute = gr.Button('generate preview images', variant='primary')
|
||||||
|
b_select = gr.Button('add selected image to video', variant='primary')
|
||||||
# with gr.Row():
|
|
||||||
|
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
|
@ -193,10 +224,6 @@ if __name__ == "__main__":
|
||||||
, columns=[bf.nmb_preview_images], rows=[1], object_fit="contain", height="auto", allow_preview=False, interactive=False)
|
, columns=[bf.nmb_preview_images], rows=[1], object_fit="contain", height="auto", allow_preview=False, interactive=False)
|
||||||
|
|
||||||
|
|
||||||
with gr.Row():
|
|
||||||
b_select = gr.Button('add selected image to video', variant='primary', interactive=False)
|
|
||||||
|
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
gr.Markdown("Your movie contains so far the below frames")
|
gr.Markdown("Your movie contains so far the below frames")
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
|
@ -204,18 +231,27 @@ if __name__ == "__main__":
|
||||||
label="Generated images", show_label=False, elem_id="gallery"
|
label="Generated images", show_label=False, elem_id="gallery"
|
||||||
, columns=[20], rows=[1], object_fit="contain", height="auto", allow_preview=False, interactive=False)
|
, columns=[20], rows=[1], object_fit="contain", height="auto", allow_preview=False, interactive=False)
|
||||||
|
|
||||||
|
|
||||||
|
with gr.Row():
|
||||||
|
b_delete = gr.Button('delete selected image')
|
||||||
|
b_move_earlier = gr.Button('move to earlier time')
|
||||||
|
b_move_later = gr.Button('move to later time')
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
b_generate_movie = gr.Button('generate movie', variant='primary')
|
b_generate_movie = gr.Button('generate movie', variant='primary')
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
movie = gr.Video()
|
movie = gr.Video()
|
||||||
|
|
||||||
|
|
||||||
# bindings
|
# bindings
|
||||||
b_compute.click(bf.compute_imgs, inputs=[prompt, negative_prompt], outputs=gallery_preview)
|
b_compute.click(bf.compute_imgs, inputs=[prompt, negative_prompt], outputs=gallery_preview)
|
||||||
b_select.click(bf.add_image_to_video, None, gallery_movie)
|
b_select.click(bf.add_image_to_video, None, gallery_movie)
|
||||||
b_generate_movie.click(bf.generate_movie, None, movie)
|
b_generate_movie.click(bf.generate_movie, None, movie)
|
||||||
gallery_preview.select(bf.preview_img_selected, None, b_select)
|
gallery_preview.select(bf.preview_img_selected, None, None)
|
||||||
|
gallery_movie.select(bf.movie_img_selected, None, None)
|
||||||
|
b_delete.click(bf.img_movie_delete, None, gallery_movie)
|
||||||
|
b_move_earlier.click(bf.img_movie_earlier, None, gallery_movie)
|
||||||
|
b_move_later.click(bf.img_movie_later, None, gallery_movie)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue