halcon深度学习边缘提取DL Edge Extractor
·
和传统边缘检测(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_pix | DL Edge Extractor |
|---|---|---|
| 对比度 | 依赖梯度阈值 | 深度学习泛化,无需调参 |
| 噪声 | 需额外滤波 | 原生抗噪(预训练见过噪声) |
| 特定边缘 | 通用,对所有边缘一视同仁 | 可重训练识别特定边缘 |
| 输出 | XLD骨架 / 像素点 | 分割区域 + 置信度 |
| 速度 | 快(CPU) | 慢(需GPU),但可优化 |
| 适用场景 | 标定、测量、通用特征 | 工业缺陷、纹理分析、复杂场景 |
应用场景
典型工业用例:
- PCB 走线检测 — 自定义重训练识别铜线边缘
- 织物缺陷 — 面料纹理/断经/断纬边缘
- 玻璃裂纹 — 低对比度+噪声环境
- 焊缝检测 — 复杂背景下的焊缝边缘
更多推荐
所有评论(0)