| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import traceback | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-12 18:40:06 +03:00
										 |  |  | from modules import shared, devices | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  | from modules.shared import cmd_opts | 
					
						
							| 
									
										
										
										
											2022-09-07 12:32:28 +03:00
										 |  |  | from modules.paths import script_path | 
					
						
							|  |  |  | import modules.face_restoration | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gfpgan_model_path(): | 
					
						
							| 
									
										
										
										
											2022-09-07 12:32:28 +03:00
										 |  |  |     from modules.shared import cmd_opts | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  |     places = [script_path, '.', os.path.join(cmd_opts.gfpgan_dir, 'experiments/pretrained_models')] | 
					
						
							|  |  |  |     files = [cmd_opts.gfpgan_model] + [os.path.join(dirname, cmd_opts.gfpgan_model) for dirname in places] | 
					
						
							|  |  |  |     found = [x for x in files if os.path.exists(x)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if len(found) == 0: | 
					
						
							|  |  |  |         raise Exception("GFPGAN model not found in paths: " + ", ".join(files)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return found[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | loaded_gfpgan_model = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gfpgan(): | 
					
						
							|  |  |  |     global loaded_gfpgan_model | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 17:28:30 +03:00
										 |  |  |     if loaded_gfpgan_model is not None: | 
					
						
							| 
									
										
										
										
											2022-09-12 18:40:06 +03:00
										 |  |  |         loaded_gfpgan_model.gfpgan.to(shared.device) | 
					
						
							| 
									
										
										
										
											2022-09-03 17:28:30 +03:00
										 |  |  |         return loaded_gfpgan_model | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 17:28:30 +03:00
										 |  |  |     if gfpgan_constructor is None: | 
					
						
							|  |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     model = gfpgan_constructor(model_path=gfpgan_model_path(), upscale=1, arch='clean', channel_multiplier=2, bg_upsampler=None) | 
					
						
							| 
									
										
										
										
											2022-09-12 18:40:06 +03:00
										 |  |  |     model.gfpgan.to(shared.device) | 
					
						
							|  |  |  |     loaded_gfpgan_model = model | 
					
						
							| 
									
										
										
										
											2022-09-03 17:28:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return model | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gfpgan_fix_faces(np_image): | 
					
						
							| 
									
										
										
										
											2022-09-12 18:40:06 +03:00
										 |  |  |     model = gfpgan() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  |     np_image_bgr = np_image[:, :, ::-1] | 
					
						
							| 
									
										
										
										
											2022-09-12 18:40:06 +03:00
										 |  |  |     cropped_faces, restored_faces, gfpgan_output_bgr = model.enhance(np_image_bgr, has_aligned=False, only_center_face=False, paste_back=True) | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  |     np_image = gfpgan_output_bgr[:, :, ::-1] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-12 18:40:06 +03:00
										 |  |  |     if shared.opts.face_restoration_unload: | 
					
						
							|  |  |  |         model.gfpgan.to(devices.cpu) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  |     return np_image | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | have_gfpgan = False | 
					
						
							|  |  |  | gfpgan_constructor = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def setup_gfpgan(): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         gfpgan_model_path() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if os.path.exists(cmd_opts.gfpgan_dir): | 
					
						
							|  |  |  |             sys.path.append(os.path.abspath(cmd_opts.gfpgan_dir)) | 
					
						
							|  |  |  |         from gfpgan import GFPGANer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         global have_gfpgan | 
					
						
							|  |  |  |         have_gfpgan = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         global gfpgan_constructor | 
					
						
							|  |  |  |         gfpgan_constructor = GFPGANer | 
					
						
							| 
									
										
										
										
											2022-09-07 12:32:28 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         class FaceRestorerGFPGAN(modules.face_restoration.FaceRestoration): | 
					
						
							|  |  |  |             def name(self): | 
					
						
							|  |  |  |                 return "GFPGAN" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def restore(self, np_image): | 
					
						
							|  |  |  |                 np_image_bgr = np_image[:, :, ::-1] | 
					
						
							|  |  |  |                 cropped_faces, restored_faces, gfpgan_output_bgr = gfpgan().enhance(np_image_bgr, has_aligned=False, only_center_face=False, paste_back=True) | 
					
						
							|  |  |  |                 np_image = gfpgan_output_bgr[:, :, ::-1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return np_image | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         shared.face_restorers.append(FaceRestorerGFPGAN()) | 
					
						
							| 
									
										
										
										
											2022-09-03 12:08:45 +03:00
										 |  |  |     except Exception: | 
					
						
							|  |  |  |         print("Error setting up GFPGAN:", file=sys.stderr) | 
					
						
							|  |  |  |         print(traceback.format_exc(), file=sys.stderr) |