使用 PaddlePaddle 2.x 复现 DeepLabV3+(1):从构建到训练
模型构建:面向对象实现
我们按照 paddle.nn.Layer 接口规范,将 DeepLabV3+ 构建为模块化类:
SeparableConv2D:深度可分离卷积(depthwise + pointwise)XceptionBlock:堆叠的可分离卷积单元,支持可选的残差连接ASPP:多尺度特征融合结构,使用 6、12、18 的膨胀卷积率Decoder:融合浅层和深层特征,增强边界感知能力
最终模型采用编码器-解码器结构,输出与输入分辨率相同的分割图。
模型结构:
class DeepLabV3Plus(nn.Layer):
def __init__(self, num_classes):
super().__init__()
self.entry = ...
self.block1 = XceptionBlock(...)
...
self.aspp = ASPP(...)
self.decoder = ...
self.final = ...
def forward(self, x):
... # 完整结构见文末源码
训练流程
训练循环使用 paddle.io.DataLoader 和标准 nn.Layer 接口:
- 动态创建模型实例和优化器
- 支持
ignore_index的自定义交叉熵损失函数 - 自动保存模型参数(
.pdparams)
训练实现:
model = DeepLabV3Plus(num_classes=21)
optimizer = paddle.optimizer.Adam(...)
criterion = CrossEntropyLossWithMask(ignore_index=255)
for epoch in range(num_epochs):
for imgs, labels in dataloader:
preds = model(imgs)
loss = criterion(preds, labels)
loss.backward()
optimizer.step()
optimizer.clear_grad()
当前在 DummySegDataset 上进行开发训练。可根据需要替换为 PASCAL VOC、ADE20K 等真实数据集。
验证、评估指标和部署流程见后续文章。