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 微调到 tensorflow 中的自定义数据集吗?
论文复现|Panoptic Deeplab(全景分割PyTorch)