halcon深度学习边缘检测实战
·
* ============================================================
* DL Edge Extractor 实战演示
* 用 HALCON 预训练边缘提取模型检测刹车盘边缘
* 数据: brake_disk_bike_01 (本项目 images/ 目录下)
* ============================================================
dev_close_window ()
dev_update_off ()
*
* 设置图像搜索路径(指向本项目的 images 目录)
ImageBaseDir := '../halcon/projects/dl_edge_extractor/images'
set_system ('image_dir', ImageBaseDir)
*
dev_open_window (0, 0, 640, 512, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*
* 1) 读取预训练边缘提取模型
read_dl_model ('pretrained_dl_edge_extractor.hdl', DLModelHandle)
*
* 2) 设置模型参数
ImageWidth := 512
ImageHeight := 512
* 输入尺寸必须能被 16 整除!这是网络的降采样步长要求
set_dl_model_param (DLModelHandle, 'image_dimensions', [ImageWidth, ImageHeight, 1])
set_dl_model_param (DLModelHandle, 'batch_size', 1)
*
* 3) 生成预处理参数
create_dl_preprocess_param_from_model (DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)
*
* 4) 读取原始刹车盘图像(640x512)并缩放到网络输入尺寸
read_image (ImageRaw, 'brake_disk/brake_disk_bike_01')
crop_rectangle1 (ImageRaw, ImageCropped, 25, 55, 470, 500)
zoom_image_size (ImageCropped, Image, ImageWidth, ImageHeight, 'constant')
dev_display (Image)
dev_disp_text ('原始图像', 'window', 'top', 'left', 'white', 'box', 'true')
dev_disp_text ('按 F5 继续', 'window', 'bottom', 'right', 'white', [], [])
stop ()
*
* ============================================================
* 核心推理流程(对应 apply_dl_edge_extractor 辅助过程)
* ============================================================
*
* 4a) 生成 DLSample 并预处理
gen_dl_samples_from_images (Image, DLSample)
preprocess_dl_samples (DLSample, DLPreprocessParam)
*
* 4b) 应用深度学习模型
apply_dl_model (DLModelHandle, DLSample, [], DLResult)
*
* 4c) 提取分割结果和置信度图
get_dict_object (SegmentationImage, DLResult, 'segmentation_image')
get_dict_object (SegmentationConfidence, DLResult, 'segmentation_confidence')
*
* 5) 调整分割图和置信度图尺寸(预处理可能改变了尺寸)
get_image_size (Image, ImgW, ImgH)
zoom_image_size (SegmentationImage, SegImageOut, ImgW, ImgH, 'constant')
zoom_image_size (SegmentationConfidence, SegConfOut, ImgW, ImgH, 'constant')
*
* 6) 后处理:二值化 + 置信度过滤 + 取交集
MinConfidence := 0.5
threshold (SegImageOut, EdgeRegion, 1, 255)
threshold (SegConfOut, ConfidentRegion, MinConfidence, 255)
intersection (EdgeRegion, ConfidentRegion, ConfidentEdgeRegion)
*
* 7) 骨架化 + 显示
skeleton (ConfidentEdgeRegion, DLEdges)
dev_display (Image)
dev_set_color ('cyan')
dev_display (DLEdges)
dev_disp_text ('DL Edge Extractor 结果 (置信度>' + MinConfidence + ')', 'window', 'top', 'left', 'white', 'box', 'true')
stop ()
*
* ============================================================
* 测试不同置信度阈值的效果
* ============================================================
dev_open_window (0, 0, 1200, 400, 'black', WindowGrid)
set_display_font (WindowGrid, 12, 'mono', 'true', 'false')
Colors := ['#00FF00', '#FFFF00', '#FF8800', '#FF0000']
MinCons := [0.3, 0.5, 0.7, 0.9]
for Idx := 0 to |MinCons| - 1 by 1
threshold (SegConfOut, ConfReg, MinCons[Idx], 255)
intersection (EdgeRegion, ConfReg, ConfEdgeReg)
skeleton (ConfEdgeReg, Skel)
Col := Idx * 300
dev_set_window_extents ( 0, Col, 300, 400)
dev_set_window (WindowGrid)
dev_display (Image)
dev_set_color (Colors[Idx])
dev_display (Skel)
dev_disp_text ('MinConf=' + MinCons[Idx], 'window', 'top', 'left', 'white', 'box', 'true')
count_obj (Skel, NumEdges)
dev_disp_text ('边缘像素数: ' + NumEdges, 'window', 'bottom', 'left', 'white', 'box', 'true')
endfor
dev_disp_text ('不同置信度阈值对比 (F5 继续)', 'window', 'top', 'right', 'white', [], [])
stop ()
dev_close_window ()
*
* ============================================================
* 测试鲁棒性:低对比度 + 噪声
* ============================================================
dev_open_window (0, 0, 800, 800, 'black', WindowRobust)
set_display_font (WindowRobust, 13, 'mono', 'true', 'false')
WaitSeconds := 1.2
dev_set_color ('cyan')
*
* 低对比度测试
dev_set_window (WindowRobust)
dev_display (Image)
dev_disp_text ('测试1: 原始图像', 'window', 'top', 'left', 'white', 'box', 'true')
wait_seconds (WaitSeconds)
*
scale_image (Image, ImageDark, 0.3, 30)
gen_dl_samples_from_images (ImageDark, DLSampleDark)
preprocess_dl_samples (DLSampleDark, DLPreprocessParam)
apply_dl_model (DLModelHandle, DLSampleDark, [], DLResultDark)
get_dict_object (SegImgDark, DLResultDark, 'segmentation_image')
get_dict_object (SegConfDark, DLResultDark, 'segmentation_confidence')
zoom_image_size (SegImgDark, SegImgDarkR, ImgW, ImgH, 'constant')
zoom_image_size (SegConfDark, SegConfDarkR, ImgW, ImgH, 'constant')
threshold (SegImgDarkR, EdgeDark, 1, 255)
threshold (SegConfDarkR, ConfDark, 0.5, 255)
intersection (EdgeDark, ConfDark, ConfEdgeDark)
skeleton (ConfEdgeDark, SkelDark)
dev_clear_window ()
dev_display (ImageDark)
dev_display (SkelDark)
dev_disp_text ('测试2: 低对比度 (×0.3, +30)', 'window', 'top', 'left', 'white', 'box', 'true')
wait_seconds (WaitSeconds)
*
* 噪声测试
add_noise_white (Image, ImageNoise, 50)
gen_dl_samples_from_images (ImageNoise, DLSampleNoise)
preprocess_dl_samples (DLSampleNoise, DLPreprocessParam)
apply_dl_model (DLModelHandle, DLSampleNoise, [], DLResultNoise)
get_dict_object (SegImgNoise, DLResultNoise, 'segmentation_image')
get_dict_object (SegConfNoise, DLResultNoise, 'segmentation_confidence')
zoom_image_size (SegImgNoise, SegImgNoiseR, ImgW, ImgH, 'constant')
zoom_image_size (SegConfNoise, SegConfNoiseR, ImgW, ImgH, 'constant')
threshold (SegImgNoiseR, EdgeNoise, 1, 255)
threshold (SegConfNoiseR, ConfNoise, 0.5, 255)
intersection (EdgeNoise, ConfNoise, ConfEdgeNoise)
skeleton (ConfEdgeNoise, SkelNoise)
dev_clear_window ()
dev_display (ImageNoise)
dev_display (SkelNoise)
dev_disp_text ('测试3: 高斯白噪声 (level=50)', 'window', 'top', 'left', 'white', 'box', 'true')
wait_seconds (WaitSeconds)
*
* 同时低对比度+噪声(最难场景)
scale_image (ImageDark, ImageDarkNoise, 0.3, 30)
add_noise_white (ImageDarkNoise, ImageDarkNoise, 50)
gen_dl_samples_from_images (ImageDarkNoise, DLSampleDN)
preprocess_dl_samples (DLSampleDN, DLPreprocessParam)
apply_dl_model (DLModelHandle, DLSampleDN, [], DLResultDN)
get_dict_object (SegImgDN, DLResultDN, 'segmentation_image')
get_dict_object (SegConfDN, DLResultDN, 'segmentation_confidence')
zoom_image_size (SegImgDN, SegImgDNR, ImgW, ImgH, 'constant')
zoom_image_size (SegConfDN, SegConfDNR, ImgW, ImgH, 'constant')
threshold (SegImgDNR, EdgeDN, 1, 255)
threshold (SegConfDNR, ConfDN, 0.5, 255)
intersection (EdgeDN, ConfDN, ConfEdgeDN)
skeleton (ConfEdgeDN, SkelDN)
dev_clear_window ()
dev_display (ImageDarkNoise)
dev_display (SkelDN)
dev_disp_text ('测试4: 低对比度 + 噪声 (最难)', 'window', 'top', 'left', 'white', 'box', 'true')
dev_disp_text ('深度学习边缘提取的鲁棒性优势体现于此', 'window', 'bottom', 'left', 'orange', 'box', 'true')
stop ()
*
* 释放资源
clear_dl_model (DLModelHandle)
dev_close_window ()
更多推荐
所有评论(0)