【论文阅读笔记】[Semantic Segmentation] FC-DenseNet阅读笔记

本文是关于FC-DenseNet在语义图像分割领域的研究笔记,探讨了FC-DenseNet如何结合DenseNet的优点,通过密集块和上采样操作在不需要预训练和后处理的情况下取得State-of-the-Art结果。FC-DenseNet结构深但参数少,有效地解决了特征映射爆炸问题。训练策略包括像素级交叉熵损失、初始化、RMSprop优化器和数据增强。实验证明,FC-DenseNet在CamVid和Gatech数据集上表现优秀。

jingwenlai 2018-8-15

# 简介 & 主要贡献

Tiramisu - FC-DenseNet (https://arxiv.org/abs/1611.09326),

经典的semantic image segmentation的方法基于CNN,主要包含3个组件:

(a) 一个downsampling path,主要用来提取特征

(b) 一个upsampling path,被训练用来在输出结果中逐步恢复输入精度

(c) 可选地,一个后处理模块(如Conditional Radom Fields)来优化模型输出。

经典的U-Net即是这种结构。

DenseNet在图像分类中获得了非常优异的结果,其结构更精准且更易于训练。

FC-DenseNet在无预训练及后处理的情况下,在CamVid, Catech数据集上获得了state-of-the-art的结果。并且,该结构含更少的参数,且易于训练。

Code& Experiments: https://github.com/SimJeg/FC-DenseNet/blob/master/train.py

A GOOD alternative implementation(pyTorch) & Explanation: https://github.com/bfortuner/pytorch_tiramisu

 

# 实现思路及方法

要运行 `awesome-semantic-segmentation-pytorch` 项目(通常是一个基于 PyTorch 的语义分割工具库),你需要正确配置环境并按照项目的结构和说明进行操作。该项目由 Zhang Ge 维护,GitHub 地址通常是:https://github.com/username/awesome-semantic-segmentation-pytorch (注意:你提到的 `awesome-semantic-segmentation-pytorch-master` 是下载后本地文件夹名)。 下面是如何运行该项目的详细步骤: --- ### ✅ 步骤 1:克隆或下载项目 如果你还没有代码,先从 GitHub 克隆: ```bash git clone https://github.com/chenyuntc/awesome-semantic-segmentation-pytorch.git cd awesome-semantic-segmentation-pytorch ``` 或者你已经下载了 ZIP 包并解压为 `awesome-semantic-segmentation-pytorch-master`,进入该目录即可。 --- ### ✅ 步骤 2:创建虚拟环境(推荐) 使用 `conda` 或 `venv` 创建独立环境: ```bash # 使用 conda conda create -n semseg python=3.8 conda activate semseg # 安装 PyTorch(根据你的 CUDA 版本选择) # 例如:CUDA 11.8 conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia # 或 CPU 版本 # conda install pytorch torchvision torchaudio cpuonly -c pytorch ``` --- ### ✅ 步骤 3:安装依赖 项目通常包含 `requirements.txt`,如果没有可以参考常见依赖手动安装: ```bash pip install opencv-python numpy matplotlib tensorboard tqdm scikit-image ``` 有些版本还依赖 `py-spy` 或 `tensorboardX`,请查看项目根目录是否有 `requirements.txt`: ```bash pip install -r requirements.txt ``` --- ### ✅ 步骤 4:准备数据集 常见的语义分割数据集如: - Pascal VOC - Cityscapes - COCO - ADE20K 以 **Pascal VOC** 为例: ```bash # 在项目目录下创建 data 文件夹 mkdir data cd data # 下载 Pascal VOC 数据集(脚本可能已提供) wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar tar -xvf VOCtrainval_11-May-2012.tar ``` 确保数据结构类似: ``` data/ └── VOCdevkit/ └── VOC2012/ ├── JPEGImages/ # 图像 ├── SegmentationClass/ # 标注 └── ImageSets/Segmentation/train.txt ``` --- ### ✅ 步骤 5:运行训练或测试脚本 项目中通常有如下目录结构: ``` experiments/ ├── segmentation/ ├── voc/ └── fcn_resnet50.yaml scripts/ train.py test.py models/ datasets/ ``` #### 训练一个模型(如 FCN + ResNet50 on VOC) ```bash python scripts/train.py --model fcn --backbone resnet50 --dataset voc --lr 1e-3 --epochs 50 --batch-size 8 ``` #### 测试模型 ```bash python scripts/test.py --model fcn --backbone resnet50 --dataset voc --resume runs/voc/fcn_resnet50/checkpoint.pth.tar ``` #### 可视化预测结果 ```bash python scripts/demo.py --model fcn --backbone resnet50 --dataset voc --image-path demo/example.jpg ``` --- ### ✅ 常见问题解决 | 问题 | 解决方案 | |------|---------| | ModuleNotFoundError: No module named 'models' | 添加当前路径到 PYTHONPATH:<br>`export PYTHONPATH=.:$PYTHONPATH` | | DataLoader worker exited unexpectedly | 设置 `--num-workers 0` 关闭多进程加载 | | CUDA out of memory | 减小 `--batch-size`,或使用更小模型 | --- ### ✅ 示例代码:训练脚本调用(train.py 简化版逻辑) ```python import torch from torch import nn from torch.utils.data import DataLoader from datasets.voc import VOCSegmentation from models.fcn import FCNResNet import time # 参数设置 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") epochs = 50 lr = 1e-3 batch_size = 8 # 数据集 train_dataset = VOCSegmentation(root='data/VOCdevkit', split='train') train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=4) # 模型 model = FCNResNet(nclass=21).to(device) criterion = nn.CrossEntropyLoss(ignore_index=255) optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9, weight_decay=1e-4) # 训练循环 for epoch in range(epochs): model.train() running_loss = 0.0 for i, (images, targets) in enumerate(train_loader): images = images.to(device) targets = targets.to(device) outputs = model(images) loss = criterion(outputs, targets) optimizer.zero_grad() loss.backward() optimizer.step() running_loss += loss.item() if i % 10 == 0: print(f"Epoch [{epoch+1}/{epochs}], Step [{i}/{len(train_loader)}], Loss: {loss.item():.4f}") print(f"Epoch [{epoch+1}] Average Loss: {running_loss / len(train_loader):.4f}") torch.save(model.state_dict(), f"checkpoints/fcn_resnet50_voc_{epoch+1}.pth") ``` > 注意:实际项目中使用的是封装好的 `Trainer` 类和 YAML 配置文件驱动训练。 --- ### ✅ 小贴士 - 查看 `experiments/` 目录下的 `.yaml` 文件了解超参数。 - 训练日志和权重保存在 `runs/` 目录。 - 使用 `tensorboard` 查看训练过程: ```bash tensorboard --logdir runs ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值