深度學習:乳腺檢測abnormality detection in mammography +CAM
論文:Abnormality detection in mammography using deep convolutional Neural Networks
資料集:CBIS-DDSM (CC+MLO)*(right +left) one person ==》 (753鈣化)+(891腫塊) 資料增擴rotation
任務:二分類:calcification鈣化+mass腫塊
定位:CAM
網路結構:AlexNet / VGGNET/GOOGLENET/RESNET+two classification
訓練流程:
- 1、用掩碼獲取patch,將兩種patch送入網路訓練(resize224*224) train ,input mammorgram full-size test
- 2、經過CAM->heatmap
名詞解釋
1、CAM(Class Activation Mapping)
參考:CAM:https://blog.csdn.net/weixin_40955254/article/details/81191896
參考:憑什麼相信你的模型CAM:https://www.jianshu.com/p/1d7b5c4ecb93
在Learning Deep Features for Discriminative Localization這篇文章中,作者提出了CNN網路除了具有很強的圖片處理,分類能力;同時還能夠針對圖片中的關鍵部分進行定位,這個過程被稱為Class Activation Mapping,簡稱CAM。
那麼什麼叫做CAM呢,如下圖所示,第一組輸入圖片,訓練的標籤式刷牙,那麼通過based model+CAM之後,我們可以得到如下圖第二行所示的熱度圖,在對最後結果影響比較大的地方生成的熱度就比較高,我們可以看到在這兩張圖片中對於嘴以及牙刷的熱度都比較高,我們可以得出這兩個部分對於最後刷牙的結果有著比較大的影響。對於第三列和第四列的結果,我就不多描述了,很好懂。
下面就來講講CAM的網路架構,如下圖所示。輸入一張圖片,然後進過CNN網路提取出許多feature map,每個fearure map都能夠表示出整個網路的部分特徵。這裡的CNN網路可以使用VGG啊,或者google net系列的例如inception等等,但是有這樣一個問題,我們認為feature map還保留著圖片的空間資訊,這也是為什麼最後通過ifeature map的疊加可以得到class activation map的原因。而通常的網路中會選擇全連線層進行圖片特徵圖向特徵向量的轉換在這個轉換過程中就會丟失空間資訊
所以文中採用global average pooling(GAP)(可以把GAP視為一個特殊的average pool層,只不過其pool size和整個特徵圖一樣大,其實說白了就是求每張特徵圖所有畫素的均值。)來代替fully connected。然後將生成的這個值,最後通過一個全連線層實現相應的分類結果,相應的全連線層的權重稱為相應的權重w1,w2.。。。。。
我們這樣想最後生成的結果分類結果,其實就是pool之後的值與相應權重的乘積,相應的這個pool值是由GAP生成的,所以最後分類的結果可以看為是特徵圖與權重的乘積,這時候權重就代表了每個特徵圖對於最後結果的貢獻程度,那麼假如我們將特徵圖乘以權重直接相加,那麼對於最後結果影響大的地方因該有相對較大的值,小的地方有相對較小的值,這個過程也就是CAM的原理講解。具體的過程可以看圖二的下面部分,瞭解具體操作。
在卷積層之後,使用了一個叫GAP的池,全稱是global average pooling。全域性平均池的優點就是大量減少引數量,以及保持影象的空間結構。尾端使用全連線層full connected layer進行分類輸出。該層能夠針對每一個分類有一套權重。
當然這裡有幾個地方需要說明,首先就是應用之前需要對模型進行預訓練,才能夠進行CAM接下來的操作。其次過於最後生成特徵圖的大小對於不同的基模型有不同的方案,比如Alexnet的13*13,vgg的14*14,Googlenet的14*14.所以對於我們所希望獲得的原圖,最後是需要進行resize的。
PS也許有同學要問,全域性池化為什麼要使用average這種方法呢,max不行嘛?
答案是有一種CAM就是基於max pooling(GMP)的,但是他存在一些問題,就是基於average的CAM可以標出重要影響的所有區域,而基於max的CAM卻只能標註出ROI區域的右下方的一個關鍵點。這個使得基於GMP的CAM在分類效果上與基於GAM的差不多,但是在定位問題上就要顯得遜色一點。
使用 Inception V3 舉例:
該網路經過卷積層後,大小為(8x8x2048),經過GAP層後(1x1x2048),全連線層權重為(2048x10)。10個類別分別對應著10個全連線層權重,每個類別對應2048個權重。
生成熱力圖時,將圖片卷積後的(8x8x2048)和某一類別全連線層權重(1x2048)的乘積後得到熱力圖(8x8)。將該熱力圖暴力展開成所需要的大小即可。
程式碼:github中,可自行下載檢視,歡迎交流,歡迎star。(https://github.com/wpydcr/tf-slim-Class-Activation-Map)
我們重點看下經過GAP之後與輸出層的連線關係(暫不考慮softmax層),實質上也是就是個全連線層,只不過沒有了偏置項,如圖所示:
從圖中可以看到,經過GAP之後,我們得到了最後一個卷積層每個特徵圖的均值,通過加權和得到輸出(實際中是softmax層的輸入)。需要注意的是,對每一個類別C,每個特徵圖k的均值都有一個對應的w,記為w_k^c。CAM的基本結構就是這樣了,下面就是和普通的CNN模型一樣訓練就可以了。訓練完成後才是重頭戲:我們如何得到一個用於解釋分類結果的熱力圖呢?其實非常簡單,比如說我們要解釋為什麼分類的結果是羊駝,我們把羊駝這個類別對應的所有w_k^c取出來,求出它們與自己對應的特徵圖的加權和即可。由於這個結果的大小和特徵圖是一致的,我們需要對它進行上取樣,疊加到原圖上去,如下所示。
這樣,CAM以熱力圖的形式告訴了我們,模型是重點通過哪些畫素確定這個圖片是羊駝了。