和传统边缘检测(Canny/edges_sub_pix)完全不同:DL 边缘提取本质是二分类语义分割,输出图像中每个像素是否为"边缘像素",而非梯度强度值。

预训练模型:pretrained_dl_edge_extractor.hdl

工作原理

输入图像 → gen_dl_samples_from_images → preprocess_dl_samples 
  → apply_dl_model → 提取分割结果 + 置信度 → 后处理 → 边缘region
关键算子流程

* 1. 读取预训练模型
read_dl_model ('pretrained_dl_edge_extractor.hdl', DLModelHandle)
set_dl_model_param (DLModelHandle, 'image_dimensions', [384, 384, 1])
; 输入必须是单通道!灰度图,自动适应低对比度和噪声

* 2. 生成预处理参数
create_dl_preprocess_param_from_model (DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)

* 3. 推理
apply_dl_model (DLModelHandle, DLSample, [], DLResult)

* 4. 后处理(关键!)
get_dict_object (SegImage, DLResult, 'segmentation_image')       ; 分割图像
get_dict_object (SegConf, DLResult, 'segmentation_confidence')   ; 置信度图

threshold (SegImage, EdgeRegion, 1, 255)                        ; 分割图二值化 → 边缘区域
threshold (SegConf, ConfidentRegion, MinConfidence, 255)        ; 置信度过滤
intersection (EdgeRegion, ConfidentRegion, ConfidentEdgeRegion)  ; 取交集 = 高置信边缘

skeleton (ConfidentEdgeRegion, DLEdges)                         ; 骨架化为细线

预训练模型特性

测试场景方法说明
对比度变化scale_image 多档缩放可处理 0.865~0.025 倍对比度
模糊退化mean_image 滤波模糊尺寸 2~10 像素仍稳定
噪声干扰白噪声/梯度噪声/条纹噪声30~150 级噪声均鲁棒

重训练流程(自定义边缘)

* 加载标注数据(二分类:背景0 / 边缘255)
read_dl_dataset_segmentation (ImageDir, LabelDir, ['background','edge'], [0,255], [], [], [], DLDataset)
split_dl_dataset (DLDataset, 80, 20, [])

* 预处理(208×208,灰度,divisible by 16)
create_dl_preprocess_param ('segmentation', 208, 208, 1, -127, 128, 'none', 'full_domain', [], [], [], [], DLPreprocessParam)
preprocess_dl_dataset (DLDataset, OutputDir, DLPreprocessParam, [], [])

* 训练参数
set_dl_model_param (DLModelHandle, 'batch_size', 2)
set_dl_model_param (DLModelHandle, 'learning_rate', 0.002)
set_dl_model_param (DLModelHandle, 'momentum', 0.95)
set_dl_model_param (DLModelHandle, 'weight_prior', 0.00001)  ; 轻正则,防止过拟合

* 数据增强:70%概率水平翻转
AugmentationParam := dict{augmentation_percentage: 70, mirror: 'rc'}
create_dl_train_param (..., 'augment', AugmentationParam, TrainParam)
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvalInfos)

* 推理优化
set_dl_model_param (DLModelHandle, 'optimize_for_inference', 'true')

* 推理后处理(重训练版)
MinConfidence := 0.8
dilation_circle (EdgeRegion, EdgeRegion, 5)    ; 膨胀填补断点
skeleton (EdgeRegion, DLEdges)
pruning (DLEdges, DLEdges, 5)                  ; 修剪短枝(长度<5px)

仅需 10 张标注图像即可完成重训练,门槛极低。

vs 传统边缘检测对比

维度Canny/edges_sub_pixDL Edge Extractor
对比度依赖梯度阈值深度学习泛化,无需调参
噪声需额外滤波原生抗噪(预训练见过噪声)
特定边缘通用,对所有边缘一视同仁可重训练识别特定边缘
输出XLD骨架 / 像素点分割区域 + 置信度
速度快(CPU)慢(需GPU),但可优化
适用场景标定、测量、通用特征工业缺陷、纹理分析、复杂场景

应用场景

典型工业用例:

  • PCB 走线检测 — 自定义重训练识别铜线边缘
  • 织物缺陷 — 面料纹理/断经/断纬边缘
  • 玻璃裂纹 — 低对比度+噪声环境
  • 焊缝检测 — 复杂背景下的焊缝边缘

更多推荐