MS COCO 2014数据集fine-tune FCN做语义分割

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33000225/article/details/78997332



之前使用sift-flow数据集,用FCN官方代码(https://github.com/shelhamer/fcn.berkeleyvision.org)重现了semantic segmentation的实验。官方代码没有提供在MS COCO数据集下的相关代码,我自己尝试修改代码,利用MS COCO 2014的数据集实现了semantic segmentation。以下记录了代码修改的地方:



实验框架与环境:




代码修改地方:


1、输出维度更改:


        原sift-flow数据集有33个class,现在有81个class(80个真实class + 1个背景class。coco数据集原本是91个类别,但是2014的数据集只有80个 class有segmentation mask信息,详见[MS COCO论文]),所以要将卷积层的输出维度更改,即所有的 num_output从原来的33改为81(这里的改动要同步到.prototxt):





2、网络结构调整:


        由于输出维度做了更改,即网络的结构做了调整,这也导致了结构调整部分的weights.shape有变化,所以不能使用pre-trained model此部分的weights。因此在网络最后的prediction和score部分, weights需要重新初始化并训练。在caffe框架下,只需改动那部分网络结构的 名称即可,即凡是有 num_output的层都要赋予新名称(这里的改动要同步到.prototxt):





3、(Optional) ignore_label更改:


        原来sift-flow数据集设置255为void label,所以计算loss的时候会忽略label=255的计算,即设置SoftmaxWithLoss的ignore_label=255;在MS COCO数据集中,0为background label,因为COCO数据集中绝大部分图像的背景会占据一张图像的大部分区域(即segmentation mask中label=0占绝大多数),所以为了让其余真正的80个类能够很好的学习,这里会设置ignore_label=0,即可理解为 忽略对背景的学习
        (这里的改动要同步到.prototxt):




        但是这样会带来一个副作用是:模型基本不能分类为0,只能分类为1-80,即得到的segmentation mask几乎不能看到黑色背景。所以,ignore_label是否设为为背景(label=0),需要看数据集本身的情况以及训练的需要。

        假如这里设置为 ignore_label=255,即不再忽略背景的loss计算和学习(没有label为255,所以没有忽略的class),最后会得到一个结果是:单张图像的测试,能看到黑色背景了;整体准确率(overall accuracy)很高,但是每个class的平均准确率(mean accuracy)很低。这就是因为网络对某个 pixel 无法识别分类(加入了背景的学习会大大降低其他80个class的学习效果),就会把 label 置为 0,因此使得整体准确率很高的假象。


4、读取 image 和 label 的方式更改:


        由于原sift-flow的数据都为固定的256*256大小,但是COCO数据集的image_size各不相同,所以实验会先对原来数据处理成256*256大小。采取的方式为:先对image/label map按原长宽比等比例缩放到256大小,由于拉伸造成的空余位置采取padding 0补全。
        由于对image和label预处理后,都将单独的image/label保存为单独的npz包,所以数据读取方式从原来的读取.jpg和.mat,改为读取npz包:





5、删除 'geo' 相关内容,并调整网络结构:


        之前的sift-flow数据集有 'geo' 的相关数据,这里需要删除,即net.py和train/test.prototxt的有关 'geo' 的内容都删掉。
        另外还有一些小细节:





6、一些文件路径、文件名修改:


        这里根据自己情况修改即可。



不知道还有没有漏改的地方,有的话欢迎补充!



猜你喜欢

转载自blog.csdn.net/qq_33000225/article/details/78997332