簡介
語義分割:給圖像的每個像素點標注類別。通常認為這個類別與鄰近像素類別有關,同時也和這個像素點歸屬的整體類別有關。利用圖像分類的網絡結構,可以利用不同層次的特征向量來滿足判定需求。現有算法的主要區別是如何提高這些向量的分辨率,以及如何組合這些向量。
幾種結構
- 全卷積網絡FCN:上采樣提高分割精度,不同特征向量相加。[3]
- UNET:拼接特征向量;編碼-解碼結構;采用彈性形變的方式,進行數據增廣;用邊界加權的損失函數分離接觸的細胞。[4]
- SegNet:記錄池化的位置,反池化時恢復。[3]
- PSPNet:多尺度池化特征向量,上采樣后拼接[3]
- Deeplab:池化跨度為1,然后接帶孔卷積。
- ICNet:多分辨圖像輸入,綜合不同網絡生成結果。
實驗設計
測試平台
- 采用[1]的代碼,去掉one_hot,把損失函數改成交叉熵。
- 在驗證過程引入pixel accuray和mIOU,代碼見[2]
- 用顏色代碼替換標簽的類別代碼,這樣visdom可以顯示多類別標簽
數據集
- [1]自帶數據集Bag,二分類,圖像800800,代碼中轉換到160160。
- 這個數據集很容易收斂,可以忽略優化器的影響,用來估計網絡結構的性能上限。
- CamVid,代碼見[2],從視頻中截取的,圖像很相似。圖像尺寸960*720。
- PASCAL VOC 2007/2012,代碼參照[3],圖像差別大。
測試計划
- 在github上收集能成功運行的模型
- 在同等條件下比較技術細節:vgg16為基礎結構
- 比較單層特征向量進行轉置卷積、上采樣或者反池化后的效果
- 比較特征向量的拼接和線性組合
- 比較多尺度輸入的網絡組合
實驗結果
超參數:epochs=50,lr=0.001,optim=SGD,momentum=0.7u
數據集:Bag,resize(160,160),batch_size=4
注意vgg16正確的層號,每層最后一個是池化。
feats = list(models.vgg16(pretrained=True).features.children())
self.feat1 = nn.Sequential(*feats[0:5])
self.feat2 = nn.Sequential(*feats[5:10])
self.feat3 = nn.Sequential(*feats[10:17])
self.feat4 = nn.Sequential(*feats[17:24])
self.feat5 = nn.Sequential(*feats[24:31])
單層特征向量
1*1卷積+標簽收縮(到對應層尺寸)
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5 | 8 | 82 | 90 | 1.1 |
4 | 8 | 86 | 93 | 1.0 |
3 | 6 | 80 | 90 | 1.0 |
1*1卷積+上采樣(2倍)+標簽收縮
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5->4 | 8 | 72 | 85 | 1.1 |
4->3 | 6 | 80 | 90 | 1.0 |
3->2 | 5 | 78 | 88 | 1.0 |
1*1卷積+轉置卷積(2倍)+標簽收縮
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5->4 | 8 | 79 | 89 | 1.1 |
4->3 | 6 | 84 | 92 | 1.0 |
3->2 | 5 | 80 | 90 | 1.0 |
反池化(2倍)+1*1卷積+標簽收縮
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5->4 | 8 | 84 | 92 | 1.1 |
4->3 | 7 | 87 | 94 | 1.1 |
3->2 | 5 | 84 | 91 | 1.0 |
池化(stride=1)+2*2卷積(stride=1,padding=1)+標簽收縮
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5->4 | 8 | 84 | 92 | 1.1 |
4->3 | 7 | 89 | 95 | 1.0 |
3->2 | 7 | 80 | 90 | 1.1 |
多層特征向量組合
- 理論上,求和是拼接+1*1卷積的一個特例。
上采樣(逐層,直到原始尺寸)+1*1卷積+求和(FCN)
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5 | 8 | 82 | 91 | 1.2 |
5+4 | 8 | 88 | 94 | 1.2 |
5+4+3 | 9 | 88 | 94 | 1.2 |
上采樣(逐層,直到原始尺寸)+1*1卷積+拼接(UNET')
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5 | 8 | 82 | 91 | 1.2 |
5+4 | 9 | 87 | 93 | 1.2 |
5+4+3 | 9 | 89 | 94 | 1.1 |
上采樣(直接達到原始尺寸)+1*1卷積+拼接(PSPNET')
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5 | 8 | 84 | 92 | 1.2 |
5+4 | 9 | 87 | 93 | 1.2 |
5+4+3 | 8 | 88 | 94 | 1.2 |
反池化(逐層)+1*1卷積+上采樣(SegNet')
網絡層 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
5 | 8 | 82 | 91 | 1.1 |
5->4 | 8 | 88 | 94 | 1.1 |
5->4->3 | 9 | 89 | 95 | 1.1 |
附加實驗
epochs=100,lr=3e-3
網絡 | 單epoch時間(s) | mIOU(%) | pixel-acc(%) | GPU(G) |
---|---|---|---|---|
PSPNET(反池化) | 8 | 91 | 96 | 1.1 |
PSPNET(池化,stride=1) | 9 | 91 | 96 | 1.2 |
引用
- https://github.com/bat67/pytorch-FCN-easiest-demo
- https://github.com/pochih/FCN-pytorch
- https://github.com/bodokaiser/piwise
- https://github.com/jaxony/unet-pytorch/
參考文獻
- Long J , Shelhamer E , Darrell T . Fully Convolutional Networks for Semantic Segmentation[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2014, 39(4):640-651.
- Ronneberger O, Fischer P, Brox T. U-Net: Convolutional Networks for Biomedical Image Segmentation[C]// International Conference on Medical Image Computing & Computer-assisted Intervention. 2015.
- Zhao H , Shi J , Qi X , et al. Pyramid Scene Parsing Network[J]. 2016.
- Chen L C , Papandreou G , Schroff F , et al. Rethinking Atrous Convolution for Semantic Image Segmentation[J]. 2017.
- Zhao H, Qi X, Shen X, et al. ICNet for Real-Time Semantic Segmentation on High-Resolution Images[J]. 2017.