基于PyTorch框架的MobilenetV1-UNet网络实现图像分割语义分割全套项目,包含...
图像分割语义分割mobilenetv1-unet网络基于pytorch框架制作全套项目,包含网络模型,训练代码,预测代码,直接下载数据集就能跑,拿上就能用,简单又省事儿内附四五个数据,供验证使用直接上干货!这次带来的MobileNetV1-UNet语义分割项目,绝对是懒人福音。整套代码从模型到训练预测全打通,解压数据集就能跑。先看效果:在街景分割任务中,用1050Ti显卡训练两小时就能区分人行道、
图像分割语义分割mobilenetv1-unet网络 基于pytorch框架制作 全套项目,包含网络模型,训练代码,预测代码,直接下载数据集就能跑,拿上就能用,简单又省事儿 内附四五个数据,供验证使用
直接上干货!这次带来的MobileNetV1-UNet语义分割项目,绝对是懒人福音。整套代码从模型到训练预测全打通,解压数据集就能跑。先看效果:在街景分割任务中,用1050Ti显卡训练两小时就能区分人行道、车辆、建筑,预测单张图只要0.3秒。

核心代码都在model.py里。编码器用MobileNetV1的深度可分离卷积,参数只有原版UNet的1/3:
class DepthwiseSeparable(nn.Module):
def __init__(self, in_ch, out_ch):
super().__init__()
self.depth_conv = nn.Conv2d(in_ch, in_ch, kernel_size=3,
padding=1, groups=in_ch)
self.point_conv = nn.Conv2d(in_ch, out_ch, kernel_size=1)
def forward(self, x):
return self.point_conv(self.depth_conv(x))
这个深度可分离卷积块是MobileNet的精髓——先做通道内卷积,再用1x1卷积混合通道。实测参数量比标准卷积少8-9倍,且精度损失不大。
解码器部分保持UNet的跳跃连接结构,但上采样用了最近邻插值+卷积的方案:
class DecodeBlock(nn.Module):
def __init__(self, in_ch, skip_ch, out_ch):
super().__init__()
self.up = nn.Upsample(scale_factor=2, mode='nearest')
self.conv = nn.Sequential(
nn.Conv2d(in_ch+skip_ch, out_ch, 3, padding=1),
nn.BatchNorm2d(out_ch),
nn.ReLU(inplace=True)
)
def forward(self, x, skip):
x = self.up(x)
return self.conv(torch.cat([x, skip], 1))
这里有个坑要注意:MobileNet的下采样次数和原版UNet不同,跳跃连接的通道数需要手动对齐。我的解决方案是在编码器每层输出后添加过渡卷积,匹配解码器所需的通道数。

训练脚本train.py支持多卡并行和自动混合精度。关键训练循环长这样:
scaler = GradScaler()
for epoch in range(100):
model.train()
for inputs, masks in train_loader:
with autocast():
outputs = model(inputs.cuda())
loss = criterion(outputs, masks.cuda())
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
optimizer.zero_grad()
实测混合精度训练能让显存占用减少40%,batch_size可以翻倍。损失函数用带类别权重的交叉熵,应对数据不均衡问题:
class_weights = torch.tensor([0.5, 1.2, 1.0, 2.0, 0.8]) # 根据训练集统计调整
criterion = nn.CrossEntropyLoss(weight=class_weights.cuda())
预测脚本predict.py支持单张图或整个文件夹的推理。输出可视化直接生成伪彩色图:
def colorize_mask(pred):
palette = [
[128, 64, 128], # 道路
[244, 35, 232], # 人行道
[70, 70, 70], # 建筑
[102, 102, 156], # 车辆
[107, 142, 35] # 植被
]
colored = np.zeros((pred.shape[0], pred.shape[1], 3))
for cls_id, color in enumerate(palette):
colored[pred == cls_id] = color
return colored.astype(np.uint8)
数据集已经做好标准化处理,解压后结构如下:
dataset/
├── train_images/
├── train_masks/
├── val_images/
└── val_masks/
跑起来只需要两行命令:
python train.py --batch_size 16 --lr 0.001
python predict.py --input test_img.jpg --model best.pth
项目里自带5张验证图片,用--vis参数可以看到网络预测的中间特征图。实测在256x256分辨率下,GTX1060显卡的推理速度能达到45FPS,做实时分割完全够用。
更多推荐
所有评论(0)