TensorFlow Models 仓库 DeepLab FAQ 深度解析骨干网络扩展、自定义数据集、BN 微调与多卡训练实战【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models本文以 research/deeplab/g3doc/faq.md官方 FAQ为骨架逐条展开其背后对应的 DeepLab 训练/评估脚本与源码实现。读者在读完本文后将能够独立完成更换网络骨干ResNet 等、接入自定义分割数据集、复现官方精度基线、合理配置output_stride/atrous_rates/eval_crop_size、微调 BatchNorm 参数以及排查多 GPU 同步 / 异步训练缓慢等问题。1. FAQ 定位与适用代码范围本 FAQ 服务于仓库中的 DeepLab 语义分割实现主体代码位于 research/deeplab训练入口 train.py评估入口 eval.py公共 flag 定义 common.py骨干网络工厂 core/feature_extractor.py数据集构建脚本 datasets 与数据集描述 data_generator.py需要注意一个前提FAQ 覆盖的 train.py / eval.py 等脚本依赖tensorflow.contrib、tf.app.flags、tf.contrib.slim等 TF 1.x 接口阅读后续命令与配置时应以本项目源码实际内容为准并留意运行环境的 TensorFlow 版本前提。FAQ 的 9 个问题可划分为四类主题模型扩展Q1/Q3/Q4、数据接入Q2、训练调优Q5/Q8、分布式与复现Q6/Q7/Q9。下面按主题聚类展开而不是机械复述问题。2. 更换网络骨干ResNet、Xception、MobileNet 与 NAS 系列Q1除了自带的骨干如 Xception想用 ResNet 等网络怎么办结论官方 FAQ 给出的做法是直接修改 core/feature_extractor.py 以支持更多骨干。而在当前仓库实际版本中该文件已内置networks_map见 feature_extractor.py 第 232-248 行预置骨干包括模型系列可用变体MobileNetmobilenet_v2、mobilenet_edgetpu、mobilenet_v3_large_seg、mobilenet_v3_small_segResNetresnet_v1_18/18_beta、resnet_v1_50/50_beta、resnet_v1_101/101_betaXceptionxception_41、xception_65、xception_71NASnas_pnasnet、nas_hnasnet也就是说如果你想要的 ResNet 变体已在这个列表内并不需要修改源码只需在训练 / 评估命令中通过公共 flag--model_variantresnet_v1_50_beta指定即可该 flag 定义于 common.py。DeepLab 的feature_extractor主分发逻辑位于 feature_extractor.py 第 609-676 行它会按model_variant名称把请求路由到对应网络工厂并统一接收output_stride、multi_grid、depth_multiplier、is_training、fine_tune_batch_norm等高层参数同时每个系列使用独立的arg_scope如 ResNet 使用batch_norm_decay0.95、batch_norm_epsilon1e-5Xception 使用decay0.9997、epsilon1e-3。若确实需要全新骨干需要理解 get_network 的注册机制模型名必须是networks_map的键否则会抛出ValueError: Unsupported network对应校验逻辑在 feature_extractor.py 第 696-697 行。因此扩展新网络的标准流程是在networks_map中注册新的名字→网络函数并在arg_scopes_map中提供配套的arg_scope然后为新网络补齐对应的预处理函数映射最后在feature_extractor主分发函数中新增一个elif分支。参考 core/resnet_v1_beta.py、core/xception.py 即可看到既有网络的注册实现范式。不同骨干在更换时还需联动修改几个配套 flagFAQ 与源码注释给出的约定如下resnet_v1_{50,101}_beta官方 checkpoint 要求--multi_grid[1,2,4]见 common.py 中multi_grid的注释xception_65推荐--atrous_rates[6,12,18]output_stride16或[12,24,36]output_stride8mobilenet_v2系列不设置atrous_rates即decoder_output_strideNone--model_variant默认值是mobilenet_v2见 common.py。3. 在自定义数据集上训练Q2想在其它数据集上训练怎么办结论FAQ 建议修改build_{cityscapes,voc2012}_data.py与segmentation_dataset.py来构建自己的数据集。结合当前仓库源码这条路径可分为两个清晰步骤第一步把自有数据转成 TFRecord。数据集目录 datasets 提供了参考脚本build_voc2012_data.py把 PASCAL VOC 2012 组织成 TFRecord配套的自动化脚本是 download_and_convert_voc2012.shbuild_cityscapes_data.pyCityscapes 版本配套 convert_cityscapes.shbuild_data.py被上述脚本复用的公共转换函数解析图像与标注、生成 sharded TFRecord。你的数据集在转换时可以参考build_voc2012_data.py顶部注释约定的目录结构JPEGImages/SegmentationClass/ImageSets/Segmentation分层以及 TFRecord 中每个 Example 应包含的字段如image/encoded、语义标注等。第二步在数据集注册表中登记新数据集。FAQ 所提到的segmentation_dataset.py在当前仓库中已迁入 deprecated/segmentation_dataset.py标记为废弃当前活跃的数据集描述文件是 datasets/data_generator.py。它以DatasetDescriptornamedtuple 描述数据集三项属性见 data_generator.py 第 58-69 行splits_to_sizes各 splittrain / val / test的样本数num_classes语义类别数含背景PASCAL 为 21Cityscapes 为 19ADE20K 为 151ignore_label忽略标签值PASCAL 与 Cityscapes 均为 255ADE20K 为 0。仓库内置的三个数据集描述符data_generator.py 第 71-100 行可作为模板数据集主要 splitsnum_classesignore_labelcityscapestrain_fine: 2975、val_fine: 500、train_coarse: 22973 …19255pascal_voc_segtrain: 1464、train_aug: 10582、trainval: 2913、val: 144921255ade20ktrain: 20210、val: 20001510新数据集只需仿照这组描述符把它加入 data_generator.py 第 102-106 行的_DATASETS_INFORMATION字典再通过--datasetxxx、--dataset_dirxxx、--train_split/--eval_split指定即可复用 DeepLab 完整的数据预处理缩放、裁剪、随机翻转等管线。4. 训练增强集与 DenseCRF 两个“为什么”Q3PASCAL VOC 增强训练集augmented training set从哪里来官方 FAQ 指出PASCAL VOC 增强训练集由 Bharath Hariharan 等人提供论文Semantic Contours from Inverse DetectorsICCV 2011由其项目主页发布若在研究中使用了该数据集应引用该论文。这也是 data_generator.py 中train_aug: 10582这个分卷的由来——即官方 1464 张train加上 SBD 提供的增强标注后扩展到 10582 张。仓库 local_test.sh 与 local_test_mobilenetv2.sh 默认下载的初始化 checkpointdeeplabv3_pascal_train_aug系列正是在这一增强集上预训练的。Q4为什么实现里不包含 DenseCRFFAQ 的答复很坦诚作者并未尝试后处理 DenseCRF因此不包含在实现中感兴趣者可参考 Philipp Krähenbühl 与 Vladlen Koltun 的论文Efficient Inference in Fully Connected CRFs with Gaussian Edge PotentialsNIPS 2011。这说明 DeepLab 官方发布的精度数据并未叠加 DenseCRF 后处理用户若追求更高指标可以自行在 logits/概率图上外接 CRF但这不在仓库提供范围内。5. 自己训练时如何微调 BatchNormQ5 逐条展开Q5想自己训练并同时微调 BatchNorm 参数应该怎么做FAQ 首先给出了一条省资源捷径直接从官方已训好 BN 参数的 checkpoint 开始微调——使用较小学习率、设置fine_tune_batch_normfalse并因为学习率小而拉长训练步数。在此基础上FAQ 给出了四条自训建议逐条对应源码中的 flag调大输出步长设置--output_stride16甚至32同时必须按比例调整 ASPP 空洞率。例如output_stride32时 FAQ 建议--atrous_rates3,6,9作为对照output_stride16的 Xception 常用[6,12,18]。其原理是增大 output_stride 会降低骨干末端特征图的分辨率下采样倍数从而降低整体计算量。尽可能多用 GPU、加大 batch训练脚本的多卡clone机制由 train.py 的部署相关 flag 控制详见下文第 6 节。需要特别注意的是 train.py 中的 batch 整除校验assert FLAGS.train_batch_size % config.num_clones 0 clone_batch_size FLAGS.train_batch_size // config.num_clones即train_batch_size必须能被 GPU 数量整除真正的每卡批大小是整除结果。缩小训练裁剪尺寸把 train.py 的train_crop_size默认513,513调小例如 513×513 甚至 321×321以换取更大 batch。换用更轻量的骨干如 MobileNet-v2--model_variantmobilenet_v2。围绕 BN 微调源码还揭示了几个容易踩坑的配套约束一并列出batch 与 BN 的关系train.py 第 123-127 行 注释明确指出当fine_tune_batch_normTrue时batch size 至少要大于 12大于 16 更佳否则应设fine_tune_batch_normfalse以省显存learning rate 经验值train.py 第 93-96 行 注释给出在 PASCAL 增强训练集train_aug上全量训练用base_learning_rate0.007在trainval上微调用0.0001weight decay 经验值train.py 第 129-132 行 注释给出MobileNet-v2 / Xception 系列用0.00004ResNet 系列用0.0001fine_tune_batch_norm的默认值为 Truetrain.py 第 171 行而该 flag 会最终影响骨干网络中is_training的传递——见 feature_extractor.py 第 619/637/646/666 行只有is_training and fine_tune_batch_norm同时成立时 BN 层才处于训练态更新滑动均值。6. 多机异步训练与多 GPU 部署Q6如何异步训练FAQ 给出的做法是在 train.py 中设置num_replicas训练机器数与num_ps_tasks参数服务器数FAQ 建议num_ps_tasks ≈ num_replicas / 2详见slim.deployment.model_deploy。当前仓库中该模块位于 research/slim/deployment 目录下。对应到 train.py 的实际用法--num_clones每台机器上复制的模型份数即单机多卡数默认 1--clone_on_cpu是否把 clone 放在 CPU 上--num_replicas参与训练的 worker机器总数默认 1--num_ps_tasks参数服务器数量默认 0 表示参数由 worker 本地维护非 0 才进入 PS 异步架构--task当前进程的任务 ID--masterTensorFlow server 的 BNS 地址--startup_delay_steps各 replica 启动的错峰步数默认 15训练时会按task * startup_delay_steps计算延迟见 train.py 第 393 行。训练主函数通过model_deploy.DeploymentConfig(...)train.py 第 276-281 行统一管理输入、变量、优化器的设备摆放再由create_clonesoptimize_clones完成 clone 创建与梯度聚合。所谓“异步”即多个 worker / PS 并存时不再做全局同步的梯度等待。7. 复现官方精度从 local_test.sh 开始Q7用了官方 checkpoint 也复现不出论文精度FAQ 给出的排查法门是先跑通官方脚本再逐步改动、一次只改一处。仓库恰好提供了两个开箱即用的基线复现脚本local_test.shXception_65 骨干local_test_mobilenetv2.shMobileNet-v2 骨干。两个脚本的执行流程基本一致在research/deeplab目录下运行先执行python model_test.pyMobileNet 版为-v验证 PYTHONPATH 是否已包含research与research/slim脚本通过export PYTHONPATH$PYTHONPATH:\pwd:pwd/slim实现注意脚本会cd .. 到 research 目录调用 download_and_convert_voc2012.sh 下载并转换 PASCAL VOC 2012 数据下载官方初始化 checkpointXception 版为deeplabv3_pascal_train_aug_2018_01_04.tar.gzMobileNet 版为deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz以train_splittrainval、train_crop_size513,513、train_batch_size4、fine_tune_batch_normtrue训练 10 步仅冒烟验证在完整 val 集1449 张上评估可视化、导出 frozen graph。两个脚本的注释里写明了基于官方 checkpoint 应复现的参考指标作为基线核对锚点Xception_65 版预期mIOU ≈ 82.20%local_test.sh 注释MobileNet-v2 版预期mIOU ≈ 75.34%local_test_mobilenetv2.sh 注释。如果你连这些官方数值都对不上说明问题大概率出在环境、数据转换或 flag 组合而非模型本身此时按 FAQ 建议“一次只改一处”逐步对比即可定位差异。更多公开 checkpoint 的清单可参考 research/deeplab/g3doc/model_zoo.mdPASCAL 与 Cityscapes 的专项用法分别见 research/deeplab/g3doc/pascal.md 与 research/deeplab/g3doc/cityscapes.md。8. eval_crop_size 的计算规则Q8评估时eval_crop_size该设多大FAQ 给出的规则DeepLab 评估采用整图推理whole-image inference因此eval_crop_size output_stride × k 1其中 k 为整数取值应使结果尺寸略大于数据集中最大的图像边长。其原因是 DeepLab 的空洞卷积输出空间分辨率与输入满足输入尺寸 output_stride × 整数 1的关系只有满足这一约束才能让全分辨率无下采样丢信息的卷积对齐成立。FAQ 给出两个可直接套用的案例数据集图像尺寸output_stride 相关约定推荐 eval_crop_sizePASCAL VOC最大边 51216×321513513×513Cityscapes统一 1024×204816×6411025、16×128120491025×2049与代码对应eval_crop_size是 eval.py 中的DEFINE_listflag默认也是513,513它在构建评估数据集eval.py 第 98 行与模型ModelOptionseval.py 第 116 行时被解析成[height, width]并进一步用于给输入张量set_shapeeval.py 第 121-125 行保证静态图中整图推理与度量计算的一致性。同理训练侧的train_crop_size与评估侧可以不同例如训练用小图、评估用整图大尺寸这也是 train.py 中atrous_rates/output_stride注释 特别指出的“train 与 eval 可各自独立设置”。9. 多 GPU 训练变慢的排查Q9为什么多 GPU 训练反而很慢FAQ 给出的首要排查方向是数据输入管线preprocessing线程不足并建议把num_readers从默认值调大例如改为 4原文档链接指向 train.py 中num_readers 4的设置处。对照当前仓库源码在 train.py 构建训练数据集的位置data_generator.Dataset(...)的调用中num_readers4是硬编码值并非命令行 flag也就是说本仓库版本默认就已采用 4 个 reader。如果自训仍觉输入瓶颈可在此处与num_readers相邻的批处理参数batch size、shuffle、repeat、scale augmentation 范围等上做调优——需要说明的是从源码结构看num_readers这个量在当前版本并未暴露为 flag需修改源码实现改动前请务必先跑通第 7 节的基线脚本。作为对照评估侧 eval.py 构建数据集时使用的是num_readers2可结合eval_interval_secs默认 5 分钟见 eval.py 第 51-52 行判断评估循环是否拖累了整体节奏。更广义地说“多卡变慢”还应检查第 6 节提到的train_batch_size是否能被num_clones整除整除校验失败会直接报错以及每卡实际 batch 是否过小导致 BN 统计与计算吞吐同时劣化。10. FAQ 相关参考论文以下为官方 FAQ 在正文与参考文献中引用的文献此处以可检索的题录形式给出原始文档中附有论文/数据集官方页面链接Deep Residual Learning for Image Recognition—— Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian SunCVPR 2016ResNet 骨干出处。Semantic Contours from Inverse Detectors—— Bharath Hariharan, Pablo Arbelaez, Lubomir Bourdev, Subhransu Maji, Jitendra MalikICCV 2011PASCAL 增强训练集 SBD 出处。Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials—— Philipp Krähenbühl, Vladlen KoltunNIPS 2011DenseCRF 后处理出处。小结把 FAQ 与源码对照阅读后会发现绝大多数问题的答案都收敛到几条核心约束上——output_stride与输入尺寸的对齐Q8、ASPP 空洞率与骨干/步长的联动Q1/Q5、BN 训练态与 batch size 的联动Q5、部署粒度与 batch 整除性Q6/Q9。先跑通 local_test.sh 建立基线再按本节归纳的规则逐条修改 flag是使用本仓库 DeepLab 实现最稳妥的实践路径。【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考