代码:https://github.com/hszhao/PSPNet
论文:https://arxiv.org/abs/1612.01105
论文理解:
文章针对的问题:
(1)Mismatched Relationship
关系匹配不明确:很多分割场景中,单独看某个目标很容易误分割,需要将目标放在全图中才能确定目标。比如,上图第一行中水上面的目标,应该是boat,而不会是car。即需要结合上下文语境,才能分辨的出的目标。
(2)Confusion Categories
类别混淆:有的场景中,存在很多类别概念本身很模糊的目标,比如上图第二行中,building和skyscraper ,两者本身都属于建筑,但是,两者类别还是不同,需要区别开。
(3)Inconspicuous Classes
类别不明确:这种情况,常常因为位置关系,目标的类别也会不同,跟第一种问题相似,也需要结合上下文语境才能分别的出。比如上图第三行,床单,窗帘和枕头,这三个不同的类别,外观颜色特征一样,只是因为位置不同而类别不同而已。
文章解决的办法:
全局均值池化+特征融合
网络结构
(a)Input Image: batch_size X 3 X473 X 473
(b) Feature map :通过resnet提取图像特征,在提取特征过程中,使用卷积过程中增加空洞卷积的过程(步长:8)。
© pyramid pooling module:文章精华。将通过resnet获取得到的特征(batch_size X 2048 X60 60),构建4(可调整)层特征金字塔结构,每层的输入特征根据不同尺度的池化操作得到。第一层:使用60 X 60的ave pooling 得到batch_size X 2048 X1 X1的输入,然后通过1 * 1的卷积,将Feature map 数减少到原来的1/4,成batch_size X 512X1 X1,最后上采样到原来Feature map的尺寸大小,成batch_size X 512X60 X60;第二层:使用30X30的ave pooling 得到batch_size X 2048 X2X2的输入,然后与第一层一样;第三层:使用20X20的ave pooling 得到batch_size X 2048 X3X3的输入,然后与第一层一样;第四层:使用10X10的ave pooling 得到batch_size X 2048 X6X6的输入,然后与第一层一样。最后将这4层特征金字塔(深层特征)与resnet获取的Feature map(浅层特征),直接concat在一起,形成batch_size X 4096X60 X60的输出。
(d) Final Prediction: 将 pyramid pooling module得到的输出,进行1 * 1的卷积降维,然后上采样到原图大小。
intermediate supervision
在主干网络中,使用到了中间监督的方法。
论文复现:
环境:unbuntu14.04 ; cuda 10.0
Fintun pspnet101_VOC2012.caffemodel ,下载路径:https://github.com/hszhao/PSPNet/tree/master/evaluation/model
用来做路面分割。
数据集格式(跟训练segnet一样,前一列是原图路径,大小为473*473;后一列为原图对应的mask二值图像路径):
网络选择的pspnet101_VOC2012_train.prototxt,地址:https://github.com/hszhao/PSPNet/blob/master/evaluation/prototxt/pspnet101_VOC2012_473.prototxt
根据自己实际任务微调了下。
solver.prototxt
train_net: "/home1/PSPNet/PSPNet-master/models/road/trainNet/road2.prototxt"
iter_size: 4
lr_policy: "poly"
power: 0.9
base_lr: 1e-3
average_loss: 20
display: 20
momentum: 0.9
weight_decay: 0.0001
# imagenet
# max_iter: 150000
# PASCAL VOC
max_iter: 30000
# Cityscape
#max_iter: 90000
snapshot: 1000
snapshot_prefix: "/home1/PSPNet/PSPNet-master/models/road/model/road2"
solver_mode: GPU
训练脚本命令:
#!/usr/bin/env sh
./build/tools/caffe train \
--weights="/home1/PSPNet/PSPNet-master/models/road/fintuModel/pspnet101_VOC2012.caffemodel" \
--solver=./models/road/solver_road.prototxt -gpu 1,2 2>&1 | tee /home1/PSPNet/PSPNet-master/seg2.log
训练过程特别耗内存资源,我在训练时,同时用2块12G的GPU,如果网络中的骨干网络是resnet101,网络中的batch_size只能设置1,设置2就内存溢出,或者loss一直86.7,,,不收敛,如果2块12G的gpu,主干网络用resnet50,可以将batch_size设置成2.
下面是骨干网络是resnet101的pspnet与segnet测试对比:
![]() | ![]() |
---|---|
![]() | ![]() |
下面是骨干网络是resnet101和骨干网络是resnet50的测试对比(骨干网络是resnet101的模型大小:257M;骨干网络是resnet50的模型大小:187M):
![]() | ![]() |
---|---|
![]() | ![]() |