Astridkraft commited on
Commit
f450b0f
·
verified ·
1 Parent(s): acd60f4

Update controlnet_facefix.py

Browse files
Files changed (1) hide show
  1. controlnet_facefix.py +13 -21
controlnet_facefix.py CHANGED
@@ -3,17 +3,13 @@ from diffusers import StableDiffusionControlNetInpaintPipeline, ControlNetModel
3
  from controlnet_aux import OpenposeDetector, ZoeDetector
4
  from PIL import Image
5
 
6
- # ───── Globale Modelle (einmal laden, bleibt im VRAM) ─────
7
- print("Lade OpenPose_faceonly + Depth für perfekte Gesichter/Hände...")
8
 
9
- # OpenPose Face-Only Preprocessor + ControlNet
10
- openpose_face = OpenposeDetector.from_pretrained(
11
- "lllyasviel/ControlNet", model_name="openpose_face"
12
- )
13
-
14
- # Depth Preprocessor + ControlNet
15
  depth_processor = ZoeDetector.from_pretrained("lllyasviel/ControlNet")
16
 
 
17
  controlnet_face = ControlNetModel.from_pretrained(
18
  "lllyasviel/control_v11p_sd15_openpose",
19
  subfolder="faceonly",
@@ -25,44 +21,40 @@ controlnet_depth = ControlNetModel.from_pretrained(
25
  torch_dtype=torch.float16
26
  ).to("cuda")
27
 
28
- # Pipeline-Cache (wird erst beim ersten Aufruf erstellt)
29
  _facefix_pipe = None
30
 
31
  def _get_facefix_pipeline(model_id: str):
32
  global _facefix_pipe
33
  if _facefix_pipe is None:
34
- print(f"Lade Face-Fix-Pipeline mit Modell: {model_id}")
35
  _facefix_pipe = StableDiffusionControlNetInpaintPipeline.from_pretrained(
36
  model_id,
37
  controlnet=[controlnet_face, controlnet_depth],
38
  torch_dtype=torch.float16,
39
  safety_checker=None,
40
- requires_safety_checker=False,
41
  ).to("cuda")
42
  _facefix_pipe.enable_xformers_memory_efficient_attention()
43
- _facefix_pipe.enable_model_cpu_offload() # spart ~2 GB bei 16 GB Karten
44
  return _facefix_pipe
45
 
46
- def apply_facefix(image: Image.Image, prompt: str, negative_prompt: str, seed: int, base_model_path: str):
47
- """
48
- Automatischer 20-Sekunden-Fix für perfekte Gesichter & Hände
49
- """
50
- pipe = _get_facefix_pipeline(base_model_path)
51
 
52
- # Control-Images aus dem generierten Bild erzeugen
53
  pose_img = openpose_face(image)
54
  depth_img = depth_processor(image)
55
 
56
- fixed_image = pipe(
57
  prompt=prompt,
58
  negative_prompt=negative_prompt,
59
  image=image,
60
  control_image=[pose_img, depth_img],
61
- controlnet_conditioning_scale=[0.85, 0.60], # Face stark, Depth mittel
62
  strength=0.42,
63
  num_inference_steps=20,
64
  guidance_scale=7.0,
65
  generator=torch.Generator("cuda").manual_seed(seed),
66
  ).images[0]
67
 
68
- return fixed_image
 
3
  from controlnet_aux import OpenposeDetector, ZoeDetector
4
  from PIL import Image
5
 
6
+ print("Lade OpenPose_faceonly + Depth für perfekte Gesichter...")
 
7
 
8
+ # Preprocessors (einmalig laden)
9
+ openpose_face = OpenposeDetector.from_pretrained("lllyasviel/ControlNet", model_name="openpose_face")
 
 
 
 
10
  depth_processor = ZoeDetector.from_pretrained("lllyasviel/ControlNet")
11
 
12
+ # ControlNet Modelle (bleiben im VRAM)
13
  controlnet_face = ControlNetModel.from_pretrained(
14
  "lllyasviel/control_v11p_sd15_openpose",
15
  subfolder="faceonly",
 
21
  torch_dtype=torch.float16
22
  ).to("cuda")
23
 
24
+ # Pipeline-Cache
25
  _facefix_pipe = None
26
 
27
  def _get_facefix_pipeline(model_id: str):
28
  global _facefix_pipe
29
  if _facefix_pipe is None:
30
+ print(f"Lade Face-Fix-Pipeline für Modell: {model_id}")
31
  _facefix_pipe = StableDiffusionControlNetInpaintPipeline.from_pretrained(
32
  model_id,
33
  controlnet=[controlnet_face, controlnet_depth],
34
  torch_dtype=torch.float16,
35
  safety_checker=None,
 
36
  ).to("cuda")
37
  _facefix_pipe.enable_xformers_memory_efficient_attention()
38
+ _facefix_pipe.enable_model_cpu_offload() # spart ~2 GB!
39
  return _facefix_pipe
40
 
41
+ def apply_facefix(image: Image.Image, prompt: str, negative_prompt: str, seed: int, model_id: str):
42
+ pipe = _get_facefix_pipeline(model_id)
 
 
 
43
 
44
+ # Control-Images erzeugen
45
  pose_img = openpose_face(image)
46
  depth_img = depth_processor(image)
47
 
48
+ fixed = pipe(
49
  prompt=prompt,
50
  negative_prompt=negative_prompt,
51
  image=image,
52
  control_image=[pose_img, depth_img],
53
+ controlnet_conditioning_scale=[0.85, 0.60],
54
  strength=0.42,
55
  num_inference_steps=20,
56
  guidance_scale=7.0,
57
  generator=torch.Generator("cuda").manual_seed(seed),
58
  ).images[0]
59
 
60
+ return fixed