纹理检测

算子列表 ↓

本章介绍了用于纹理检查的算子。

纹理检测模型的概念

纹理检测模型仅需设置少量参数即可实现对纹理表面的检测。该算法需要无瑕疵纹理图像进行训练。训练过程从训练图像中提取纹理特征,并基于高斯混合模型(GMM)分类器训练出纹理检测模型。训练成功后,可将纹理图像与检测模型进行比对,从而识别潜在缺陷。纹理检测基于图像金字塔结构运行,从而实现对纹理多频段范围的综合分析。

在纹理检测流程中,可以使用多通道图像。

以下简要描述执行纹理检测所需的步骤。

创建纹理检测模型:

第一步,创建纹理检查模型通过

或读取模型通过

添加训练样本:

算子

向纹理检查模型添加样本图像。

用于训练纹理检测模型的纹理表面图像。

通过 add_texture_inspection_model_imageadd_texture_inspection_model_imageAddTextureInspectionModelImageAddTextureInspectionModelImageAddTextureInspectionModelImageadd_texture_inspection_model_image 添加到纹理检查模型的图像,可使用 get_texture_inspection_model_imageget_texture_inspection_model_imageGetTextureInspectionModelImageGetTextureInspectionModelImageGetTextureInspectionModelImageget_texture_inspection_model_image 进行查看。若当前纹理检查无需使用全部或部分已添加图像,可通过 remove_texture_inspection_model_imageremove_texture_inspection_model_imageRemoveTextureInspectionModelImageRemoveTextureInspectionModelImageRemoveTextureInspectionModelImageremove_texture_inspection_model_image 将其从模型中移除。

训练纹理检测模型:

纹理检测模型通过

在训练过程中会生成图像金字塔。针对金字塔的每个层级,都会训练一个高斯混合模型(GMM)并确定一个 'novelty_threshold'"novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold" 阈值。'novelty_threshold'"novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold" 阈值用于区分无瑕疵纹理与缺陷纹理。训练完成后,可通过 get_texture_inspection_model_paramget_texture_inspection_model_paramGetTextureInspectionModelParamGetTextureInspectionModelParamGetTextureInspectionModelParamget_texture_inspection_model_param 接口查询这些新颖性阈值。

多个参数会影响训练过程。这些参数可通过

我们建议采用以下流程进行训练:

  • 根据需要设置训练的初始参数:

    • 'patch_normalization'"patch_normalization""patch_normalization""patch_normalization""patch_normalization""patch_normalization":将此参数设为 'weber'"weber""weber""weber""weber""weber" 时,所用纹理补丁的特征将被归一化,从而增强纹理检测模型对光照变化的稳健性。但需注意,某些情况下归一化可能并非理想选择——例如当需通过亮度差异区分无瑕疵与缺陷部件时。此时必须采用受控光照环境才能实现成功分类。

    • 'patch_rotational_robustness'"patch_rotational_robustness""patch_rotational_robustness""patch_rotational_robustness""patch_rotational_robustness""patch_rotational_robustness":将此参数设为 'true'"true""true""true""true""true" 时,所用纹理补丁的特征将以一种对旋转变化具有稳健性的方式排序。当难以通过训练样本训练纹理表面所有可能方向时,可使用此参数。

  • 训练纹理检测模型(使用默认参数):纹理检测模型的初始训练可能非常耗时,具体取决于训练图像的数量及其分辨率。可考虑以下节省时间的策略:

    • 缩放图像:通常情况下,纹理检测在低分辨率图像上效果更佳。若已知无需使用图像的完整分辨率,通过缩放图像可显著缩短训练时间。例如将图像缩小至原尺寸的 1/2,训练时间可相应缩短至 1/4。

    • 加速训练:另一种风险较高的策略是通过调整参数 'gmm_em_threshold'"gmm_em_threshold""gmm_em_threshold""gmm_em_threshold""gmm_em_threshold""gmm_em_threshold"(例如从 0.001 增至 0.1)来提高分类器优化的停止阈值。此举虽能缩短训练时间,但可能导致纹理检测模型的准确性降低。若采用此策略,强烈建议在多数参数调整完成后,将 'gmm_em_threshold'"gmm_em_threshold""gmm_em_threshold""gmm_em_threshold""gmm_em_threshold""gmm_em_threshold" 值重新调低。

  • 检查训练结果:使用一组具有缺陷纹理的图像,通过训练好的纹理检测模型进行分类,并按照步骤“应用纹理检测模型”所述的方法核查结果。若结果不理想,可进一步调整训练参数。最重要的参数包括:

    • 'num_levels'"num_levels""num_levels""num_levels""num_levels""num_levels"'levels'"levels""levels""levels""levels""levels":使用的金字塔层数或显式指定的金字塔层数。较高的金字塔层级处理更粗糙的纹理特征。若图像纹理非常粗糙,较低层级可能无需参与检测即可成功完成检查。此时可通过显式设置 'levels'"levels""levels""levels""levels""levels" 参数缩短运行时间。例如将 'levels'"levels""levels""levels""levels""levels" 设为[1,3]时,训练与纹理分类仅在第一层和第三层进行。

    • 'sensitivity'"sensitivity""sensitivity""sensitivity""sensitivity""sensitivity":控制新颖性阈值的严格程度。通过这种方式,可以调整对新颖性的敏感度。通常,正值会导致检测到的缺陷增加,负值则会导致检测到的缺陷减少。

    • 'novelty_threshold'"novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold":手动设置新颖性阈值。当自动估算结果不理想时,可用于精细调整。

  • 如有必要,请重复训练:若参数已调整,通常纹理检测模型需要重新训练。

应用纹理检测模型:

成功训练纹理检测模型后,即可用于分类带纹理的表面。每张测试图像均可与纹理检测模型进行比对,通过算子

Test image with defects.

对于每张测试图像,算子返回一个 'novelty_region'"novelty_region""novelty_region""novelty_region""novelty_region""novelty_region",该区域标识图像中与训练纹理样本存在高偏差的位置。'novelty_region'"novelty_region""novelty_region""novelty_region""novelty_region""novelty_region" 是通过组合不同金字塔层级的新颖性区域生成的。图像金字塔中相邻层级的新颖性区域相互相交,此步骤有助于提升单层金字塔响应对噪声的稳健性。相交的新颖区域随后被添加至返回的 'novelty_region'"novelty_region""novelty_region""novelty_region""novelty_region""novelty_region"。若某金字塔层级无相邻层级,则该区域本身将被纳入 'novelty_region'"novelty_region""novelty_region""novelty_region""novelty_region""novelty_region"。例如当 'num_levels'"num_levels""num_levels""num_levels""num_levels""num_levels" 设为 1 时,不存在相邻层级,此时 'novelty_region'"novelty_region""novelty_region""novelty_region""novelty_region""novelty_region" 即为首层金字塔的新颖区域。

调试时,可通过 set_texture_inspection_model_paramset_texture_inspection_model_paramSetTextureInspectionModelParamSetTextureInspectionModelParamSetTextureInspectionModelParamset_texture_inspection_model_param 将参数 'gen_result_handle'"gen_result_handle""gen_result_handle""gen_result_handle""gen_result_handle""gen_result_handle" 设为 'true'"true""true""true""true""true"。这样,各金字塔层级的新颖性分数图像和新颖性区域将存储于结果句柄中,随后可以读取这些数据,通过算子

总体而言,新颖性分数图像描述了每个像素与训练过程中创建的纹理检测模型契合的程度。随后通过将 'novelty_threshold'"novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold""novelty_threshold" 阈值应用于对应的新颖性分数图像,计算出单个金字塔层级的新颖性区域。

检查新颖性分数图像和新颖性区域可为您提供线索,揭示哪些金字塔层级上可检测到何种错误。由此,您可决定是否需要调整训练和分类参数,例如是否合理地仅通过 'levels'"levels""levels""levels""levels""levels" 参数显式选择金字塔层级的子集。

( 1) ( 2)
上述测试图像生成的 'novelty_score_image'"novelty_score_image""novelty_score_image""novelty_score_image""novelty_score_image""novelty_score_image"(1)和生成的 'novelty_region'"novelty_region""novelty_region""novelty_region""novelty_region""novelty_region"(2)。

其他算子

纹理检查的功能可通过多种参数进行调整。这些参数可通过调用 get_texture_inspection_model_paramget_texture_inspection_model_paramGetTextureInspectionModelParamGetTextureInspectionModelParamGetTextureInspectionModelParamget_texture_inspection_model_param 获取,并通过调用 set_texture_inspection_model_paramset_texture_inspection_model_paramSetTextureInspectionModelParamSetTextureInspectionModelParamSetTextureInspectionModelParamset_texture_inspection_model_param 进行修改。

可通过 write_texture_inspection_modelwrite_texture_inspection_modelWriteTextureInspectionModelWriteTextureInspectionModelWriteTextureInspectionModelwrite_texture_inspection_model 算子将纹理检查模型写入文件。此时仅存储纹理检查模型本身。若曾添加图像,可借助 get_texture_inspection_model_imageget_texture_inspection_model_imageGetTextureInspectionModelImageGetTextureInspectionModelImageGetTextureInspectionModelImageget_texture_inspection_model_image 进行查询,并通过调用 write_objectwrite_objectWriteObjectWriteObjectWriteObjectwrite_object 单独存储。

为降低纹理检测模型所需的内存,可通过 remove_texture_inspection_model_imageremove_texture_inspection_model_imageRemoveTextureInspectionModelImageRemoveTextureInspectionModelImageRemoveTextureInspectionModelImageremove_texture_inspection_model_image 算子从模型中删除先前添加的图像。

此外,可通过 serialize_texture_inspection_modelserialize_texture_inspection_modelSerializeTextureInspectionModelSerializeTextureInspectionModelSerializeTextureInspectionModelserialize_texture_inspection_modeldeserialize_texture_inspection_modeldeserialize_texture_inspection_modelDeserializeTextureInspectionModelDeserializeTextureInspectionModelDeserializeTextureInspectionModeldeserialize_texture_inspection_model 算子对纹理检查模型进行序列化和反序列化操作。

术语表

以下将描述在纹理检测过程中使用的最重要术语:

训练图像

用于训练的图像。

测试图像

与训练好的纹理检测模型进行比对的图像。

补丁

相邻像素的集合。

纹理特征

补丁内的像素值。

样本

用于训练的纹理特征。

新颖性分数

在测试过程中,测试图像的纹理特征与纹理检测模型进行比对,并计算其新颖性分数 novelty score。该值越大,表明该纹理特征不符合纹理检测模型的概率越高。

新颖性阈值

新颖性阈值在训练过程中确定。新颖性分数低于新颖性阈值的纹理特征符合纹理检测模型。新颖性分数更高的纹理特征则不符合。


算子列表

add_texture_inspection_model_imageAddTextureInspectionModelImageadd_texture_inspection_model_imageAddTextureInspectionModelImageadd_texture_inspection_model_image添加纹理检查模型图像
将训练图像添加到纹理检查模型中。
apply_texture_inspection_modelApplyTextureInspectionModelapply_texture_inspection_modelApplyTextureInspectionModelapply_texture_inspection_model应用纹理检查模型
检查图像中的纹理。
clear_texture_inspection_modelClearTextureInspectionModelclear_texture_inspection_modelClearTextureInspectionModelclear_texture_inspection_model清除纹理检查模型
清除纹理检查模型并释放分配的内存。
clear_texture_inspection_resultClearTextureInspectionResultclear_texture_inspection_resultClearTextureInspectionResultclear_texture_inspection_result清除纹理检查结果
清除纹理检查结果句柄并释放分配的内存。
create_texture_inspection_modelCreateTextureInspectionModelcreate_texture_inspection_modelCreateTextureInspectionModelcreate_texture_inspection_model创建纹理检查模型
创建纹理检查模型。
deserialize_texture_inspection_modelDeserializeTextureInspectionModeldeserialize_texture_inspection_modelDeserializeTextureInspectionModeldeserialize_texture_inspection_model反序列化纹理检查模型
反序列化一个序列化纹理检查模型。
get_texture_inspection_model_imageGetTextureInspectionModelImageget_texture_inspection_model_imageGetTextureInspectionModelImageget_texture_inspection_model_image获取纹理检查模型图像
获取纹理检查模型中包含的训练图像。
get_texture_inspection_model_paramGetTextureInspectionModelParamget_texture_inspection_model_paramGetTextureInspectionModelParamget_texture_inspection_model_param获取纹理检查模型参数
查询纹理检查模型的参数。
get_texture_inspection_result_objectGetTextureInspectionResultObjectget_texture_inspection_result_objectGetTextureInspectionResultObjectget_texture_inspection_result_object获取纹理检查结果对象
查询纹理检查的图标结果。
read_texture_inspection_modelReadTextureInspectionModelread_texture_inspection_modelReadTextureInspectionModelread_texture_inspection_model读取纹理检查模型
从文件中读取纹理检查模型。
remove_texture_inspection_model_imageRemoveTextureInspectionModelImageremove_texture_inspection_model_imageRemoveTextureInspectionModelImageremove_texture_inspection_model_image移除纹理检查模型图像
清除纹理检查模型的所有图像或用户定义的图像子集。
serialize_texture_inspection_modelSerializeTextureInspectionModelserialize_texture_inspection_modelSerializeTextureInspectionModelserialize_texture_inspection_model序列化纹理检查模型
序列化纹理检查模型。
set_texture_inspection_model_paramSetTextureInspectionModelParamset_texture_inspection_model_paramSetTextureInspectionModelParamset_texture_inspection_model_param设置纹理检查模型参数
设置纹理检查模型的参数。
train_texture_inspection_modelTrainTextureInspectionModeltrain_texture_inspection_modelTrainTextureInspectionModeltrain_texture_inspection_model训练纹理检查模型
训练纹理检查模型。
write_texture_inspection_modelWriteTextureInspectionModelwrite_texture_inspection_modelWriteTextureInspectionModelwrite_texture_inspection_model写入纹理检查模型
将纹理检查模型写入文件。