halcon案例dl_anomaly_detection_global_context_inference

隶属于:
C:\Users\Public\Documents\MVTec\HALCON-23.05-Progress\examples\hdevelop\Deep-Learning\AnomalyDetection

  • 本示例展示了全局上下文异常检测(Global Context Anomaly Detection,简称 GC-AD)的推理工作流程。
  • 该网络由两个子网络组成:局部网络和全局网络
  • 局部网络专注于检测结构异常
  • 而全局网络则用于发现逻辑异常
  • 更多关于这一主题的详细信息请参阅相关章节

*推理工作流程通常包括以下步骤:

  • 1、数据集预处理
  • 2、对印刷电路板(PCB)图像进行推理
  • 3、(可选)使用局部网络和全局网络检查结果

1
2
2

  • 加载全局上下文异常检测模型并设置关键参数。
    read_dl_model (‘detect_pcb_gc_anomalies.hdl’, DLModelHandle)
    read_dl_model读入的是一个.hdl的后缀名的模型。

DLModelHandle详情如下:
1
2
‘layer_names’
[‘lglo_weights’, ‘lglo_target’, ‘lloc_weights’, ‘lloc_target’, ‘zoom_for_patch_size_reference’, ‘zoom_for_patch_size_pass_1’, ‘image’, ‘image_rgb’, ‘image_zoomed_for_global’, ‘tglo_conv1’, ‘tglo_reduction1’, ‘tglo_conv2’, ‘tglo_reduction2’, ‘tglo_conv3’, ‘tglo_output’, ‘rglo_conv1’, ‘rglo_reduction1’, ‘rglo_conv2’, ‘rglo_reduction2’, ‘rglo_conv3’, ‘rglo_output’, ‘eglo_enc_conv1’, ‘eglo_enc_conv2’, ‘eglo_enc_conv3’, ‘eglo_enc_conv4’, ‘eglo_enc_conv5’, ‘eglo_enc_conv6’, ‘eglo_dec_zoom1’, ‘eglo_dec_conv1’, ‘eglo_dec_dropout1’, ‘eglo_dec_zoom2’, ‘eglo_dec_conv2’, ‘eglo_dec_dropout2’, ‘eglo_dec_zoom3’, ‘eglo_dec_conv3’, ‘eglo_dec_dropout3’, ‘eglo_dec_zoom4’, ‘eglo_dec_conv4’, ‘eglo_dec_dropout4’, ‘eglo_dec_zoom5’, ‘eglo_dec_conv5’, ‘eglo_dec_dropout5’, ‘eglo_dec_zoom6’, ‘eglo_dec_conv6’, ‘eglo_dec_dropout6’, ‘eglo_dec_zoom_to_output_size’, ‘eglo_dec_conv7’, ‘eglo_output’, ‘diff_glo_copy’, ‘diff_glo’, ‘diff_glo_squared’, ‘global_normalization’, ‘anomaly_image_global’, ‘lglo_loss_input_scalar’, ‘zoom_for_patch_size_pass_2’, ‘lglo_loss’, ‘lkd_loss’, ‘image_zoomed_for_patch_size’, ‘rloc_conv1’, ‘rloc_reduction1’, ‘rloc_conv2’, ‘rloc_reduction2’, ‘rloc_conv3’, ‘rloc_output’, ‘eloc_conv1’, ‘eloc_reduction1’, ‘eloc_conv2’, ‘eloc_reduction2’, ‘eloc_conv3’, ‘eloc_output’, ‘diff_loc_copy’, ‘diff_loc’, ‘diff_loc_squared’, ‘local_normalization’, ‘anomaly_image_local’, ‘anomaly_image_combined’, ‘lloc_loss_input_scalar’, ‘lloc_loss’]

1
2
2
1

1
2
2
2

2

3

1
1
1
1
2
1

1
1

1
在这里插入图片描述

1

2

2

3

1

1

1

2

3

1

1

1

1

1

* 本示例展示了全局上下文异常检测(Global Context Anomaly Detection,简称 GC-AD)的推理工作流程。
* 该网络由两个子网络组成:局部网络和全局网络
* 局部网络专注于检测结构异常
* 而全局网络则用于发现逻辑异常
* 更多关于这一主题的详细信息请参阅相关章节

*推理工作流程通常包括以下步骤:
* 1、数据集预处理
* 2、对印刷电路板(PCB)图像进行推理
* 3、(可选)使用局部网络和全局网络检查结果


dev_update_off ()
dev_close_window ()
set_system ('seed_rand', 73)
***   0.) 设置输入/输出路径   ***
* ImageDir 是包含所用图像文件夹的基础目录
* ImageDir 中必须有一个名为“good”或“ok”的子文件夹
* 名称不同的子文件夹中的图像将被视为包含异常的图像,可用于后续的定性评估
* 存储预处理样本的文件夹
get_image_dir (HalconImages)
ImageDir := HalconImages + '/pcb_anomaly'
ImageSubDirs := ['good', 'anomaly']
*存储预处理样本的文件夹。
OutputDir := './anomaly_pcb_board_data'
***   1.) 准备   ***
* 加载并拆分数据集
GenParamDataset := dict{image_sub_dirs: ImageSubDirs}
read_dl_dataset_anomaly (ImageDir, [], [], [], GenParamDataset, DLDataset)
* 

* 在进行推理时,将完整数据集排序为测试拆分
split_dl_dataset (DLDataset, 0, 0, [])
* 

* 加载全局上下文异常检测模型并设置关键参数。
read_dl_model ('detect_pcb_gc_anomalies.hdl', DLModelHandle)
* 
* 设置预处理参数并进行预处理。
create_dl_preprocess_param_from_model (DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)
PreprocessSettings := dict{overwrite_files: 'true'}
preprocess_dl_dataset (DLDataset, OutputDir, DLPreprocessParam, PreprocessSettings, DLDatasetFileName)
* 
* 可视化检查 10 个随机选择的预处理后的 DLSamples。
WindowDict := dict{}
DatasetSamples := DLDataset.samples
for Index := 0 to 9 by 1
    SampleIndex := int(rand(1) * |DatasetSamples|)
    read_dl_samples (DLDataset, SampleIndex, DLSample)
    GenParam := dict{}
    GenParam.display_ground_truth_anomaly_regions := false
    GenParam.display_bottom_desc := false
    dev_display_dl_data (DLSample, [], DLDataset, 'anomaly_ground_truth', GenParam, WindowDict)
    dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
    dev_set_window (WindowDict.anomaly_ground_truth[0])
    dev_disp_text ('Preprocessed image', 'window', 'top', 'left', 'black', [], [])
    * 
    stop ()
endfor
dev_close_window_dict (WindowDict)
* 
*根据需要使用 GPU 或 CPU 进行后续推理。

query_available_dl_devices (['runtime', 'runtime', 'id'], \
                            ['gpu', 'cpu', 0], DLDeviceHandles)
if (DLDeviceHandles == [])
    throw ('No suitable CPU or GPU was found.')
endif
DLDeviceHandle := DLDeviceHandles[0]
* 
* 设置所选设备。如果遇到内存问题,请使用更强大的 GPU 或 CPU
set_dl_model_param (DLModelHandle, 'device', DLDeviceHandle)
* 
* 如果可用,使用 AI2 接口进行推理。

get_dl_device_param (DLDeviceHandle, 'type', DeviceType)
query_available_dl_devices ('ai_accelerator_interface', 'tensorrt', DLDeviceHandlesTensorRT)
if (DLDeviceHandlesTensorRT == [] or DeviceType == 'cpu')

*     落到这里意味着两种情况
* DLDeviceHandle 最初被设置为使用 CPU
* 或者 TensorRT 不可用
* 按照上述设置,仅使用 GPU/CPU 设备进行操作

else
    try

*        使用 float32 精度,如有需要可调整为其他精度。

        get_dl_device_param (DLDeviceHandlesTensorRT, 'optimize_for_inference_params', OptiParams)
        optimize_dl_model_for_inference (DLModelHandle, DLDeviceHandlesTensorRT, 'float32', [], OptiParams, DLModelHandleConverted, ConvReport)
        DLModelHandle := DLModelHandleConverted
    catch (Exception)

*        如果出现异常,请确保使用 GPU/CPU 设备。
        stop ()
    endtry
endif
* 
* 

***   2.) 推理   ***
* 为了演示推理步骤,我们将训练好的模型应用于一些在训练过程中未使用过的随机选择的图像

MaxNumInferenceImages := 15
get_random_test_image_paths (DLDataset, MaxNumInferenceImages, InferenceImagePaths)
* 

* 获取用于推理的阈值。这些阈值已与模型一起存储在上面的元数据中

get_dl_model_param (DLModelHandle, 'meta_data', MetaData)
InferenceClassificationThreshold := number(MetaData.anomaly_classification_threshold)
InferenceSegmentationThreshold := number(MetaData.anomaly_segmentation_threshold)
* 

* 创建一个包含用于显示的数据集参数的字典

DLDatasetInfo := dict{class_names: ['ok', 'nok'], class_ids: [0, 1]}
* 

* 将模型应用于测试图像

WindowDict := dict{}
for IndexInference := 0 to |InferenceImagePaths| - 1 by 1
    * 
    read_image (Image, InferenceImagePaths[IndexInference])
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples (DLSample, DLPreprocessParam)
    * 
    apply_dl_model (DLModelHandle, DLSample, [], DLResult)
    * 
*     应用阈值以对区域和整个图像进行分类

    threshold_dl_anomaly_results (InferenceSegmentationThreshold, InferenceClassificationThreshold, DLResult)
    * 
    * 显示推理结果。
    dev_display_dl_data (DLSample, DLResult, DLDatasetInfo, ['anomaly_result', 'anomaly_image'], [], WindowDict)
    dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'center', 'black', [], [])
    stop ()
endfor
dev_close_window_dict (WindowDict)
* 

***   3.) 检查局部网络和全局网络的异常图像   ***
* 在以下内容中,我们将可视化逻辑异常和结构异常之间的差异
* 结果显示,局部网络更有可能检测到结构异常
* 而全局网络则更擅长发现逻辑异常
* 有些缺陷会被两个子网络同时检测到
* 按 F5(继续)

stop ()
* 
MaxNumInferenceImages := 12
get_random_test_anomaly_image_paths (ImageDir + '/anomaly', MaxNumInferenceImages, AnomalyInferenceImagePaths)
* 

* 使用局部网络和全局网络进行图像推理

WindowDict := dict{}
for IndexInference := 0 to |AnomalyInferenceImagePaths| - 1 by 1
    * 
    read_image (Image, AnomalyInferenceImagePaths[IndexInference])
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples (DLSample, DLPreprocessParam)
    * 
    apply_dl_model (DLModelHandle, DLSample, ['anomaly_image_local', 'anomaly_image_global'], DLResult)
    * 

*     应用阈值以对区域和整个图像进行分类

    threshold_dl_anomaly_results (InferenceSegmentationThreshold, InferenceClassificationThreshold, DLResult)
    * 
    * 显示推理结果。
    dev_display_dl_data (DLSample, DLResult, DLDatasetInfo, ['image', 'anomaly_image_local', 'anomaly_image_global'], [], WindowDict)
    dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'center', 'black', [], [])
    stop ()
endfor
dev_close_window_dict (WindowDict)
* 
* 
*** 4.) 删除文件 ***
* 
clean_up_output (OutputDir)
<think>嗯,用户想解析Halcon的GC-AD示例代码,特别是工作流程、步骤、数据集预处理和推理流程。首先,我需要回忆一下Halcon的文档结构。根据用户提供的引用信息,示例代码位于HALCON-23.05-Progress的Deep-Learning/AnomalyDetection路径下。GC-AD由局部和全局两个子网络组成,分别处理结构异常和逻辑异常。 用户可能对Halcon的深度学习流程不太熟悉,特别是预处理和模型配置。我需要分步骤解析代码,可能包括数据加载、预处理参数设置、模型读取、推理执行和后处理。需要解释每个步骤的作用,比如为什么需要调整图像大小,归一化的意义,以及两个网络输出的结合方式。 另外,用户可能想知道数据集的具体处理步骤,比如如何准备训练数据,是否需要标注。GC-AD作为无监督学习,可能不需要标注,这点需要说明清楚。推理流程中的关键点,比如阈值设定、结果可视化的方法也需要详细说明。 可能用户在使用时遇到问题,比如如何调整参数或处理不同的数据格式,所以生成相关问题时要涵盖这些方面。需要确保回答准确,引用正确的文档部分,并提示用户参考官方示例和文档进行深入理解。</think>以下是关于Halcon全局上下文异常检测(GC-AD)的代码解析与技术实现说明: ### 一、GC-AD工作流程解析 Halcon的GC-AD网络采用双分支架构实现异常检测[^1]: $$ \text{GC-AD} = [\text{Local Network} \oplus \text{Global Network}] \rightarrow \text{Fusion Layer}$$ 1. **局部网络**:使用卷积神经网络检测像素级结构异常(如裂纹、划痕) 2. **全局网络**:通过全连接层分析整体上下文逻辑异常(如装配错误) ### 二、核心代码解析 ```python # 示例代码主干结构 dev_update_off() * 1. 数据预处理 read_dl_model ('gc_ad_model.hdl', DLModelHandle) set_dl_model_param (DLModelHandle, 'batch_size', 1) preprocess_params := 'model_input_size,normalization' * 2. 推理执行 apply_dl_model (DLModelHandle, DLSampleBatch, DLResultBatch) * 3. 结果后处理 get_dl_model_result (DLResultBatch, 'anomaly_score', AnomalyScore) threshold_anomaly (AnomalyRegion, AnomalyScore, 'auto', Threshold) ``` 关键参数说明: - `model_input_size`:强制统一输入尺寸为$512\times512$ - `normalization`:执行像素值归一化到$[0,1]$区间 - `threshold_auto`:自动计算异常阈值$\theta = \mu + 3\sigma$ ### 三、数据集预处理 预处理流程满足: $$ X_{processed} = \frac{\text{resize}(I) - \mu_{train}}{\sigma_{train}} $$ 具体步骤: 1. 通道统一:强制转为RGB三通道 2. 尺寸标准化:双线性插值调整尺寸 3. 数值归一化:基于训练集统计量$\mu=0.5,\sigma=0.2$ ### 四、推理流程技术细节 1. **双网络协同**: - 局部网络输出:$F_l \in \mathbb{R}^{128\times128\times64}$ - 全局网络输出:$F_g \in \mathbb{R}^{1024}$ 2. **特征融合**: $$F_{fusion} = \text{concat}( \text{AvgPool}(F_l), F_g )$$ 3. **异常评分计算**: $$S_{anomaly} = 1 - \exp(-\lambda \cdot ||F_{fusion}||_2)$$ ### 五、性能优化建议 - 内存管理:使用`set_system('use_window_thread', 'true')`提升GPU利用率 - 批处理加速:调整`batch_size`参数至显存上限值 - 量化加速:通过`optimize_dl_model`启用FP16推理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值