Spaces:
Runtime error
Runtime error
Commit
·
a056202
1
Parent(s):
a2d7ecf
Revert move_to_gpu, let face_app stays on cpu
Browse files- ConsistentID/lib/pipeline_ConsistentID.py +1 -5
- adaface/face_id_to_ada_prompt.py +7 -5
- app.py +16 -18
ConsistentID/lib/pipeline_ConsistentID.py
CHANGED
|
@@ -72,15 +72,11 @@ class ConsistentIDPipeline(StableDiffusionPipeline):
|
|
| 72 |
self.id_image_processor = CLIPImageProcessor()
|
| 73 |
self.crop_size = 512
|
| 74 |
|
| 75 |
-
'''
|
| 76 |
# face_app: FaceAnalysis object
|
| 77 |
self.face_app = FaceAnalysis(name="buffalo_l", root='models/insightface',
|
| 78 |
providers=['CPUExecutionProvider'])
|
| 79 |
# The original det_size=(640, 640) is too large and face_app often fails to detect faces.
|
| 80 |
-
self.face_app.prepare(ctx_id=0, det_size=(
|
| 81 |
-
'''
|
| 82 |
-
# Will be initialized within adaface.
|
| 83 |
-
self.face_app = None
|
| 84 |
|
| 85 |
if not os.path.exists(consistentID_weight_path):
|
| 86 |
### Download pretrained models
|
|
|
|
| 72 |
self.id_image_processor = CLIPImageProcessor()
|
| 73 |
self.crop_size = 512
|
| 74 |
|
|
|
|
| 75 |
# face_app: FaceAnalysis object
|
| 76 |
self.face_app = FaceAnalysis(name="buffalo_l", root='models/insightface',
|
| 77 |
providers=['CPUExecutionProvider'])
|
| 78 |
# The original det_size=(640, 640) is too large and face_app often fails to detect faces.
|
| 79 |
+
self.face_app.prepare(ctx_id=0, det_size=(512, 512))
|
|
|
|
|
|
|
|
|
|
| 80 |
|
| 81 |
if not os.path.exists(consistentID_weight_path):
|
| 82 |
### Download pretrained models
|
adaface/face_id_to_ada_prompt.py
CHANGED
|
@@ -606,7 +606,7 @@ class Arc2Face_ID2AdaPrompt(FaceID2AdaPrompt):
|
|
| 606 |
# Note there are two "models" in the path.
|
| 607 |
self.face_app = FaceAnalysis(name='antelopev2', root='models/insightface',
|
| 608 |
providers=['CPUExecutionProvider'])
|
| 609 |
-
self.face_app.prepare(ctx_id=0, det_size=(
|
| 610 |
print(f'Arc2Face Face encoder loaded on CPU.')
|
| 611 |
|
| 612 |
self.text_to_image_prompt_encoder = CLIPTextModelWrapper.from_pretrained(
|
|
@@ -642,6 +642,7 @@ class Arc2Face_ID2AdaPrompt(FaceID2AdaPrompt):
|
|
| 642 |
|
| 643 |
def _apply(self, fn):
|
| 644 |
super()._apply(fn) # Call the parent _apply to handle parameters and buffers
|
|
|
|
| 645 |
# A dirty hack to get the device of the model, passed from
|
| 646 |
# parent.model.to(self.root_device) => parent._apply(convert) => module._apply(fn)
|
| 647 |
test_tensor = torch.zeros(1) # Create a test tensor
|
|
@@ -654,7 +655,7 @@ class Arc2Face_ID2AdaPrompt(FaceID2AdaPrompt):
|
|
| 654 |
if str(device) == 'cpu':
|
| 655 |
self.face_app = FaceAnalysis(name='antelopev2', root='models/insightface',
|
| 656 |
providers=['CPUExecutionProvider'])
|
| 657 |
-
self.face_app.prepare(ctx_id=0, det_size=(
|
| 658 |
else:
|
| 659 |
device_id = device.index
|
| 660 |
self.face_app = FaceAnalysis(name='antelopev2', root='models/insightface',
|
|
@@ -663,7 +664,7 @@ class Arc2Face_ID2AdaPrompt(FaceID2AdaPrompt):
|
|
| 663 |
"cudnn_conv_algo_search": "HEURISTIC",
|
| 664 |
"gpu_mem_limit": 2 * 1024**3
|
| 665 |
}])
|
| 666 |
-
self.face_app.prepare(ctx_id=device_id, det_size=(
|
| 667 |
|
| 668 |
self.device = device
|
| 669 |
print(f'Arc2Face Face encoder reloaded on {device}.')
|
|
@@ -790,6 +791,7 @@ class ConsistentID_ID2AdaPrompt(FaceID2AdaPrompt):
|
|
| 790 |
|
| 791 |
def _apply(self, fn):
|
| 792 |
super()._apply(fn) # Call the parent _apply to handle parameters and buffers
|
|
|
|
| 793 |
# A dirty hack to get the device of the model, passed from
|
| 794 |
# parent.model.to(self.root_device) => parent._apply(convert) => module._apply(fn)
|
| 795 |
test_tensor = torch.zeros(1) # Create a test tensor
|
|
@@ -802,7 +804,7 @@ class ConsistentID_ID2AdaPrompt(FaceID2AdaPrompt):
|
|
| 802 |
if str(device) == 'cpu':
|
| 803 |
self.face_app = FaceAnalysis(name='buffalo_l', root='models/insightface',
|
| 804 |
providers=['CPUExecutionProvider'])
|
| 805 |
-
self.face_app.prepare(ctx_id=0, det_size=(
|
| 806 |
else:
|
| 807 |
device_id = device.index
|
| 808 |
self.face_app = FaceAnalysis(name='buffalo_l', root='models/insightface',
|
|
@@ -811,7 +813,7 @@ class ConsistentID_ID2AdaPrompt(FaceID2AdaPrompt):
|
|
| 811 |
"cudnn_conv_algo_search": "HEURISTIC",
|
| 812 |
"gpu_mem_limit": 2 * 1024**3
|
| 813 |
}])
|
| 814 |
-
self.face_app.prepare(ctx_id=device_id, det_size=(
|
| 815 |
|
| 816 |
self.device = device
|
| 817 |
self.pipe.face_app = self.face_app
|
|
|
|
| 606 |
# Note there are two "models" in the path.
|
| 607 |
self.face_app = FaceAnalysis(name='antelopev2', root='models/insightface',
|
| 608 |
providers=['CPUExecutionProvider'])
|
| 609 |
+
self.face_app.prepare(ctx_id=0, det_size=(512, 512))
|
| 610 |
print(f'Arc2Face Face encoder loaded on CPU.')
|
| 611 |
|
| 612 |
self.text_to_image_prompt_encoder = CLIPTextModelWrapper.from_pretrained(
|
|
|
|
| 642 |
|
| 643 |
def _apply(self, fn):
|
| 644 |
super()._apply(fn) # Call the parent _apply to handle parameters and buffers
|
| 645 |
+
return
|
| 646 |
# A dirty hack to get the device of the model, passed from
|
| 647 |
# parent.model.to(self.root_device) => parent._apply(convert) => module._apply(fn)
|
| 648 |
test_tensor = torch.zeros(1) # Create a test tensor
|
|
|
|
| 655 |
if str(device) == 'cpu':
|
| 656 |
self.face_app = FaceAnalysis(name='antelopev2', root='models/insightface',
|
| 657 |
providers=['CPUExecutionProvider'])
|
| 658 |
+
self.face_app.prepare(ctx_id=0, det_size=(512, 512))
|
| 659 |
else:
|
| 660 |
device_id = device.index
|
| 661 |
self.face_app = FaceAnalysis(name='antelopev2', root='models/insightface',
|
|
|
|
| 664 |
"cudnn_conv_algo_search": "HEURISTIC",
|
| 665 |
"gpu_mem_limit": 2 * 1024**3
|
| 666 |
}])
|
| 667 |
+
self.face_app.prepare(ctx_id=device_id, det_size=(512, 512))
|
| 668 |
|
| 669 |
self.device = device
|
| 670 |
print(f'Arc2Face Face encoder reloaded on {device}.')
|
|
|
|
| 791 |
|
| 792 |
def _apply(self, fn):
|
| 793 |
super()._apply(fn) # Call the parent _apply to handle parameters and buffers
|
| 794 |
+
return
|
| 795 |
# A dirty hack to get the device of the model, passed from
|
| 796 |
# parent.model.to(self.root_device) => parent._apply(convert) => module._apply(fn)
|
| 797 |
test_tensor = torch.zeros(1) # Create a test tensor
|
|
|
|
| 804 |
if str(device) == 'cpu':
|
| 805 |
self.face_app = FaceAnalysis(name='buffalo_l', root='models/insightface',
|
| 806 |
providers=['CPUExecutionProvider'])
|
| 807 |
+
self.face_app.prepare(ctx_id=0, det_size=(512, 512))
|
| 808 |
else:
|
| 809 |
device_id = device.index
|
| 810 |
self.face_app = FaceAnalysis(name='buffalo_l', root='models/insightface',
|
|
|
|
| 813 |
"cudnn_conv_algo_search": "HEURISTIC",
|
| 814 |
"gpu_mem_limit": 2 * 1024**3
|
| 815 |
}])
|
| 816 |
+
self.face_app.prepare(ctx_id=device_id, det_size=(512, 512))
|
| 817 |
|
| 818 |
self.device = device
|
| 819 |
self.pipe.face_app = self.face_app
|
app.py
CHANGED
|
@@ -23,20 +23,6 @@ def str2bool(v):
|
|
| 23 |
def is_running_on_spaces():
|
| 24 |
return os.getenv("SPACE_ID") is not None
|
| 25 |
|
| 26 |
-
@spaces.GPU(duration=120)
|
| 27 |
-
def move_to_gpu(adaface):
|
| 28 |
-
if is_running_on_spaces():
|
| 29 |
-
device = 'cuda:0'
|
| 30 |
-
else:
|
| 31 |
-
if args.gpu is None:
|
| 32 |
-
device = "cuda"
|
| 33 |
-
else:
|
| 34 |
-
device = f"cuda:{args.gpu}"
|
| 35 |
-
|
| 36 |
-
print(f"Device: {device}")
|
| 37 |
-
|
| 38 |
-
adaface.to(device)
|
| 39 |
-
|
| 40 |
import argparse
|
| 41 |
parser = argparse.ArgumentParser()
|
| 42 |
parser.add_argument("--adaface_encoder_types", type=str, nargs="+", default=["consistentID", "arc2face"],
|
|
@@ -101,7 +87,6 @@ if not args.test_ui_only:
|
|
| 101 |
shrink_cross_attn=False,
|
| 102 |
q_lora_updates_query=args.q_lora_updates_query,
|
| 103 |
device='cpu')
|
| 104 |
-
move_to_gpu(adaface)
|
| 105 |
|
| 106 |
def randomize_seed_fn(seed: int, randomize_seed: bool) -> int:
|
| 107 |
if randomize_seed:
|
|
@@ -127,8 +112,21 @@ def generate_image(image_paths, image_paths2, guidance_scale, perturb_std,
|
|
| 127 |
ablate_prompt_embed_type, nonmix_prompt_emb_weight,
|
| 128 |
composition_level, seed, disable_adaface, subj_name_sig, progress=gr.Progress(track_tqdm=True)):
|
| 129 |
|
| 130 |
-
global adaface
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
|
|
|
|
|
|
|
|
|
|
| 132 |
if image_paths is None or len(image_paths) == 0:
|
| 133 |
raise gr.Error(f"Cannot find any input face image! Please upload a face image.")
|
| 134 |
|
|
@@ -149,10 +147,10 @@ def generate_image(image_paths, image_paths2, guidance_scale, perturb_std,
|
|
| 149 |
|
| 150 |
# Sometimes the pipeline is on CPU, although we've put it on CUDA (due to some offloading mechanism).
|
| 151 |
# Therefore we set the generator to the correct device.
|
| 152 |
-
generator = torch.Generator(device=device).manual_seed(seed)
|
| 153 |
print(f"Manual seed: {seed}.")
|
| 154 |
# Generate two images each time for the user to select from.
|
| 155 |
-
noise = torch.randn(num_images, 3, 512, 512, device=device, generator=generator)
|
| 156 |
#print(noise.abs().sum())
|
| 157 |
# samples: A list of PIL Image instances.
|
| 158 |
if highlight_face:
|
|
|
|
| 23 |
def is_running_on_spaces():
|
| 24 |
return os.getenv("SPACE_ID") is not None
|
| 25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
import argparse
|
| 27 |
parser = argparse.ArgumentParser()
|
| 28 |
parser.add_argument("--adaface_encoder_types", type=str, nargs="+", default=["consistentID", "arc2face"],
|
|
|
|
| 87 |
shrink_cross_attn=False,
|
| 88 |
q_lora_updates_query=args.q_lora_updates_query,
|
| 89 |
device='cpu')
|
|
|
|
| 90 |
|
| 91 |
def randomize_seed_fn(seed: int, randomize_seed: bool) -> int:
|
| 92 |
if randomize_seed:
|
|
|
|
| 112 |
ablate_prompt_embed_type, nonmix_prompt_emb_weight,
|
| 113 |
composition_level, seed, disable_adaface, subj_name_sig, progress=gr.Progress(track_tqdm=True)):
|
| 114 |
|
| 115 |
+
global adaface, args
|
| 116 |
+
|
| 117 |
+
if is_running_on_spaces():
|
| 118 |
+
device = 'cuda:0'
|
| 119 |
+
else:
|
| 120 |
+
if args.gpu is None:
|
| 121 |
+
device = "cuda"
|
| 122 |
+
else:
|
| 123 |
+
device = f"cuda:{args.gpu}"
|
| 124 |
+
|
| 125 |
+
print(f"Device: {device}")
|
| 126 |
|
| 127 |
+
adaface.to(device)
|
| 128 |
+
args.device = device
|
| 129 |
+
|
| 130 |
if image_paths is None or len(image_paths) == 0:
|
| 131 |
raise gr.Error(f"Cannot find any input face image! Please upload a face image.")
|
| 132 |
|
|
|
|
| 147 |
|
| 148 |
# Sometimes the pipeline is on CPU, although we've put it on CUDA (due to some offloading mechanism).
|
| 149 |
# Therefore we set the generator to the correct device.
|
| 150 |
+
generator = torch.Generator(device=args.device).manual_seed(seed)
|
| 151 |
print(f"Manual seed: {seed}.")
|
| 152 |
# Generate two images each time for the user to select from.
|
| 153 |
+
noise = torch.randn(num_images, 3, 512, 512, device=args.device, generator=generator)
|
| 154 |
#print(noise.abs().sum())
|
| 155 |
# samples: A list of PIL Image instances.
|
| 156 |
if highlight_face:
|