Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

resolved issue with black and white images in nodes_mask.py #4110

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions comfy_extras/nodes_mask.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,19 @@

from nodes import MAX_RESOLUTION

def tensor_to_rgb(img):
# convert from bw to rgb : cwh -> bchw
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is correct. I'm fairly certain that masks in ComfyUI are BHW and images are BHWC. Your logic here works out when the batch size is 1, but will break if there is a batch of more than one mask.

Copy link
Contributor

@guill guill Jul 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see -- .movedim(-1, 1) is called before calling this function for the RGB case -- so it would be BCHW. Still, I think you want to insert the channel dimension rather than the batch dimension.

Copy link
Contributor Author

@shawnington shawnington Jul 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see -- .movedim(-1, 1) is called before calling this function for the RGB case -- so it would be BCHW. Still, I think you want to insert the channel dimension rather than the batch dimension.

Yeah, I am not sure why it wants BCHW When the LoadImage node outputs BHWC, but the composite nodes in nodes_mask.py definitely require this format to perform their operations, and it is also the format it returns.

The batch dimension is needed because it accesses channel dimension via index position, C is expected at index[1] in the composite node so HWC would also fail without Batch being added, but batch is only added if there is no batch currently, otherwise the channel is repeated at index[1]

Im guessing all of this is a result of there not being an enforced format for what an image is through the pipeline.

So forcing conformance to either BCHW or BHWC would fix a lot of confusion with things like this.

if img.shape[1] != 3:
if len(img.shape) == 3:
img = img.unsqueeze(0)
img = img.permute(0, 1, 3, 2).repeat(1, 3, 1, 1)

return img

def composite(destination, source, x, y, mask = None, multiplier = 8, resize_source = False):
destination = tensor_to_rgb(destination)
source = tensor_to_rgb(source)

source = source.to(destination.device)
if resize_source:
source = torch.nn.functional.interpolate(source, size=(destination.shape[2], destination.shape[3]), mode="bilinear")
Expand Down
Loading