首页 游戏 软件 资讯 排行榜 专题
首页
AI
【第六期论文复现赛-语义分割】DDRNet

【第六期论文复现赛-语义分割】DDRNet

热心网友
64
转载
2025-07-24
本文介绍DDRNet语义分割模型,其属双路径结构,含高低分辨率两个分支,分别保存细节与提取上下文信息,通过Bilateral fusion模块融合特征,引入DAPPM模块和辅助损失。复现的DDRNet - 23在Cityscapes验证集mIoU达79.85%,优于目标值,已被paddleseg收录。

【第六期论文复现赛-语义分割】ddrnet - 游乐网

【第六期论文复现赛-语义分割】Deep Dual-resolution Networks for Real-time and Accurate Semantic Segmentation of Road Scenes

paper:Deep Dual-resolution Networks for Real-time and Accurate Semantic Segmentation of Road Scenes
github:https://github.com/ydhongHIT/DDRNet
复现地址:https://github.com/justld/DDRNet_paddle

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

轻量级语义分割模型大致分为2类:Encoder-Decoder结构(如ESPNet)和two-pathway(如BiSeNet)。类似two-pathway结构,DDRNet使用Dual-resolution,并引入DAPPM( Deep Aggregation Pyramid Pooling Module)模块。在Cityscapes测试集、GPU 2080Ti,DDRNet-23-slim达到102FPS,miou77.4%。本项目复现了DDRNet_23,在cityscapes val miou 为79.85%,该算法已被paddleseg收录。

模型预测效果(来自cityscapes val):【第六期论文复现赛-语义分割】DDRNet - 游乐网        

一、几种语义分割模型结构

下图为语义分割模型的几种结构:

(a)空洞卷积:通过空洞卷积增加模型的感受野,保留高分辨率的特征图降低信息损失;(Deeplab系列)

(b)Encoder-Decoder:通过Encoder(backbone)提取不同分辨率的特征图,然后将不同分辨率的特征图上采样融合,可以通过更换backbone来控制模型的大小;(UNet、ESPNet)

(c)Two-pathway:模型包含2个path,一个path负责提取上下文语义信息,一个path保留细节信息,然后将2个path输出融合。(BiSeNetV1、V2)

(d)DDRNet结构,具体见下文。【第六期论文复现赛-语义分割】DDRNet - 游乐网        

二、网络结构

DDRNet网络结构如下图所示,模型包含2个分支,上面的分支分辨率较高,保存细节信息,下面的分支分辨率较低,用来提取上下文信息(使用了DAPPM模块增加其感受野),分支间特征融合使用Bilateral fusion模块,另外引入辅助损失函数。【第六期论文复现赛-语义分割】DDRNet - 游乐网        

三、Bilateral fusion

DDRNet为了结合不同分辨率的特征图,使用了Bilateral fusion模块,不同分支不同分辨率的特征图分别通过上采样下采样后相加,保持自身分辨率不变的同时融合了另一分支的信息。【第六期论文复现赛-语义分割】DDRNet - 游乐网        

四、 Deep Aggregation Pyramid Pooling Module(DAPPM)

DAPPM为了获得多尺度信息,对输入特征图进行池化(核大小和步长不同),然后将不同大小的特征图上采样融合。

PS:池化部分类似PSPNet提出的Pyramid Pooling Module,整体结构类似ESPNetV2提出的EESP模块,具体可参考相关论文。 【第六期论文复现赛-语义分割】DDRNet - 游乐网        

pytorch源码:

class DAPPM(nn.Module):    def __init__(self, inplanes, branch_planes, outplanes):        super(DAPPM, self).__init__()        self.scale1 = nn.Sequential(nn.AvgPool2d(kernel_size=5, stride=2, padding=2),                                    BatchNorm2d(inplanes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(inplanes, branch_planes, kernel_size=1, bias=False),                                    )        self.scale2 = nn.Sequential(nn.AvgPool2d(kernel_size=9, stride=4, padding=4),                                    BatchNorm2d(inplanes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(inplanes, branch_planes, kernel_size=1, bias=False),                                    )        self.scale3 = nn.Sequential(nn.AvgPool2d(kernel_size=17, stride=8, padding=8),                                    BatchNorm2d(inplanes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(inplanes, branch_planes, kernel_size=1, bias=False),                                    )        self.scale4 = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)),                                    BatchNorm2d(inplanes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(inplanes, branch_planes, kernel_size=1, bias=False),                                    )        self.scale0 = nn.Sequential(                                    BatchNorm2d(inplanes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(inplanes, branch_planes, kernel_size=1, bias=False),                                    )        self.process1 = nn.Sequential(                                    BatchNorm2d(branch_planes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(branch_planes, branch_planes, kernel_size=3, padding=1, bias=False),                                    )        self.process2 = nn.Sequential(                                    BatchNorm2d(branch_planes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(branch_planes, branch_planes, kernel_size=3, padding=1, bias=False),                                    )        self.process3 = nn.Sequential(                                    BatchNorm2d(branch_planes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(branch_planes, branch_planes, kernel_size=3, padding=1, bias=False),                                    )        self.process4 = nn.Sequential(                                    BatchNorm2d(branch_planes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(branch_planes, branch_planes, kernel_size=3, padding=1, bias=False),                                    )                self.compression = nn.Sequential(                                    BatchNorm2d(branch_planes * 5, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(branch_planes * 5, outplanes, kernel_size=1, bias=False),                                    )        self.shortcut = nn.Sequential(                                    BatchNorm2d(inplanes, momentum=bn_mom),                                    nn.ReLU(inplace=True),                                    nn.Conv2d(inplanes, outplanes, kernel_size=1, bias=False),                                    )    def forward(self, x):        #x = self.downsample(x)        width = x.shape[-1]        height = x.shape[-2]                x_list = []        x_list.append(self.scale0(x))        x_list.append(self.process1((F.interpolate(self.scale1(x),                        size=[height, width],                        mode='bilinear')+x_list[0])))        x_list.append((self.process2((F.interpolate(self.scale2(x),                        size=[height, width],                        mode='bilinear')+x_list[1]))))        x_list.append(self.process3((F.interpolate(self.scale3(x),                        size=[height, width],                        mode='bilinear')+x_list[2])))        x_list.append(self.process4((F.interpolate(self.scale4(x),                        size=[height, width],                        mode='bilinear')+x_list[3])))               out = self.compression(torch.cat(x_list, 1)) + self.shortcut(x)        return out
登录后复制

   

五、实验结果

cityscapes在cityscapes验证集和测试集上的表现如下: 【第六期论文复现赛-语义分割】DDRNet - 游乐网        

六、复现结果

本次复现的目标是DDRNet-23 在cityscapes验证集 mIOU= 79.5%,复现的miou为79.85%。详情见下表:

七、快速体验

运行以下cell,快速体验DDRNet-23。

In [ ]
# step 1: unzip data%cd ~/PaddleSeg/!mkdir data!tar -xf ~/data/data64550/cityscapes.tar -C data/%cd ~/
登录后复制    In [ ]
# step 2: 训练%cd ~/PaddleSeg!python train.py --config configs/ddrnet/ddrnet23_cityscapes_1024x1024_120k.yml \    --do_eval --use_vdl --log_iter 100 --save_interval 4000 --save_dir output
登录后复制    In [ ]
# step 3: val%cd ~/PaddleSeg/!python val.py \       --config configs/ddrnet/ddrnet23_cityscapes_1024x1024_120k.yml \       --model_path output/best_model/model.pdparams
登录后复制    In [ ]
# step 4: val flip%cd ~/PaddleSeg/!python val.py \       --config configs/ddrnet/ddrnet23_cityscapes_1024x1024_120k.yml \       --model_path output/best_model/model.pdparams \       --aug_eval \       --flip_horizontal
登录后复制    In [ ]
# step 5: val ms flip %cd ~/PaddleSeg/!python val.py \       --config configs/ddrnet/ddrnet23_cityscapes_1024x1024_120k.yml \       --model_path output/best_model/model.pdparams \       --aug_eval \       --scales 0.75 1.0 1.25 \       --flip_horizontal
登录后复制    In [ ]
# step 6: 预测, 预测结果在~/PaddleSeg/output/result文件夹内%cd ~/PaddleSeg/!python predict.py \       --config configs/ddrnet/ddrnet23_cityscapes_1024x1024_120k.yml \       --model_path output/best_model/model.pdparams \       --image_path data/cityscapes/leftImg8bit/val/frankfurt/frankfurt_000000_000294_leftImg8bit.webp \       --save_dir output/result
登录后复制    In [ ]
# step 7: export%cd ~/PaddleSeg!python export.py \       --config configs/ddrnet/ddrnet23_cityscapes_1024x1024_120k.yml \       --model_path output/best_model/model.pdparams \       --save_dir output
登录后复制    In [ ]
# test tipc 1: prepare data%cd ~/PaddleSeg/!bash test_tipc/prepare.sh ./test_tipc/configs/ddrnet/train_infer_python.txt 'lite_train_lite_infer'
登录后复制    In [ ]
# test tipc 2: pip install%cd ~/PaddleSeg/test_tipc/!pip install -r requirements.txt
登录后复制    In [ ]
# test tipc 3: 安装auto_log%cd ~/!git clone https://github.com/LDOUBLEV/AutoLog           %cd AutoLog/!pip3 install -r requirements.txt!python3 setup.py bdist_wheel!pip3 install ./dist/auto_log-1.2.0-py3-none-any.whl
登录后复制    In [ ]
# test tipc 4: test train inference%cd ~/PaddleSeg/!bash test_tipc/test_train_inference_python.sh ./test_tipc/configs/ddrnet/train_infer_python.txt 'lite_train_lite_infer'
登录后复制    
来源:https://www.php.cn/faq/1425671.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Pywinrm,一个 Python 管理利器!
科技数码
Pywinrm,一个 Python 管理利器!

Pywinrm 通过Windows远程管理(WinRM)协议,让Python能够像操作本地一样执行远程Windows命令,真正打通了跨平台管理的最后一公里。 在混合IT环境中,Linux机器管理Wi

热心网友
04.07
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?
科技数码
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?

早些时候,聊过 Python 领域那场惊心动魄的供应链攻击。当时我就感叹,虽然我们 JavaScript 开发者对这类套路烂熟于心,但亲眼目睹这种规模的“投毒”还是头一次。 早些时候,聊过 Pyth

热心网友
04.07
Toga,一个超精简的 Python 项目!
科技数码
Toga,一个超精简的 Python 项目!

Toga 是 BeeWare 家族的核心成员,号称“写一次,跑遍所有平台”,而且用的是系统原生控件,不是那种一看就是网页套壳的界面 。 写了这么多年 Python,你是不是也想过:要是能一套代码跑

热心网友
04.07
Python 异常处理:别再用裸奔的 try 了
科技数码
Python 异常处理:别再用裸奔的 try 了

异常处理的核心:让错误在正确的地方被有效处理。正确的地方,就是别在底层就把异常吞了,也别在顶层还抛裸奔的 Exception。 异常处理写得好,半夜不用起来改 bug。1 你是不是也这么干过?tr

热心网友
04.07
OpenClaw如何自定义SKILL
AI
OpenClaw如何自定义SKILL

1 Skills机制概述 提起OpenClaw的Skills机制,不少人可能会把它想象成传统意义上的可执行插件。其实,它的内涵要更精妙一些。 简单说,Skills本质上是一套基于提示驱动的能力扩展机制。它并不是一个可以独立“跑”起来的程序模块,而是通过一份结构化描述文件(核心就是那个SKILL m

热心网友
04.07

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查
web3.0
美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查

加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这

热心网友
04.08
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币
web3.0
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币

微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿

热心网友
04.08
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch
web3.0
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch

稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D

热心网友
04.08
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线
web3.0
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线

基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一

热心网友
04.08
PAAL代币如何参与治理?社区投票能决定哪些事项?
web3.0
PAAL代币如何参与治理?社区投票能决定哪些事项?

PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票

热心网友
04.08