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),其結構如下圖所示。
與PoolNet相比,BAPoolNet的不同之處爲:
- 添加5個邊路輸出以進行Deep Supervision
- 在計算Loss時使用BCE損失、SSIM損失、IOU損失之和
如何實現Boundary Aware PoolNet,具體請看代碼。
BAPoolNet訓練
訓練設置
本文使用DUTS數據集進行模型訓練和測試,其訓練集包含10553張圖片、測試集包含5019張圖片。
除了對PoolNet的改進之外,BAPoolNet的其它實現細節和實驗細節和PoolNet保持一致。
訓練過程中五個邊路輸出損失的變化情況
訓練過程中三種損失的變化情況
5個邊路輸出可視化結果
訓練過程中MAE的變化情況
下圖爲在DUTS-TE數據集上的測試結果。
訓練過程中F-measure的變化情況
下圖爲在DUTS-TE數據集上的測試結果(二值化閾值爲0.5)。
BAPoolNet性能
視覺對比
量化對比
下表中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數據集上的測試結果。
F-measure曲線
下圖爲各方法在DUTS-TE數據集上的測試結果。
BAPoolNet代碼
傳送門(Boundary Aware PoolNet代碼):https://github.com/chouxianyu/Boundary-Aware-PoolNet
相比於PoolNet,BAPoolNet代碼的改動之處有:
-
BCE Loss計算方法
設置爲
reduction=mean
而非reduction=sum
,並且用sigmoid+BCE
代替F.binary_cross_entropy_with_logits
。 -
PoolNet
forward()
返回結果PoolNet類返回了5個邊路輸出而非最終輸出
-
整體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,我還做了一些更具體的嘗試,結果如下:
- 將
F.binary_cross_entropy_with_logits
換爲sigmoid+BCE
對結果並沒有什麼影響,雖然官方也說了兩者僅在計算上有細微差別。 - 若只使用BCE Loss,則
reduction=mean
和reduction=sum
在訓練效果上差別不大,只是兩者所得Loss數值的數量級有所差異,前者Loss的數量級爲0到10,後者Loss的數量級在1000到幾萬。 - 在計算邊路輸出時使用3×3卷積或者1×1卷積,評估所得模型,MAE、F-measure等差別不大。
- 調整不同層Loss的權重對模型性能不大。
- 調整學習率對模型性能影響不大。
Github(github.com):@chouxianyu
Github Pages(github.io):@臭鹹魚
知乎(zhihu.com):@臭鹹魚
博客園(cnblogs.com):@臭鹹魚
B站(bilibili.com):@絕版臭鹹魚
微信公衆號:@臭鹹魚
轉載請註明出處,歡迎討論和交流!