获得 Deeplab 对小/欠平衡类的更严格的分割结果

Posted

技术标签:

【中文标题】获得 Deeplab 对小/欠平衡类的更严格的分割结果【英文标题】:Getting tighter segmentation results of Deeplab for small/underbalanced classes 【发布时间】:2021-04-17 08:19:40 【问题描述】:

我已经在 CelebAMask-HQ 数据集 (https://github.com/switchablenorms/CelebAMask-HQ) 上训练了官方 Tensorflow deeplab 模型 (https://github.com/tensorflow/models/tree/master/research/deeplab),以拥有一个可以在语义上分割所有面部片段(例如眼睛、鼻子等)的模型。我在超参数设置上花费的时间很少,并使用默认设置:

CUDA_VISIBLE_DEVICES=0 python "$WORK_DIR"/deeplab/train.py \
  --logtostderr \
  --train_split="train" \
  --model_variant="xception_65" \
  --atrous_rates=6 \
  --atrous_rates=12 \
  --atrous_rates=18 \
  --output_stride=16 \
  --decoder_output_stride=4 \
  --train_crop_size="1025,1025" \
  --train_batch_size=2 \
  --training_number_of_steps=45000 \
  --fine_tune_batch_norm=false \
  --tf_initial_checkpoint="$WORK_DIR/deeplab/pretrained_models/deeplabv3_pascal_trainval/model.ckpt" \
  --train_logdir="$WORK_DIR/deeplab/logs" \
  --dataset="celeba" \
  --dataset_dir="$WORK_DIR/deeplab/datasets/celeba/tfrecords_padded/"

我唯一调整的是类权重,其中我根据总数据集中属于每个类的所有像素的比率计算了类权重。这些计算的比率是:

class_ratio = 0: 0.287781127731224, #BG
                       1: 0.31428004829848194, #hair
                       2: 0.25334614328648697, #face
                       3: 0.008209905199792278, #brows
                       4: 0.0044636011242926155, #eyes
                       5: 0.020564768086557928, #nose
                       6: 0.004150659950132944, #u_lip
                       7: 0.00680743101856918, #l_lip
                       8: 0.0030163743167156494, #mouth
                       9: 0.040800302545885576, #neck
                       10: 0.008106960279456135, #ears
                       11: 0.03355246488702522, #clothes
                       12: 0.009293231642880359, #hat
                       13: 0, #ear_ring -> 0
                       14: 0, #glasses -> 0
                       15: 0 #necklace -> 0
                       

作为类权重,我取1/<class_ratio>,所以背景的类权重是 3.57,眉毛的类权重是 121.95。

最后,我做了一些数据增强,比如旋转、翻转和改变亮度。

我的结果相当不错,但是当我将训练集的一些图像输入到模型中时,有一些值得注意的地方。在原始分段下方:

这里是分段结果:

如您所见,分割结果非常好,但尤其是眼睛、眉毛和鼻子等较小的类别并没有像我希望的那样“紧密分割”。基本上对于模型分割出来的所有图像,眼睛、鼻子和眉毛都大于原始分割。因此,我想更改一些超参数以获得更紧密的小类分割结果。

对于为较小的班级获得更严格的结果的可能方法有什么建议吗?我目前根据总数据集中属于每个类的像素的绝对百分比计算类权重的方法效果很好,但也许另一种计算类权重的方法效果更好?还是可以做精细分割的不同底层模型结构?

感谢任何帮助。谢谢!

【问题讨论】:

【参考方案1】:

您可以尝试使用 DPC 的 xception-71,这应该可以提供更紧密的细分。

或者你可以试试这个https://github.com/tensorflow/models/issues/3739#issuecomment-527811265。

【讨论】:

以上是关于获得 Deeplab 对小/欠平衡类的更严格的分割结果的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB深度学习采用 Deeplab v3+ 实现全景分割

MATLAB深度学习采用 Deeplab v3+ 实现全景分割

深度学习系列分割网络模型(DeepLab V1V2V3V3+PSPNet)

论文复现|Panoptic Deeplab(全景分割PyTorch)

tensorflow语义分割api使用(deeplab训练cityscapes)

如何在 Xcode 中应用 Deeplab V3 进行实时分割?