是否存在可微计算将边缘图映射为边缘点2D坐标以用于深度学习模型?
可微边缘像素坐标提取的实现思路
以下是三种适配不同场景的纯张量运算实现方案,所有操作均支持梯度回传,可直接嵌入深度学习模型:
- 前置优化:替换硬边缘为软边缘概率图
先将原生不可微的Canny检测器替换为可微边缘检测算子(如Sobel算子加Sigmoid平滑阈值、轻量可学习边缘检测器HED的简化版),得到H×W尺寸、取值范围在[0,1]的边缘概率图,数值越高代表对应点是边缘的概率越大。如果必须保留Canny的输出结果,可对二值边缘图做高斯平滑得到软概率图,避免硬二值化带来的梯度截断。 - 方案1:Top-K固定采样(适配需要显式坐标列表的场景)
这个方案适合后续处理可接受固定数量边缘点的任务,实现最简单:- 预先生成和边缘图同尺寸的两个坐标常量张量:
x_grid每个位置的取值为对应像素的列索引,y_grid每个位置的取值为对应像素的行索引,张量和模型在相同设备上即可,不需要参与梯度更新 - 将边缘概率图、x_grid、y_grid全部展平为一维张量
- 调用框架自带的可微Top-K算子,取边缘概率向量中数值最大的K个元素的索引,K值可设置为略大于你任务中最大可能的边缘点数量,保证覆盖所有有效边缘
- 用得到的索引从展平的x_grid、y_grid中取出对应坐标,即可得到K个边缘点的坐标集合。如果需要降低非边缘点的干扰,可给每个坐标乘以对应位置的边缘概率值作为权重,后续计算中低概率点的贡献会自动趋近于0
- 预先生成和边缘图同尺寸的两个坐标常量张量:
- 方案2:全局分布编码(适配不需要显式坐标列表的场景)
如果你的后续处理函数不需要输入离散的坐标集合,只需要边缘的空间分布特征,可直接用加权统计的方式编码:
直接用边缘概率图对坐标网格做加权求和,得到边缘的统计特征:mean_x = sum(E * x_grid) / sum(E)mean_y = sum(E * y_grid) / sum(E)
还可以进一步计算二阶/三阶矩得到边缘的方差、偏度等分布信息,整个过程没有任何离散操作,完全可微,计算量极低。 - 方案3:可微有序轮廓提取(适配需要和findContours一样输出有序轮廓的场景)
如果你的任务要求输出和传统轮廓检测一致的有序坐标序列,可先对软边缘概率图做可微距离变换,得到每个像素到最近边缘的距离图,再用可微动态规划/可微图遍历算子提取有序轮廓路径,这个方案实现复杂度相对较高,仅推荐对轮廓顺序有强要求的场景使用。 - 补充:硬二值化的梯度修复
如果你必须使用硬二值的边缘输入,可给二值化操作添加直通估计器(STE),反向传播时直接跳过二值化的梯度截断,保证梯度可以正常回传到前序层。
内容的提问来源于stack exchange,提问作者AllyCasa
相关产品推荐
相关产品推荐

