【快速實踐】類激活圖(CAM,class activation map)可視化

類激活圖可視化:有助于了解一張圖像的哪一部分讓卷積神經網絡做出了最終的分類決策

  • 對輸入圖像生成類激活熱力圖
  • 類激活熱力圖是與特定輸出類別相關的二維分數網格:對任何輸入圖像的每個位置都要進行計算,它表示每個位置對該類別的重要程度

我們將使用的具體實現方式是“Grad-CAM: visual explanations from deep networks via gradient based localization”

  • 給定一張輸入圖像,對于一個卷積層的輸出特征圖,用類別相對于通道的梯度對這個特征圖中的每個通道進行加權

代碼示例如下

  1. 加載 VGG16 執行圖片分類

    from keras.preprocessing import image 
    from keras.applications.vgg16 import VGG16 
    from keras.applications.vgg16 import preprocess_input, decode_predictions 
    import numpy as np 
    from keras import backend as K import tensorflow as tf
    tf.compat.v1.disable_eager_execution()##---------------------------------- 加載 VGG16 網絡
    model = VGG16(weights='imagenet')  ##---------------------------------- 預測給定圖片 
    img_path = 'elephant.png'   
    img = image.load_img(img_path, target_size=(224, 224))   
    x = image.img_to_array(img)   
    x = np.expand_dims(x, axis=0)   
    x = preprocess_input(x) 
    preds = model.predict(x) ##---------------------------------- 解讀預測結果
    print('Predicted:', decode_predictions(preds, top=3)[0]) 
    # 打印出:對這張圖像預測的前三個類別
    # Predicted:', [(u'n02504458', u'African_elephant', 0.92546833),   ## 非洲象(African elephant,92.5% 的概率)
    # (u'n01871265', u'tusker', 0.070257246), 						   ## 長牙動物(tusker,7%的概率)
    # (u'n02504013', u'Indian_elephant', 0.0042589349)]				   ## 印度象(Indian elephant,0.4% 的概率)print(np.argmax(preds[0])) 
    # 獲得 非洲象對應輸出索引:386
    
  2. 應用Grad-CAM算法,計算類激活熱力圖 heatmap

    african_elephant_output = model.output[:, 386]                                  # 預測向量中的 “非洲象” 元素    (None,)       
    last_conv_layer_output = model.get_layer('block5_conv3').output                 # VGG16 最后一個卷積層         (None, 14, 14, 512)# 類別相對于通道的梯度: “非洲象”類別相對于 block5_conv3 輸出特征圖的梯度
    grads = K.gradients(african_elephant_output, last_conv_layer_output)[0]         # grads.shape:                (None, 14, 14, 512)
    pooled_grads = K.mean(grads, axis=(0, 1, 2))                                    # pooled_grads.shape:         (512,)# 獲得當前圖 conv_layer_output_value 和 pooled_grads_value 實際值
    iterate = K.function([model.input], [pooled_grads, last_conv_layer_output[0]])
    pooled_grads_value, conv_layer_output_value = iterate([x]) 
    # 計算加權值
    for i in range(512):   conv_layer_output_value[:, :, i] *= pooled_grads_value[i]heatmap = np.mean(conv_layer_output_value, axis=-1) 
    
  3. 可視化

    import matplotlib.pyplot as plt
    heatmap = np.maximum(heatmap, 0) 
    heatmap /= np.max(heatmap) 
    plt.matshow(heatmap)
    plt.show()  ##  ---------------------------------------------------- 下方左圖# 縮放 heatmap 后,在原圖上疊加顯示
    import cv2 
    img = cv2.imread(img_path) 
    heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
    heatmap = np.uint8(255 * heatmap)
    heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) 
    superimposed_img = heatmap * 0.4 + img
    cv2.imwrite('elephant_cam.jpg', superimposed_img)  ## -------------- 下方右圖
    

完整代碼參考

from keras.preprocessing import image 
from keras.applications.vgg16 import VGG16 
from keras.applications.vgg16 import preprocess_input, decode_predictions 
import numpy as np 
from keras import backend as K 
import tensorflow as tf
tf.compat.v1.disable_eager_execution()##---------------------------------- 加載 VGG16 網絡
model = VGG16(weights='imagenet')  ##---------------------------------- 預測給定圖片 
img_path = 'elephant.png'   
img = image.load_img(img_path, target_size=(224, 224))   
x = image.img_to_array(img)   
x = np.expand_dims(x, axis=0)   
x = preprocess_input(x) 
preds = model.predict(x) ##---------------------------------- 解讀預測結果
print('Predicted:', decode_predictions(preds, top=3)[0]) 
# 打印出:對這張圖像預測的前三個類別
# Predicted:', [(u'n02504458', u'African_elephant', 0.92546833),      ## 非洲象(African elephant,92.5% 的概率)
# (u'n01871265', u'tusker', 0.070257246), 		          ## 長牙動物(tusker,7%的概率)
# (u'n02504013', u'Indian_elephant', 0.0042589349)]                   ## 印度象(Indian elephant,0.4% 的概率)print(np.argmax(preds[0])) 
# 獲得 非洲象對應輸出索引:386african_elephant_output = model.output[:, 386]                                  # 預測向量中的 “非洲象” 元素    (None,)       
last_conv_layer_output = model.get_layer('block5_conv3').output                 # VGG16 最后一個卷積層         (None, 14, 14, 512)# 類別相對于通道的梯度: “非洲象”類別相對于 block5_conv3 輸出特征圖的梯度
grads = K.gradients(african_elephant_output, last_conv_layer_output)[0]         # grads.shape:                (None, 14, 14, 512)
pooled_grads = K.mean(grads, axis=(0, 1, 2))                                    # pooled_grads.shape:         (512,)# 獲得當前圖 conv_layer_output_value 和 pooled_grads_value 實際值
iterate = K.function([model.input], [pooled_grads, last_conv_layer_output[0]])
pooled_grads_value, conv_layer_output_value = iterate([x]) 
# 計算加權值
for i in range(512):   conv_layer_output_value[:, :, i] *= pooled_grads_value[i]heatmap = np.mean(conv_layer_output_value, axis=-1) import matplotlib.pyplot as plt
heatmap = np.maximum(heatmap, 0) 
heatmap /= np.max(heatmap) 
plt.matshow(heatmap)
# plt.show()# 縮放 heatmap 后,在原圖上疊加顯示
import cv2 
img = cv2.imread(img_path) 
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) 
superimposed_img = heatmap * 0.4 + img
cv2.imwrite('elephant_cam.jpg', superimposed_img)

參考書籍:Python 深度學習

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64922.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64922.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ros2 py文件間函數調用

文章目錄 寫在前面的話生成python工程包命令運行python函數命令python工程包的目錄結構目錄結構(細節) 報錯 1( no module name ***)錯誤示意 截圖終端輸出解決方法 報錯 2( AttributeError: *** object has no attrib…

Milvus×合邦電力:向量數據庫如何提升15%電價預測精度

01. 全球能源市場化改革下的合邦電力 在全球能源轉型和市場化改革的大背景下,電力交易市場正逐漸成為優化資源配置、提升系統效率的關鍵平臺。電力交易通過市場化手段,促進了電力資源的有效分配,為電力行業的可持續發展提供了動力。 合邦電力…

OLED的顯示

一、I2C I2C時序:時鐘線SCL高電平下:SDA由高變低代表啟動信號,開始發送數據;SCL高電平時,數據穩定,數據可以被讀走,開始進行讀操作,SCL低電平時,數據發生改變&#xff1…

VMware運維效率提升50%,RVTools管理更簡單

RVTools 是一款專為 VMware 虛擬化環境量身打造的高效管理工具,基于 .NET 4.7.2 框架開發,并與 VMware vSphere Management SDK 8.0 和 CIS REST API 深度集成,能夠全面呈現虛擬化平臺的各項關鍵數據。該工具不僅能夠詳細列出虛擬機、CPU、內…

JS 中 json數據 與 base64、ArrayBuffer之間轉換

JS 中 json數據 與 base64、ArrayBuffer之間轉換 json 字符串進行 base64 編碼 function jsonToBase64(json) {return Buffer.from(json).toString(base64); }base64 字符串轉為 json 字符串 function base64ToJson(base64) {try {const binaryString atob(base64);const js…

介紹 C++ 中的智能指針及其應用:以 PyTorch框架自動梯度AutogradMeta為例

介紹 C 中的智能指針及其應用:以 AutogradMeta 為例 在 C 中,智能指針(Smart Pointer)是用于管理動態分配內存的一種工具。它們不僅自動管理內存的生命周期,還能幫助避免內存泄漏和野指針等問題。在深度學習框架如 Py…

python +t kinter繪制彩虹和云朵

python t kinter繪制彩虹和云朵 彩虹,簡稱虹,是氣象中的一種光學現象,當太陽光照射到半空中的水滴,光線被折射及反射,在天空上形成拱形的七彩光譜,由外圈至內圈呈紅、橙、黃、綠、藍、靛、紫七種顏色。事實…

Zabbix5.0版本(監控Nginx+PHP服務狀態信息)

目錄 1.監控Nginx服務狀態信息 (1)通過Nginx監控模塊,監控Nginx的7種狀態 (2)開啟Nginx狀態模塊 (3)配置監控項 (4)創建模板 (5)用默認鍵值…

Python入門教程 —— 字符串

字符串介紹 字符串可以理解為一段普通的文本內容,在python里,使用引號來表示一個字符串,不同的引號表示的效果會有區別。 字符串表示方式 a = "Im Tom" # 一對雙引號 b = Tom said:"I am Tom" # 一對單引號c = Tom said:"I\m Tom" # 轉義…

AcWing練習題:差

讀取四個整數 A,B,C,D,并計算 (AB?CD)的值。 輸入格式 輸入共四行,第一行包含整數 A,第二行包含整數 B,第三行包含整數 C,第四行包含整數 D。 輸出格式 輸出格式為 DIFERENCA X,其中 X 為 (AB?CD) 的…

小程序添加購物車業務邏輯

數據庫設計 DTO設計 實現步驟 1 判斷當前加入購物車中的的商品是否已經存在了 2 如果已經存在 只需要將數量加一 3 如果不存在 插入一條購物車數據 4 判斷加到本次購物車的是菜品還是套餐 Impl代碼實現 Service public class ShoppingCartServiceImpl implements Shoppin…

如何在谷歌瀏覽器中使用自定義搜索快捷方式

在數字時代,瀏覽器已經成為我們日常生活中不可或缺的一部分。作為最常用的瀏覽器之一,谷歌瀏覽器憑借其簡潔的界面和強大的功能深受用戶喜愛。本文將詳細介紹如何自定義谷歌瀏覽器的快捷工具欄,幫助你更高效地使用這一工具。 一、如何找到谷歌…

Python 3 與 Python 2 的主要區別

文章目錄 1. 語法與關鍵字print 函數整數除法 2. 字符串處理默認字符串類型字符串格式化 3. 輸入函數4. 迭代器和生成器range 函數map, filter, zip 5. 標準庫變化urllib 模塊configparser 模塊 6. 異常處理7. 移除的功能8. 其他重要改進數據庫操作多線程與并發類型注解 9. 總結…

關于IDE的相關知識之二【插件推薦】

成長路上不孤單😊😊😊😊😊😊 【14后😊///計算機愛好者😊///持續分享所學😊///如有需要歡迎收藏轉發///😊】 今日分享關于ide插件推薦的相關內容&#xff01…

如何獲取穩定高效的動態代理?

在數據采集的領域,動態代理IP是我們探索網絡世界的小助手,它不僅幫助我們高效地收集信息,還能在保護數據安全方面發揮重要作用。但如何在眾多選擇中找到最適合的那個——即穩定且高效的動態代理也是一大難題。 明確你的需求 首先&#xff0…

基于微信小程序的校園點餐平臺的設計與實現(源碼+SQL+LW+部署講解)

文章目錄 摘 要1. 第1章 選題背景及研究意義1.1 選題背景1.2 研究意義1.3 論文結構安排 2. 第2章 相關開發技術2.1 前端技術2.2 后端技術2.3 數據庫技術 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系統需求分析 4. 第4章 系統概要設計4.1 系統功能模塊設計4.2 數據庫設計 5.…

原生js封裝ajax請求以及css實現提示效果和禁止點擊效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0,user-scalableno"><title>本地模式網絡切換</title>&l…

Pytorch的自動求導模塊

文章目錄 torch.autograd.backward()基本用法非標量張量的反向傳播保留計算圖指定輸入張量高階梯度計算 與 y.backward() 的區別torch.autograd.grad()基本用法非標量張量的梯度高階梯度計算多輸入、多輸出的梯度計算未使用的輸入張量保留計算圖 與 backward() 的區別 torch.au…

Mac OS

本文來自智譜清言 ------ Mac OS&#xff08;現稱為macOS&#xff09;是蘋果公司開發和銷售的操作系統&#xff0c;自1984年推出以來&#xff0c;它已經經歷了多次重大的演變和發展。 起源&#xff1a;Mac OS 1.0的誕生 - 1984年&#xff0c;蘋果發布了Macintosh計算機&#…

spring中使用@Validated,什么是JSR 303數據校驗,spring boot中怎么使用數據校驗

文章目錄 一、JSR 303后臺數據校驗1.1 什么是 JSR303&#xff1f;1.2 為什么使用 JSR 303&#xff1f; 二、Spring Boot 中使用數據校驗2.1 基本注解校驗2.1.1 使用步驟2.1.2 舉例Valid注解全局統一異常處理 2.2 分組校驗2.2.1 使用步驟2.2.2 舉例Validated注解Validated和Vali…