diff --git a/liveportrait/utils/crop.py b/liveportrait/utils/crop.py index e82ca0c..2f77a9d 100644 --- a/liveportrait/utils/crop.py +++ b/liveportrait/utils/crop.py @@ -357,7 +357,7 @@ def crop_image(img, pts: np.ndarray, **kwargs): scale=scale, vy_ratio=vy_ratio, vx_ratio=vx_ratio, - flag_do_rot=kwargs.get('flag_do_rot', True), + flag_do_rot=kwargs.get('rotate', True), ) if img is None: diff --git a/liveportrait/utils/cropper.py b/liveportrait/utils/cropper.py index 03951ea..d4aca88 100644 --- a/liveportrait/utils/cropper.py +++ b/liveportrait/utils/cropper.py @@ -42,7 +42,7 @@ class Cropper(object): self.face_analysis_wrapper.prepare(ctx_id=device_id, det_size=(512, 512)) self.face_analysis_wrapper.warmup() - def crop_single_image(self, img_rgb, dsize, scale, vy_ratio, vx_ratio, face_index): + def crop_single_image(self, img_rgb, dsize, scale, vy_ratio, vx_ratio, face_index, rotate): direction = 'large-small' src_face = self.face_analysis_wrapper.get( @@ -66,7 +66,8 @@ class Cropper(object): dsize=dsize, scale=scale, vy_ratio=vy_ratio, - vx_ratio=vx_ratio + vx_ratio=vx_ratio, + rotate=rotate ) # update a 256x256 version for network input or else ret_dct['img_crop_256x256'] = cv2.resize(ret_dct['img_crop'], (256, 256), interpolation=cv2.INTER_AREA) @@ -79,4 +80,4 @@ class Cropper(object): lmk = recon_ret['pts'] ret_dct['lmk_crop'] = lmk - return ret_dct + return ret_dct \ No newline at end of file diff --git a/nodes.py b/nodes.py index 2cb8468..f00c8d2 100644 --- a/nodes.py +++ b/nodes.py @@ -333,6 +333,7 @@ class LivePortraitCropper: "vx_ratio": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.01}), "vy_ratio": ("FLOAT", {"default": -0.125, "min": -1.0, "max": 1.0, "step": 0.01}), "face_index": ("INT", {"default": 0, "min": 0, "max": 100}), + "rotate": ("BOOLEAN", {"default": True}), "onnx_device": ( ['CPU', 'CUDA', 'ROCM'], { "default": 'CPU' @@ -350,7 +351,7 @@ class LivePortraitCropper: FUNCTION = "process" CATEGORY = "LivePortrait" - def process(self, source_image, dsize, scale, vx_ratio, vy_ratio, face_index, keep_model_loaded, onnx_device='CUDA', opt_driving_images=None): + def process(self, source_image, dsize, scale, vx_ratio, vy_ratio, face_index, rotate, keep_model_loaded, onnx_device='CUDA', opt_driving_images=None): source_image_np = (source_image * 255).byte().numpy() cropper_init_config = { @@ -371,13 +372,13 @@ class LivePortraitCropper: pbar = comfy.utils.ProgressBar(len(source_image_np)) for i in tqdm(range(len(source_image_np)), desc='Detecting and cropping..', total=len(source_image_np)): - crop_info = self.cropper.crop_single_image(source_image_np[i], dsize, scale, vy_ratio, vx_ratio, face_index) + crop_info = self.cropper.crop_single_image(source_image_np[i], dsize, scale, vy_ratio, vx_ratio, face_index, rotate) crop_info_list.append(crop_info) cropped_image = crop_info['img_crop_256x256'] cropped_images_list.append(cropped_image) if opt_driving_images is not None: - driving_crop_dict = self.cropper.crop_single_image(driving_images_np[i], dsize, scale, vy_ratio, vx_ratio, face_index) + driving_crop_dict = self.cropper.crop_single_image(driving_images_np[i], dsize, scale, vy_ratio, vx_ratio, face_index, rotate) driving_landmark_list.append(driving_crop_dict['lmk_crop']) pbar.update(1)