尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TuSimple-DUC多尺度推理揭秘:Predictor如何恢复低分辨率预测到2048x1024标签图

TuSimple-DUC多尺度推理揭秘:Predictor如何恢复低分辨率预测到2048x1024标签图 TuSimple-DUC多尺度推理揭秘Predictor如何恢复低分辨率预测到2048x1024标签图【免费下载链接】TuSimple-DUCUnderstanding Convolution for Semantic Segmentation项目地址: https://gitcode.com/gh_mirrors/tu/TuSimple-DUCTuSimple-DUC 是 TuSimple 团队提出的语义分割模型DUCDense Upsampling Convolution在 Cityscapes 上曾取得 SOTA 的 79.1% mIoU。它的推理流程有个独特之处模型只在1/8 分辨率上输出预测再由 Predictor 模块将低分辨率结果恢复成与原图对齐的2048×1024 标签图。本文带你完整拆解这套「低分辨率预测 → 高分辨率标签图」的多尺度推理机制。一、为什么语义分割要用低分辨率输出理解恢复过程前先要知道 DUC 网络在做什么。TuSimple-DUC 的主干是混合膨胀卷积 ResNetHybrid Dilated Convolution见 resnet.py配合 ASPP 多尺度空洞卷积头见 network_duc_hdc.py。整个骨干网络的步幅固定为 8 倍ds_rate8也就是说输入2048×1024 的图像输出特征图仅 256×128但每个像素位置输出了「一个 2×2 小格子的逐格类别概率」这样做的好处是大幅降低计算量——分割头的计算在 1/8 分辨率上进行。代价是输出尺寸不够大需要后处理恢复。 关键配置都在 configs/test/test_full_image.cfgds_rate8、cell_width2、result_shape1024,2048、test_scales1。二、核心参数ds_rate 与 cell_width参数默认值含义ds_rate8网络下采样倍率决定特征图缩小多少cell_width2每个特征像素「负责」的原图像素块边长2×2rpn_width4由ds_rate / cell_width推出每个特征格展开成 4×4 个位置的概率通道result_shape1024, 2048最终标签图尺寸高宽这两个参数直接决定了恢复时的形状变换公式是读懂 Predictor 的钥匙。三、多尺度推理全流程从原图到标签图推理入口在 test/predict_full_image.py它调用 Tester 的predict_single内部流程分四步第 1 步预处理每个尺度各生成一张输入Tester.preprocess 按test_scales把原图缩放、裁剪到test_shape × scale再用 RGB 均值填充补齐最后减去均值、转成 CHW 张量。第 2 步前向推理每个尺度绑定一个独立 Module输出低分辨率的 DUC 概率图softmax 结果。第 3 步形状恢复Predictor 的核心见下一节详解。第 4 步多尺度平均 argmax多个尺度的概率图取均值再逐像素argmax得到最终标签最后可转换回 Cityscapes 原始 ID 并做彩色化可视化。四、揭秘4 行代码完成 256×128 到 1024×2048 的恢复Predictor.predict 中最精彩的形状变换就发生在这一小段里。以 Cityscapes 2048×1024 输入为例逐行拆解# 网络输出: (19, 4, 4, 256, 128) # 19 个类别 × 4×4 个子格概率 × 256×128 特征图 labels labels.reshape((label_num, ds_rate/cell_width, ds_rate/cell_width, feat_height, feat_width)) # → (19, 4, 4, 256, 128) labels np.transpose(labels, (0, 3, 1, 4, 2)) # → (19, 256, 4, 128, 4) labels labels.reshape((label_num, test_height/2, test_width/2)) # → (19, 512, 1024)这三行干了一件「重排格子」的事把每个特征像素自带的 2×2 子格概率重新拼回到特征图空间位置形成 512×1024 的中间分辨率概率图。接着裁剪掉填充区、双线性插值放大labels labels[:, :512, :1024] # 裁掉 padding 补出来的区域 labels np.transpose(labels, [1, 2, 0]) # 转为 HWC 便于 OpenCV 处理 labels cv.resize(labels, (2048, 1024), interpolationcv.INTER_LINEAR) # 放大到 2048×1024 labels np.transpose(labels, [2, 0, 1]) # 恢复 CHW整个过程可以概括成一条流水线 特征图 256×128 → 子格重排 512×1024 → ✂️ 裁剪去 padding → 双线性插值 1024×2048为什么用插值放大 2 倍而不是在网络里上采样因为 DUC 的输出本身就带概率语义对连续概率图做INTER_LINEAR插值非常平滑边界损失小还省掉了网络端的解码器参数。五、多尺度测试ms免费的 1 个点 mIoU把test_scales配置成多个值如0.75, 1.0, 1.25Tester 会为每个尺度分别做上述恢复然后在 predictor.py 末尾做概率平均labels np.array(label_list).sum(axis0) / len(label_list) 不同尺度下模型「看到」的细节粒度不同平均后能抑制单尺度的抖动预测。README 中给出的成绩单尺度 79.1% → 多尺度80.1%mIoU提升完全来自这套推理策略不增加任何训练成本。六、上手运行多尺度推理配置好 test_full_image.cfg 中的model_dir、image_list路径后直接运行cd test python predict_full_image.py ../configs/test/test_full_image.cfg结果会写入result_dirvisualization/原图、彩色分割图、混合图、热图四宫格score/用于提交评测的原始标签 PNG想尝试多尺度只需把配置里的test_scales1改成test_scales0.75,1.0,1.25即可。七、小结这套机制值得借鉴吗设计点启发低分辨率推理 后处理恢复分割头计算量降低数倍适合大图场景每个特征格输出子格概率用极少参数换取细粒度边界概率图平均的多尺度策略无需重训即可涨点推理端即可实施TuSimple-DUC 的 Predictor 用最朴素的重排 插值完成了「低分辨率预测 → 2048×1024 标签图」的恢复是理解语义分割推理流程尤其是 DUC 这类格子化输出网络的绝佳范本。核心源码 tusimple_duc/test/predictor.py 不足 50 行强烈建议逐行读一遍。【免费下载链接】TuSimple-DUCUnderstanding Convolution for Semantic Segmentation项目地址: https://gitcode.com/gh_mirrors/tu/TuSimple-DUC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表