|
import numpy as np |
|
from pytorch_grad_cam.base_cam import BaseCAM |
|
from pytorch_grad_cam.utils.svd_on_activations import get_2d_projection |
|
|
|
|
|
|
|
|
|
class LayerCAM(BaseCAM): |
|
def __init__( |
|
self, |
|
model, |
|
target_layers, |
|
use_cuda=False, |
|
reshape_transform=None): |
|
super( |
|
LayerCAM, |
|
self).__init__( |
|
model, |
|
target_layers, |
|
use_cuda, |
|
reshape_transform) |
|
|
|
def get_cam_image(self, |
|
input_tensor, |
|
target_layer, |
|
target_category, |
|
activations, |
|
grads, |
|
eigen_smooth): |
|
spatial_weighted_activations = np.maximum(grads, 0) * activations |
|
|
|
if eigen_smooth: |
|
cam = get_2d_projection(spatial_weighted_activations) |
|
else: |
|
cam = spatial_weighted_activations.sum(axis=1) |
|
return cam |
|
|