| 138 | |
| 139 | |
| 140 | class MaskMerge: |
| 141 | def __init__(self): |
| 142 | pass |
| 143 | |
| 144 | @classmethod |
| 145 | def INPUT_TYPES(cls): |
| 146 | return { |
| 147 | "required": { |
| 148 | "original_image": ("IMAGE",), |
| 149 | }, |
| 150 | "optional": { |
| 151 | "processed_images": ("IMAGE", {"forceInput": True}), |
| 152 | "masks": ("MASK", {"forceInput": True}), |
| 153 | } |
| 154 | } |
| 155 | |
| 156 | RETURN_TYPES = ("IMAGE",) |
| 157 | RETURN_NAMES = ("merged_image",) |
| 158 | FUNCTION = "merge_masked_images" |
| 159 | CATEGORY = "CyberEveLoop🐰" |
| 160 | |
| 161 | def standardize_input(self, image, processed_images=None, masks=None): |
| 162 | """ |
| 163 | 标准化输入格式 |
| 164 | - image: [H,W,C] -> [1,H,W,C] |
| 165 | - processed_images: [...] -> [B,H,W,C] |
| 166 | - masks: [...] -> [B,H,W] |
| 167 | """ |
| 168 | # 处理原始图像 |
| 169 | if len(image.shape) == 3: |
| 170 | image = image.unsqueeze(0) |
| 171 | assert len(image.shape) == 4, f"Original image must be 4D [B,H,W,C], got shape {image.shape}" |
| 172 | |
| 173 | # 处理processed_images |
| 174 | if processed_images is not None: |
| 175 | if isinstance(processed_images, list): |
| 176 | processed_images = torch.cat(processed_images, dim=0) |
| 177 | if len(processed_images.shape) == 3: |
| 178 | processed_images = processed_images.unsqueeze(0) |
| 179 | assert len(processed_images.shape) == 4, \ |
| 180 | f"Processed images must be 4D [B,H,W,C], got shape {processed_images.shape}" |
| 181 | |
| 182 | # 处理masks |
| 183 | if masks is not None: |
| 184 | if isinstance(masks, list): |
| 185 | masks = torch.cat(masks, dim=0) |
| 186 | if len(masks.shape) == 2: |
| 187 | masks = masks.unsqueeze(0) |
| 188 | assert len(masks.shape) == 3, f"Masks must be 3D [B,H,W], got shape {masks.shape}" |
| 189 | |
| 190 | return image, processed_images, masks |
| 191 | |
| 192 | def resize_tensor(self, x, size, mode='bilinear'): |
| 193 | """调整tensor尺寸的辅助函数""" |
| 194 | # 确保输入是4D tensor [B,C,H,W] |
| 195 | orig_dim = x.dim() |
| 196 | if orig_dim == 3: |
| 197 | x = x.unsqueeze(0) |
nothing calls this directly
no outgoing calls
no test coverage detected