- +1
如何用PyTorch進行語義分割?一個教程教會你
木易 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
很久沒給大家帶來教程資源啦。
正值PyTorch 1.7更新,那么我們這次便給大家帶來一個PyTorch簡單實用的教程資源:用PyTorch進行語義分割。

該教程是基于2020年ECCV Vipriors Chalange Start Code實現了語義分割,并且添加了一些技巧。
友情提示:教程中的所有文件均可以在文末的開源地址獲取。
預設置
在開始訓練之前,得首先設置一下庫、數據集等。
庫準備
pip install -r requirements.txt
下載數據集
教程使用的是來自Cityscapes的數據集MiniCity Dataset。

將各基準類別進行輸入:


如下圖中所示的墻、柵欄、公共汽車、火車等。

訓練基準模型
使用來自torchvision的DeepLabV3進行訓練。
硬件為4個RTX 2080 Ti GPU (11GB x 4),如果只有1個GPU或較小的GPU內存,請使用較小的批處理大小(< = 8)。
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;
python baseline.py --save_path baseline_run_deeplabv3_resnet101 --model DeepLabv3_resnet101 --train_size 512 1024 --test_size 512 1024 --crop_size 384 768 --batch_size 8;
損失函數
有3種損失函數可供選擇,分別是:交叉熵損失函數(Cross-Entropy Loss)、類別加權交叉熵損失函數(Class-Weighted Cross Entropy Loss)和焦點損失函數(Focal Loss)。
交叉熵損失函數,常用在大多數語義分割場景,但它有一個明顯的缺點,那就是對于只用分割前景和背景的時候,當前景像素的數量遠遠小于背景像素的數量時,模型嚴重偏向背景,導致效果不好。
# Cross Entropy Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;
類別加權交叉熵損失函數是在交叉熵損失函數的基礎上為每一個類別添加了一個權重參數,使其在樣本數量不均衡的情況下可以獲得更好的效果。
# Weighted Cross Entropy Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50_wce --crop_size 576 1152 --batch_size 8 --loss weighted_ce;
焦點損失函數則更進一步,用來解決難易樣本數量不平衡。
# Focal Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50_focal --crop_size 576 1152 --batch_size 8 --loss focal --focal_gamma 2.0;
歸一化層
有4種歸一化方法:BN(Batch Normalization)、IN(Instance Normalization)、GN(Group Normalization)和EvoNorm(Evolving Normalization)。

# Batch Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;
IN在圖像像素上,對H、W做歸一化,用在風格化遷移。
# Instance Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50_instancenorm --crop_size 576 1152 --batch_size 8 --norm instance;
GN將通道分組,然后再做歸一化。
# Group Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50_groupnorm --crop_size 576 1152 --batch_size 8 --norm group;
EvoNorm則是4月份由谷歌和DeepMind 聯合發布的一項新技術。實驗證明,EvoNorms 在多個圖像分類模型上效果顯著,而且還能很好地遷移到 Mask R-CNN 模型和 BigGAN。
# Evolving Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50_evonorm --crop_size 576 1152 --batch_size 8 --norm evo;
數據增強
2種數據增強技術:CutMix、Copy Blob。
CutMix
將一部分區域cut掉但不填充0像素,而是隨機填充訓練集中的其他數據的區域像素值,分類結果按一定的比例分配。

# CutMix Augmentation
python baseline.py --save_path baseline_run_deeplabv3_resnet50_cutmix --crop_size 576 1152 --batch_size 8 --cutmix;
Copy Blob
在 Blob 存儲的基礎上構建,并通過Copy的方式增強了性能。

# CopyBlob Augmentation
python baseline.py --save_path baseline_run_deeplabv3_resnet50_copyblob --crop_size 576 1152 --batch_size 8 --copyblob;
推理
訓練結束后,對訓練完成的模型進行評估。
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --batch_size 4 --predict;
多尺度推斷
使用[0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.2]進行多尺度推理。另外,使用H-Flip,同時必須使用單一批次。
# Multi-Scale Inference
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --batch_size 1 --predict --mst;
使用驗證集計算度量
計算指標并將結果保存到results.txt中。
python evaluate.py --results baseline_run_deeplabv3_resnet50/results_val --batch_size 1 --predict --mst;
最終結果

如果使用了更大的模型或者更大的網絡結構,性能可能會有所提高。
另外,如果使用了各種集成模型,性能也會有所提高。
資源地址:
https://github.com/hoya012/semantic-segmentation-tutorial-pytorch
— 完 —
本文系網易新聞?網易號特色內容激勵計劃簽約賬號【量子位】原創內容,未經賬號授權,禁止隨意轉載。
原標題:《如何用PyTorch進行語義分割?一個教程教會你|資源》
本文為澎湃號作者或機構在澎湃新聞上傳并發布,僅代表該作者或機構觀點,不代表澎湃新聞的觀點或立場,澎湃新聞僅提供信息發布平臺。申請澎湃號請用電腦訪問http://renzheng.thepaper.cn。





- 報料熱線: 021-962866
- 報料郵箱: news@thepaper.cn
互聯網新聞信息服務許可證:31120170006
增值電信業務經營許可證:滬B2-2017116
? 2014-2025 上海東方報業有限公司




