DeepLab 的 --train_crop_size 实际上是做啥的?

Posted

技术标签:

【中文标题】DeepLab 的 --train_crop_size 实际上是做啥的?【英文标题】:What does DeepLab's --train_crop_size actually do?DeepLab 的 --train_crop_size 实际上是做什么的? 【发布时间】:2019-09-29 10:57:00 【问题描述】:

在instructions included in the model 之后,--training_crop_size 设置为远小于训练图像大小的值。例如:

python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=90000 \
    --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="769,769" \
    --train_batch_size=1 \
    --dataset="cityscapes" \
    --tf_initial_checkpoint=$PATH_TO_INITIAL_CHECKPOINT \
    --train_logdir=$PATH_TO_TRAIN_DIR \
    --dataset_dir=$PATH_TO_DATASET

但是这个选项实际上有什么作用呢?是否需要随机裁剪每个训练图像?如果是这样,输入尺寸会不会更小,例如,769x769(WxH)?根据说明,评估裁剪大小设置为 2049x1025。当没有调整图像大小的建议时,输入尺寸为 769x769 的网络如何接受 2049x1025 输入?会出现形状不匹配的问题。

指令是否冲突?

【问题讨论】:

【参考方案1】:

是的,在您的情况下,图像似乎在训练过程中被裁剪。这可以在系统的计算限制内实现更大的批量大小。较大的批量会导致基于多个实例的优化步骤,而不是每个优化(=训练)步骤仅考虑一个(或很少)实例。这通常会带来更好的结果。通常使用随机裁剪来确保网络在图像的所有部分上都经过训练。

“全卷积”CNN 的训练或部署不需要固定的输入大小。通过在输入边缘使用填充,维度减少通常由 2^n 的因子表示(由跨步或池化引起)。示例:在解码器再次对其进行上采样之前,您的编码器将每个空间维度减少了 2^4 倍。 --> 所以你只需要确保你的输入维度是 2^4 的倍数(确切的输入大小无关紧要,它只是在训练期间定义网络隐藏层的空间维度)。在 deeplab 的情况下,框架会自动将给定的输入尺寸调整为所需的 2^x 倍数,以使其更易于使用。

决不能随机裁剪评估实例,因为只有确定性评估过程才能保证有意义的评估结果。在评估期间,没有优化,批量大小为 1 即可。

【讨论】:

【参考方案2】:

他们似乎在评估期间使用完整图像。它通常是通过在最后一个卷积层中平均一个更大的张量来完成的。他们还提到,由于完整的图像评估,裁剪尺寸必须设置为数据集中可用图像的最大尺寸。

source, see Q8

【讨论】:

是的,但是在训练期间,当完整图像大得多时,图像是否被裁剪为 769x769(随机?)?它是有效的图像增强吗?

以上是关于DeepLab 的 --train_crop_size 实际上是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

Deeplab v3 : 源码训练和测试

我可以将 deeplab 微调到 tensorflow 中的自定义数据集吗?

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

DeepLab v3+

DeepLab 的 --train_crop_size 实际上是做啥的?

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