optimize: use gpu for dilation/erosion

fix: mask cache didn't work on regional sampler
fix: erosion didn't work on ultralytics detectors
This commit is contained in:
Dr.Lt.Data
2023-11-05 12:11:52 +09:00
parent 8ce6577992
commit 1e7b87b00d
3 changed files with 27 additions and 13 deletions
+2 -2
View File
@@ -2,9 +2,9 @@ import configparser
import os
version = "V4.29.1"
version = "V4.29.2"
dependency_version = 16
dependency_version = 17
my_path = os.path.dirname(__file__)
old_config_path = os.path.join(my_path, "impact-pack.ini")
+6 -5
View File
@@ -49,19 +49,19 @@ def erosion_mask(mask, grow_mask_by):
w = mask.shape[1]
h = mask.shape[0]
mask = mask.clone()
device = comfy.model_management.get_torch_device()
mask = mask.clone().to(device)
mask2 = torch.nn.functional.interpolate(mask.reshape((-1, 1, mask.shape[-2], mask.shape[-1])), size=(w, h),
mode="bilinear")
mode="bilinear").to(device)
if grow_mask_by == 0:
mask_erosion = mask2
else:
kernel_tensor = torch.ones((1, 1, grow_mask_by, grow_mask_by))
kernel_tensor = torch.ones((1, 1, grow_mask_by, grow_mask_by)).to(device)
padding = math.ceil((grow_mask_by - 1) / 2)
mask_erosion = torch.clamp(torch.nn.functional.conv2d(mask2.round(), kernel_tensor, padding=padding), 0, 1)
return mask_erosion[:, :, :w, :h].round()
return mask_erosion[:, :, :w, :h].round().cpu()
def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise,
@@ -115,6 +115,7 @@ class REGIONAL_PROMPT:
def get_mask_erosion(self, factor):
if self.mask_erosion is None or self.erosion_factor != factor:
self.mask_erosion = erosion_mask(self.mask, factor)
self.erosion_factor = factor
return self.mask_erosion
+19 -6
View File
@@ -95,12 +95,15 @@ def dilate_mask(mask, dilation_factor, iter=1):
if len(mask.shape) == 3:
mask = mask.squeeze(0)
kernel = np.ones((abs(dilation_factor), abs(dilation_factor)), np.uint8)
gpu_mask = cv2.UMat(mask)
gpu_kernel = cv2.UMat(kernel)
if dilation_factor > 0:
kernel = np.ones((dilation_factor, dilation_factor), np.uint8)
return cv2.dilate(mask, kernel, iter)
result = cv2.dilate(gpu_mask, gpu_kernel, iter)
else:
kernel = np.ones((-dilation_factor, -dilation_factor), np.uint8)
return cv2.erode(mask, kernel, iter)
result = cv2.erode(gpu_mask, gpu_kernel, iter)
return result.get()
def dilate_masks(segmasks, dilation_factor, iter=1):
@@ -108,12 +111,22 @@ def dilate_masks(segmasks, dilation_factor, iter=1):
return segmasks
dilated_masks = []
kernel = np.ones((dilation_factor, dilation_factor), np.uint8)
kernel = np.ones((abs(dilation_factor), abs(dilation_factor)), np.uint8)
gpu_kernel = cv2.UMat(kernel)
for i in range(len(segmasks)):
cv2_mask = segmasks[i][1]
dilated_mask = cv2.dilate(cv2_mask, kernel, iter)
gpu_mask = cv2.UMat(cv2_mask)
if dilation_factor > 0:
dilated_mask = cv2.dilate(gpu_mask, gpu_kernel, iter).get()
else:
dilated_mask = cv2.erode(gpu_mask, gpu_kernel, iter).get()
item = (segmasks[i][0], dilated_mask, segmasks[i][2])
dilated_masks.append(item)
return dilated_masks