Giter Site home page Giter Site logo

scorecam's Introduction

Score CAM with pytorch

The re-implementation of Smooth Grad-CAM++ with pytorch. This repo also includes the code of CAM, Grad-CAM, Grad-CAM++, Smooth Grad-CAM++.

Requirements

  • python 3.x
  • pytorch >= 0.4
  • pillow
  • numpy
  • opencv
  • matplotlib

How to use

You can use the CAM, GradCAM, GradCAM++, Smooth Grad-CAM++ and Score CAM as a model wrapper described in cam.py. Please see demo.ipynb for the detail.

Results

image
CAM
Grad-CAM
Grad-CAM++
Smooth Grad-CAM++
Score CAM

References

  • Score-CAM: Improved Visual Explanations Via Score-Weighted Class Activation Mapping, Haofan Wang, Mengnan Du, Fan Yang, Zijian Zhang [paper]
  • Smooth Grad-CAM++: An Enhanced Inference Level Visualization Technique for Deep Convolutional Neural Network Models,
    Daniel Omeiza, Skyler Speakman, Celia Cintas, Komminist Weldermariam [paper]
  • Learning Deep Features for Discriminative Localization, Bolei Zhou, Aditya Khosla, Agata Lapedriza, Aude Oliva, Antonio Torralba [paper]
  • Grad-CAM: Visual explanations from deep networks via gradient-based localization, Ramprasaath R. Selvaraju, Michael Cogswell, Abhishek Das, Ramakrishna Vedantam, Devi Parikh, Dhruv Batra, [paper]
  • Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks, Aditya Chattopadhyay, Anirban Sarkar, Prantik Howlader and Vineeth N Balasubramanian[paper]

scorecam's People

Contributors

yiskw713 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

scorecam's Issues

Info regarding normalization

In your scorecam implementation, why are you normalizing all the activations together? Why not normalize each activation map independently in a loop? Are these two the same?

ScoreCAM fix batch proposal

I found out that the ScoreCAM code is not set for batched inputs. This is my attempt to fix this thing:

    def forward(self, x):
        with torch.no_grad():
            B, _, H, W = x.size()
            device = x.device
            self.model.zero_grad()
            score = self.model(x)
            prob = torch.nn.functional.softmax(score, dim=1)
            _, idx = torch.max(prob, dim=1)
            prob = prob[:, 1].unsqueeze(-1).detach().float()

            # put activation maps through relu activation
            # because the values are not normalized with eq.(1) without relu.
            self.activations = torch.nn.functional.relu(self.values.activations).to('cpu').clone()
            self.activations = torch.nn.functional.interpolate(self.activations, (H, W), mode='bilinear')
            _, C, _, _ = self.activations.shape
            # normalization
            act_min, _ = self.activations.view(1, C, -1).min(dim=2)
            act_min = act_min.view(1, C, 1, 1)
            act_max, _ = self.activations.view(1, C, -1).max(dim=2)
            act_max = act_max.view(1, C, 1, 1)
            denominator = torch.where((act_max - act_min) != 0., act_max - act_min, torch.tensor(1.))
            self.activations = self.activations / denominator

            # generate masked images and calculate class probabilities
            probs = []
            #random_channels = np.random.randint(C, size=10)
            for i in range(0, C):
                mask = self.activations[:, i, :, :].unsqueeze(1)
                mask = mask.to(device)
                masked_x = x * mask
                score = self.model(masked_x)
                score = torch.nn.functional.softmax(score, dim=1)
                score = torch.amax(score, dim=1).to('cpu').data
                probs.append(score)

            probs = torch.stack(probs)
            weights = probs.view(B, C, 1, 1)

            cam = (weights * self.activations[:, :C, :, :]).sum(1, keepdim=True)
            cam = torch.nn.functional.relu(cam)
            cam -= torch.min(cam)
            cam /= torch.max(cam)

        return cam.data, idx.item()

Let me know if thee is something wrong my solution.

Size mismatch error

cam, idx = wrapped_model(tensor)

I get the following error at this step (no changes made to the notebook) : RuntimeError: size mismatch, m1: [1 x 30720], m2: [512 x 1000] at c:\programdata\miniconda3\conda-bld\pytorch_1533090265711\work\aten\src\th\generic/THTensorMath.cpp:2070

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.