Boundary Aware PoolNet(3):Boundary Aware PoolNet模型與代碼介紹

Boundary Aware PoolNet = PoolNet + BASNet,即使用BASNet中的Deep Supervision策略和Hybrid Loss改進PoolNet。

前面兩篇文章分別介紹了PoolNet的模型及其代碼、BASNet中的深度監督策略和混合損失函數,現在讓我們看向PoolNet,使用BASNet一文提出的Deep Supervision和Hybrid Loss,形成BAPoolNet(Boundary Aware PoolNet)。

本文將詳細介紹如何使用BASNet中的的Deep Supervision和Hybrid Loss改進PoolNet得到BAPoolNet,並介紹我在研究BAPoolNet時觀察到的一些現象和結論。

相關文章彙總:

BAPoolNet結構

在PoolNet中Backbone是ResNet50時,模型自頂向下路徑中有5個FUSE操作,我借鑑BASNet中的Deep Supervision和Hybrid Loss使用這5層輸出的混合Loss之和進行梯度下降,我將這整個模型稱爲BAPoolNet(Boundary Aware PoolNet),其結構如下圖所示。

img

與PoolNet相比,BAPoolNet的不同之處爲:

  1. 添加5個邊路輸出以進行Deep Supervision
  2. 在計算Loss時使用BCE損失、SSIM損失、IOU損失之和

如何實現Boundary Aware PoolNet,具體請看代碼。

BAPoolNet訓練

訓練設置

本文使用DUTS數據集進行模型訓練和測試,其訓練集包含10553張圖片、測試集包含5019張圖片。

除了對PoolNet的改進之外,BAPoolNet的其它實現細節和實驗細節和PoolNet保持一致。

訓練過程中五個邊路輸出損失的變化情況

img

訓練過程中三種損失的變化情況

img

5個邊路輸出可視化結果

img

訓練過程中MAE的變化情況

下圖爲在DUTS-TE數據集上的測試結果。

img

訓練過程中F-measure的變化情況

下圖爲在DUTS-TE數據集上的測試結果(二值化閾值爲0.5)。

img

BAPoolNet性能

視覺對比

img

量化對比

下表中MAE和maxF爲各方法在DUTS-TE數據集上的測試結果。

Method Conference Backbone Size(MB) MAE↓ maxF↑
CapSal CVPR19 ResNet-101 - 0.063 0.826
PiCANet CVPR18 ResNet-50 197.2 0.050 0.860
DGRL CVPR18 ResNet-50 646.1 0.049 0.828
BASNet CVPR19 ResNet-34 348.5 0.047 0.860
U2Net CVPR20 RSU 176.3 0.044 0.873
CPD CVPR19 ResNet-50 183.0 0.043 0.865
PoolNet CVPR19 ResNet-50 260.0 0.040 0.880
BAPoolNet - ResNet-50 260.7 0.035 0.892

PR曲線

下圖爲各方法在DUTS-TE數據集上的測試結果。

img

F-measure曲線

下圖爲各方法在DUTS-TE數據集上的測試結果。

img

BAPoolNet代碼

傳送門(Boundary Aware PoolNet代碼):https://github.com/chouxianyu/Boundary-Aware-PoolNet

相比於PoolNet,BAPoolNet代碼的改動之處有:

  1. BCE Loss計算方法

    設置爲reduction=mean而非reduction=sum,並且用sigmoid+BCE代替F.binary_cross_entropy_with_logits

  2. PoolNetforward()返回結果

    PoolNet類返回了5個邊路輸出而非最終輸出

  3. 整體Loss計算方法

    使用Hybrid Loss和Deep Supervision計算整體Loss

模型性能評估代碼(MAE、F-measure等),我參考了:https://github.com/Hanqer/Evaluate-SOD

除了對PoolNet的改進之外,BAPoolNet的其它實現細節和實驗細節和PoolNet保持一致。

實驗細節

“黑圖片”問題

在訓練模型時,如果模型使用train()模式,結果反而比eval()差,具體現象爲使用train()模式時,預測結果中有大量“黑圖片”,即圖片中的像素幾乎都是黑色的。

淺/深層的作用

將5個邊路輸出可視化,可以看出0層的主要作用是定位顯著目標,而後幾層的主要作用是細化顯著目標的特徵,即在自頂向下路徑中顯著目標的細節逐漸豐富,同時這也代表着當淺層無法準確定位顯著目標時最終輸出也就無法準確定位顯著目標。

我嘗試過在計算5層Loss之和時調整不同層Loss的權重,比如第1層Loss權重爲5、其它4層Loss權重爲1或者前4層Loss權重爲1、最後1層Loss權重爲10等等,評估指標(MAE、F-meausure)顯示調整不同層Loss權重的做法對性能提升並沒有什麼作用。

既然自頂向下路徑中淺層富含高級語義信息/局部細節信息較少、深層高級語義信息相對較少/局部細節信息豐富,我想也許可以利用這一點在不同層使用不同的損失函數。(學識尚淺,也許這樣並無效果)

其它

基於Deep Supervision+Hybrid Loss,我還做了一些更具體的嘗試,結果如下:

  1. F.binary_cross_entropy_with_logits換爲sigmoid+BCE對結果並沒有什麼影響,雖然官方也說了兩者僅在計算上有細微差別。
  2. 若只使用BCE Loss,則reduction=meanreduction=sum在訓練效果上差別不大,只是兩者所得Loss數值的數量級有所差異,前者Loss的數量級爲0到10,後者Loss的數量級在1000到幾萬。
  3. 在計算邊路輸出時使用3×3卷積或者1×1卷積,評估所得模型,MAE、F-measure等差別不大。
  4. 調整不同層Loss的權重對模型性能不大。
  5. 調整學習率對模型性能影響不大。

Github(github.com):@chouxianyu

Github Pages(github.io):@臭鹹魚

知乎(zhihu.com):@臭鹹魚

博客園(cnblogs.com):@臭鹹魚

B站(bilibili.com):@絕版臭鹹魚

微信公衆號:@臭鹹魚

轉載請註明出處,歡迎討論和交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章