jacobgil / pytorch-grad-cam

Advanced AI Explainability for computer vision. Support for CNNs, Vision Transformers, Classification, Object detection, Segmentation, Image similarity and more.
https://jacobgil.github.io/pytorch-gradcam-book
MIT License
10.55k stars 1.56k forks source link

What is the different colors mean? #484

Open liuxiangchao369 opened 8 months ago

liuxiangchao369 commented 8 months ago

I found that the color of eyes,mouth of the face if blue and other part of the face is red.

Does it mean that the eyes,mouth are not important in my model?

001conv7

jacobgil commented 8 months ago

It could be, but need to make sure it's not and rgb <> bgr issue.

How did you create it? And details will help.

liuxiangchao369 commented 8 months ago

It could be, but need to make sure it's not and rgb <> bgr issue.

How did you create it? And details will help.

actually, my inputs_image is a one-channel image. I repeat it to 3-channels. here is my code

` dirs = "data/AFD/AFDB_train" for d in os.listdir(dirs): for file in os.listdir(f"{dirs}/{d}"): image_path = f"{dirs}/{d}/{file}" FACE_SHAPE = (128, 128) input_tensor = preprocess_image(image_path, FACE_SHAPE)

        # Apply the heatmap on the original image
        image = Image.open(image_path)
        image = image.resize(FACE_SHAPE)

        image_array = np.array(image)
        # image_array = np.moveaxis(image_array, -1, 0)

        # print(image_array/255)

        for name, layer in model.named_modules():
            if "conv" not in name or "." in name:
                continue
            target_layers = [layer, ]
            # Construct the GradCAM object
            cam = ScoreCAM(model=model, target_layers=target_layers)

            # Perform CAM and generate heatmap
            targets = [ClassifierOutputTarget(0)]
            grayscale_cam = cam(input_tensor=input_tensor, targets=targets, aug_smooth=False)
            grayscale_cam = np.repeat(grayscale_cam, 3, axis=0)
            grayscale_cam = grayscale_cam[0, :]
            # print(grayscale_cam)
            # print(image_array.shape,grayscale_cam.shape)
            try:
                visualization = show_cam_on_image(image_array / 255, grayscale_cam)
            except ValueError:
                continue
            pil_image = Image.fromarray(visualization)
            # Save the PIL Image object to a file
            if not os.path.exists(f"pic/{d}"):
                os.mkdir(f"pic/{d}")
            pil_image.save(f"pic/{d}/{file}{name}.jpg")

`

jacobgil commented 8 months ago

It's a BGR<>RGB issue. show_cam_on_image Creates the colorful image in BGR format, unless use_rgb is passed. But then you save the image with PIL, which is RGB, so the colors are inverted. You can pass use_rgb=True to show_cam_on_image.