如何构建独特图形轮廓权重图优化U-Net卫星影像建筑提取轮廓精度
U-Net建筑物提取边界衰减权重图实现方案
你需要的边界加权逻辑本质是基于距离变换的权重映射,以下是可直接落地的完整实现流程:
1. 生成边界掩码
首先从标注的建筑物二值掩码(建筑物区域为1、背景为0)中提取轮廓边界,用基础形态学运算即可实现:
import cv2 import numpy as np from scipy.ndimage import distance_transform_edt def get_boundary_mask(label_mask, kernel_size=3): # label_mask为单通道uint8格式的二值标注,取值0/1 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_size, kernel_size)) # 膨胀结果减腐蚀结果得到边界区域 dilated = cv2.dilate(label_mask, kernel, iterations=1) eroded = cv2.erode(label_mask, kernel, iterations=1) boundary = dilated - eroded return boundary.astype(np.bool_)
2. 生成距离衰减权重图
基于边界掩码计算全局像素到最近边界的欧式距离,按规则映射为权重值,边界处取最高值、向两侧线性/非线性衰减:
def generate_boundary_weight_map(label_mask, max_weight=10, decay_width=5): # max_weight:边界处的最高权重值;decay_width:权重从最大值衰减到1的像素距离 h, w = label_mask.shape boundary = get_boundary_mask(label_mask) # 计算所有像素到最近边界的距离 dist_to_boundary = distance_transform_edt(~boundary) # 生成权重:衰减范围内的像素按距离计算权重,其余区域权重为1 weight_map = np.ones((h, w), dtype=np.float32) decay_region = dist_to_boundary <= decay_width # 线性衰减逻辑,可替换为指数衰减适配不同需求 weight_map[decay_region] = max_weight - (max_weight - 1) * (dist_to_boundary[decay_region] / decay_width) return weight_map
可根据你的卫星影像分辨率调整decay_width参数,高分影像可设为5-10,低分影像可设为2-3。
3. 嵌入U-Net训练流程
将生成的权重图与交叉熵损失结合,边界位置的预测错误会产生更高的损失,迫使模型学习更精准的轮廓:
import torch import torch.nn as nn class WeightedCELoss(nn.Module): def __init__(self): super().__init__() self.base_ce = nn.CrossEntropyLoss(reduction='none') # 保留单像素损失值 def forward(self, pred, target, weight_map): ce_loss = self.base_ce(pred, target) weighted_loss = ce_loss * weight_map return weighted_loss.mean()
调优提示
- 如果优化后边界仍然模糊,可适当提高
max_weight到12-15 - 如果建筑物内部出现漏判,可适当缩小
decay_width或降低max_weight,避免边界权重过高挤压内部分类的优化优先级
内容的提问来源于stack exchange,提问作者Marlon Teixeira
相关产品推荐
相关产品推荐

