问题描述
我已经在 CelebAMask-HQ 数据集 (https://github.com/tensorflow/models/tree/master/research/deeplab) 上训练了官方的 Tensorflow deeplab 模型 (https://github.com/switchablenorms/CelebAMask-HQ),以获得一个可以对所有面部片段(例如眼睛、鼻子等)进行语义分割的模型.)我在超参数设置上花了很少的时间并使用默认设置:
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。
最后,我做了一些数据增强,例如旋转、翻转和改变亮度。
我的结果相当不错,但是当我将训练集的一些图像输入模型时,有一些值得注意的地方。在原始分割下方:
如您所见,分割结果非常好,但尤其是较小的类,例如眼睛、眉毛和鼻子,并没有像我希望的那样“紧密分割”。基本上对于模型分割出来的所有图像,眼睛、鼻子和眉毛都大于原始分割。因此,我想更改一些超参数以获得更小的类的更严格的分割结果。
对于为较小的班级获得更多结果的可能方法有什么建议吗?我目前根据属于总数据集中每个类的像素的绝对百分比来计算类权重的方法相当有效,但也许另一种计算类权重的方法效果更好?或者不同的底层模型结构可以做精细分割?
感谢任何帮助。谢谢!
解决方法
您可以尝试使用带有 DPC 的 xception-71,它可以提供更严格的细分。
或者你可以试试这个https://github.com/tensorflow/models/issues/3739#issuecomment-527811265。