Skip to content

Commit ebc1baf

Browse files
Merge pull request #12479 from catboxanon/fix/extras-generator
Refactor postprocessing/extras tab to use generator to resolve OOM issues
2 parents 9dae70d + 7c9c19b commit ebc1baf

File tree

1 file changed

+31
-32
lines changed

1 file changed

+31
-32
lines changed

modules/postprocessing.py

+31-32
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,32 @@ def run_postprocessing(extras_mode, image, image_folder, input_dir, output_dir,
1111

1212
shared.state.begin(job="extras")
1313

14-
image_data = []
15-
image_names = []
1614
outputs = []
1715

18-
if extras_mode == 1:
19-
for img in image_folder:
20-
if isinstance(img, Image.Image):
21-
image = img
22-
fn = ''
23-
else:
24-
image = Image.open(os.path.abspath(img.name))
25-
fn = os.path.splitext(img.orig_name)[0]
26-
image_data.append(image)
27-
image_names.append(fn)
28-
elif extras_mode == 2:
29-
assert not shared.cmd_opts.hide_ui_dir_config, '--hide-ui-dir-config option must be disabled'
30-
assert input_dir, 'input directory not selected'
31-
32-
image_list = shared.listfiles(input_dir)
33-
for filename in image_list:
34-
try:
35-
image = Image.open(filename)
36-
except Exception:
37-
continue
38-
image_data.append(image)
39-
image_names.append(filename)
40-
else:
41-
assert image, 'image not selected'
42-
43-
image_data.append(image)
44-
image_names.append(None)
16+
def get_images(extras_mode, image, image_folder, input_dir):
17+
if extras_mode == 1:
18+
for img in image_folder:
19+
if isinstance(img, Image.Image):
20+
image = img
21+
fn = ''
22+
else:
23+
image = Image.open(os.path.abspath(img.name))
24+
fn = os.path.splitext(img.orig_name)[0]
25+
yield image, fn
26+
elif extras_mode == 2:
27+
assert not shared.cmd_opts.hide_ui_dir_config, '--hide-ui-dir-config option must be disabled'
28+
assert input_dir, 'input directory not selected'
29+
30+
image_list = shared.listfiles(input_dir)
31+
for filename in image_list:
32+
try:
33+
image = Image.open(filename)
34+
except Exception:
35+
continue
36+
yield image, filename
37+
else:
38+
assert image, 'image not selected'
39+
yield image, None
4540

4641
if extras_mode == 2 and output_dir != '':
4742
outpath = output_dir
@@ -50,14 +45,16 @@ def run_postprocessing(extras_mode, image, image_folder, input_dir, output_dir,
5045

5146
infotext = ''
5247

53-
for image, name in zip(image_data, image_names):
48+
for image_data, name in get_images(extras_mode, image, image_folder, input_dir):
49+
image_data: Image.Image
50+
5451
shared.state.textinfo = name
5552

56-
parameters, existing_pnginfo = images.read_info_from_image(image)
53+
parameters, existing_pnginfo = images.read_info_from_image(image_data)
5754
if parameters:
5855
existing_pnginfo["parameters"] = parameters
5956

60-
pp = scripts_postprocessing.PostprocessedImage(image.convert("RGB"))
57+
pp = scripts_postprocessing.PostprocessedImage(image_data.convert("RGB"))
6158

6259
scripts.scripts_postproc.run(pp, args)
6360

@@ -78,6 +75,8 @@ def run_postprocessing(extras_mode, image, image_folder, input_dir, output_dir,
7875
if extras_mode != 2 or show_extras_results:
7976
outputs.append(pp.image)
8077

78+
image_data.close()
79+
8180
devices.torch_gc()
8281

8382
return outputs, ui_common.plaintext_to_html(infotext), ''

0 commit comments

Comments
 (0)