solution_guide_ii_c_2d_data_codes[Chapter 3]

欢迎关注

Chapter 3

Model Adaptation

在这里插入图片描述
要使算子能够找到二维码,我们需要设置一系列的参数。在第一个例程中[],我们没有显式的设置除了二维码类型[]以外的其他参数,因此我们使用的是系统的默认参数。使用默认参数查找二维码需要满足下面条件才能正确解析:

  • 二维码必须是黑色模组,白色背景
  • 对比度必须大于30
  • 二维码的大小和模组行列数量必须在一定的范围内
  • PDF417 没有Gap;矩阵码的Gap较小
  • 对于QR码 必须有三个定位图形
  • 对于Micro QR码必须有一个定位图形
  • 对于Aztec QR码必须有一个定位图形
    在这里插入图片描述
    很多案例中,我们需要面对二维码不能满足上面的要求,因此无法正确读取。还有一些案例我们需要提高程序的运行效率,因此我们需要修改一些参数,以能够适应特定的应用需求。Halcon提供了不同的方法来修改参数。这些方法将在下面章节进行详细描述。此外,我们也会给出有关提高运行时间和保存模型对象的建议。下面章节将会特别涉及:
  • 调整模型以能够读到更大范围的二维码
  • 自动训练模型,以适应特性场景或者需求
  • 手动设置参数,以优化运行时间
  • 保存模型到文件

3.1 Global Parameter Settings

在这里插入图片描述
有三组预定义的参数集,用来设置对象模型: 标准识别模式[standard_recognition],增强识别模式[enhanced_recognition],最大识别模式[maximum_recognition]。第一个是已经使用的标准模式,如果没有任何参数设置,默认选择该模式。标准模式限制了一组参数范围,对很多二维码[并非所有]而言,运行迅速。第二个是增强模式,他的参数范围更大。因此他不及标准模式快速。几乎能识别所有的二维码。

  • 二维码可以是黑色背景,白色模组
  • 对比度可以更低(>=10)
  • 模组的大小可以更小
  • Gap可以更大
  • Data Matrix ECC 200可以更加倾斜,最大30度
  • 模组的大小可以在一定范围内变动
  • QR Code 的定位图形可以只有两个
  • 对于Micro QR码必须有一个定位图形
  • 对于Aztec QR码必须有一个定位图形

在这里插入图片描述
第三种为最大识别模式,除了增强模式增强之外。二维码的模组大小可以更小,对于Data Matrix ECC 200而言,对于局部对比度的变化的健壮性更好,Aztec Code的定位图形可以变形或则局部遮挡。Data Matrix ECC 200的定位图形可以变形设置丢失。但是请注意,这种模式仅用在非常少的应用中。因为他比增强识别模式更耗时,更耗内存。应当在使用该模式是配合以其他参数的限制,尤其是二维码大小的限制。
除了标准模式只需要在使用其他模式后,复位模型,所有的模式可以使用算子[set_data_code_2d_param]设置。例程[hdevelop\Identification\Data-Code\2d_data_codes_default_settings.hdev] 和第一个案例很相似,创建了三个对象,设置成三种模式,然后对比每种模式的区别。

create_data_code_2d_model (SymbolType[Index], 'default_parameters', 'standard_recognition', DataCodeHandleStandard)
create_data_code_2d_model (SymbolType[Index], 'default_parameters', 'enhanced_recognition', DataCodeHandleEnhanced)
create_data_code_2d_model (SymbolType[Index], 'default_parameters', 'maximum_recognition', DataCodeHandleMaximum)

在这里插入图片描述
当运行程序时,每种模式都进行二维码的查找,如果在标准模式下能够查找到,那么其他两种模式同样能查找到。在标准模式下没有查到的也可以在增强识别模式或者最大识别模式下查到。将模式从标准模式切换到增强或者最大识别模式是最简单的查找二维码的方法。然而由于需要更多地参数要检查,查找流程所需的时间将会增加,尤其是最终没有发现二维码的情况。下面的代码测量了在不同模式下所需耗费的时间。那么你可以比较在不同模式下读取二维码所需要耗费的时间。例如在图3.1所示案例中,增强模式花的时间是标准模式的2倍,最大识别模式花的时间是标准模式的5倍。

count_seconds (T1)
find_data_code_2d (Image, SymbolXLDs, DataCodeHandleStandard, \
[], [], ResultHandles, DecodedDataStrings)
endfor
count_seconds (T2)
TimeStandard := 1000 * (T2 - T1) / real(NLoops)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于在增强模式和最大识别模式下会显著的增加运行时间和内存使用,模型参数需要尽量准确的设定,例如ECC 200二维码,在最大识别模式时候二维码大小应当尽可能准确。因此为了降低运行时间,我们需要根据图片调整参数,所以我们强烈建议使用标准模式外加自动训练方式,或者手动设置特性参数。请注意如果二维码不能在增强模式或者最大识别模式下识别出来,除了极少情况,进一步调整模型也不会识别到二维码。在这个状态下,你应当增强图片质量。例如通过改善光照条件等。或者通过前处理改善图片质量。

3.2 Training

在这里插入图片描述
如果你有一些需要识别二维码的图片,大多数情况下这些图片有相似的属性。我们可以利用这些相似性来训练二维码模型。我们可以通过这些图片的子集训练,获取一组特性的,最适合我们应用的参数。通过训练得到的参数,我们可以识别剩下的图片。通过这种方式,我们可以查找不符合标准模式所有要求的图片的二维码。和增强模式 以及最大识别模式不同,这种方式在大多数情况下,可以更加好的限制模式参数,因此能够或者更快的运行时间
在这里插入图片描述
在Halcon 案例[hdevelop\Identification\Data-Code\ecc200_training.hdev]中,通过算子[ create_data_code_2d_model ]创建模型,然后通过两个图片训练模型。训练时,我们使用和查找二维码相同的算子[ find_data_code_2d],此时参数’train’分配给算子,他的值确定了哪组参数会在模型训练中改变。这个地方我们用’all’,所以二维码模型的所有参数都会随着训练改变。如果你想训练指定的参数组 ,例如’symbol_size’, ’module_size’, or ’contrast’,你可以把这些组成元组,赋值给算子。元组中,你可以执行’all’ 并且 排除指定参数组,来训练模型。排除指定参数组的方式是添加前缀 ’~’。算子[ find_data_code_2d]训练模型完整的,有效的值得列表在参照手册中。如果你处理的图片中包含超过一个二维码,你可以通过设置参数[stop_after_result_num]的值来改变算子预期找到的二维码的数量。如果你只想找到特定的二维码,可以通过添加包含指定二维码的ROI来限制模型,ROI的介绍请参照其他手册。

逐个图片应用算子 find_data_code_2d进行训练。通过算子第一张图片限制了算子模型的查找,读取,解码二位码的各个参数,后续的各个图片用来调整参数的范围,以便我们的训练结果可以适应这组图片的需求。如果所有的二维码有相同的大小,没有间隙[GAP],前景和背景模组有相同的大小,没有显著的纹理,相似的对比度,那么一张图片训练即可。然而在大多数应用中,我们用几张图片训练是必要的。为了获得一个满意的训练结果,我们最好使用差异最大的图片训练。本例中,我们是使用两个不同对比度 图片训练模型。

create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle)
* Dark image
read_image (Image, 'datacode/ecc200/ecc200_cpu_007')
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, 'train', 'all', \
ResultHandles, DecodedDataStrings)
* Bright image
read_image (Image, 'datacode/ecc200/ecc200_cpu_008')
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, 'train', 'all', \
ResultHandles, DecodedDataStrings)

在这里插入图片描述
在这里插入图片描述
训练产生一个合适的用来读取后续图片二维码的算子模型。读取二维码时,我们再次应用算子find_data_code_2d,这次我们不是使用参数’train’。在程序的最后,我们使用算子[clear_data_code_2d_model]来重置模型和释放内存。

for Index := 7 to 16 by 1
read_image (Image, ImageFiles + Index$'.2d')
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], \
ResultHandles, DecodedDataStrings)
endfor
clear_data_code_2d_model (DataCodeHandle)

在这里插入图片描述在这里插入图片描述
在程序[hdevelop\Identification\Data-Code\ecc200_training.hdev]中,在训练开始,我们有几行在多余的代码,用来帮我们理解训练模型如何改变模型参数的,这些代码,在正常的训练和解码中是不必要的。
在训练开始前,算子获取了模型算子的特定二维码类型一系列参数,本例中的参数是Data Matrix ECC 200类型的参数集。模型的参数的值通过算子[get_data_code_2d_param]获得。

query_data_code_2d_params (DataCodeHandle, 'get_model_params', \
GenParamNames)
get_data_code_2d_param (DataCodeHandle, GenParamNames, ModelBeforeTraining)

在这里插入图片描述
训练后,我们再次检查模型参数的值,并且和为训练的模型产值数值相比较,并显示比较结果。

get_data_code_2d_param (DataCodeHandle, GenParamNames, ModelAfterTraining)
ModelAdaption := (GenParamNames + ':')$'-25' + ModelBeforeTraining$'15' + ' -> ' + ModelAfterTraining
disp_message (WindowHandle, 'Model parameters before and after the training:', 'window', 12, 12, 'white', 'false')
disp_message (WindowHandle, ModelAdaption, 'window', 60, 12, 'white', 'false')

在这里插入图片描述
在这里插入图片描述
在一些案例中,当你需要读取一些二维码和你训练的不相似时,我们可以手动改变参数,来适应。下一个章节我们将展示如何单独设置参数,同时更深的理解二维码算子中的特定参数组。

3.3 Specific Parameter Settings

在这里插入图片描述
第三种也是最难得一种修改二维码模型的方法是手动改变模型参数。程序[hdevelop\Applications\Data-Codes
ecc200_optimized_settings.hdev]展示了如何修改参数,介绍了能够让我更深理解二维码模型的几个算子。模型参数的修改既可以通过算子 [ create_data_code_2d_model],也可以通过算子[set_data_code_2d_param]完成,这个在3.1有介绍。后一个算子[set_data_code_2d_param]既可以多次调用,又可以将参数组合到元组中调用。和用全局参数集一次设置所有参数不同,我们现在逐个的修改参数。下面的章节我们更深的了解一下特定的参数组,特别包含一下参数组:

  • 二维码的形状和尺寸
  • 模组的外观,对比度等
  • 二维码模型的通用行为,严格限制以及保存搜索的临时结果。
    为了有过一个简要概括的了解前两个参数组的值的范围,我们可以看 section 5.3.2 on page 49。完整的参数名称和表土提供在算子 [set_data_code_2d_param]的参照手册中。
    在这里插入图片描述

在这里插入图片描述
二维码形状和尺寸
有一组参数用来控制它的大小,行列,以及二维码的外观
二维码形状[ Data Matrix ECC 200]
对于二维码[ Data Matrix ECC 200],有参数’symbol_shape’指定二维码的形状。如果它的值设置为’rectangle’,模组的行列数量不同,如果设置成’square’,模组的行列数量相同。如果值是’any’,那么每种形状都查找。Halcon 7.1之后,‘symbol_shape’ 依然保留,但是查询算法是一样了。对于查找二维码这个参数不在重要了。
二维码尺寸
这个参数和二维码的最小和最大行列数量相关联。对于矩阵码[Data Matrix ECC 200, QR Code, Micro QR Code,
and Aztec Code]指的是模组的行列数,对于堆叠码[PDF417]指的是codewords的行列数[不包含开始符号,终止符号,左右标志]。对于QR Codes and Micro QR Codes都是正方形,因此有相同的行列数量,对于他们也可以通过version number 参数指定行列数量。Data Matrix ECC 200 and PDF417行列数可以不同。
在例程中,'symbol_shape’是第一个设置的属性,Data Matrix ECC 200的’symbol_shape’默认值是8-144行,10-144列。假设一个正方形二维码,因此它的是单个值,如果设置它为18,那么他就是18行,18列。这样可以提高搜索速度。

set_data_code_2d_param (DataCodeHandle, 'symbol_size', 18)

在这里插入图片描述
在这里插入图片描述Model Type[QR Code]
有两种不同的QR Code,旧的是Model 1 新的是Model 2. Version 1 行列范围是21-73 ,Version 2是 21-177。此外定位图形也有区别。Version>2的Model1 含有extension pattern ,Model2 含有alignment patterns。当处理QR Code我们需要限制正确的’model_type’ = 1 2 或者any
注意: Halcon也支持Micro QR Code, 这些被当做 own code type。

在这里插入图片描述
在这里插入图片描述
Fomat[Aztec Code]
Aztec Code 有三种不同的格式,可以通过设置参数’format’。这个参数有三个值:‘compact’,‘full_range’,‘rune’;
这三个值定义了三种不同的尺寸

  • compact:15x15 到 27x27; 每个版本增加4个模组
  • full_range: 19x10 到 151x151; 每个版本增加4个模组
  • rune: 11x11 固定值
    ‘format’ 的默认值是 ‘compact full_range’,如果Aztec Code 没有被正确读取,请特别注意参数的’format’值。
    例程展示了如何优化模型以读取Aztec Code,展示了在哪些特定案例中的参数是特别有用的。
    在这里插入图片描述
    模组的外观
    二维码的模组外观有很大区别,在程序中我们需要根据需要设置主要属性
    极性
    参数’polarity’ 定义了模组的前景是比背景更暗还是更亮,或者两者都有,参数的默认值是’dark_on_light’。如果设置成’any’ 那么两种极性都要检查,在程序中我们将’polarity’改成’light_on_dark’,以便更好适应我们的二维码。
    镜像
    读取二维码时,有时候二维码是镜像的,尤其当我们读取透明的表面的二维码。‘mirrored’默认值设置为’any’,镜像的和不镜像的二维码都会被搜索。如果只有镜像的二维码,那么参数设置成’yes’,如果只有不镜像的二维码,那么参数设置成’no’。
    在这里插入图片描述
    在这里插入图片描述
    对比度
    对比度大致相当于二维码前景和背景灰度值的差值。算子内部使用梯度幅值计算对比度。这就意味着对于模糊的边缘的对比度会更低一些,如果相机失焦造成边缘模糊的话。
    最小对比度
    最小对比度必须设置成比二维码实际对比度还要低的值。在标准模式下,最小对比度设置成30,如果因为模糊或者光照条件差造成对比度低,我们需要设置’contrast_min’,在这种情况下,我们设置成增强模式的最低值10.

在这里插入图片描述
对比度误差
如果出现局部对比度变动,例如反光,反射。一个健壮的二维码读取器需要设置参数’contrast_tolerace’ = ‘high’。 见例程’hdevelop\Identification\Data-Code\ecc200_contrast_tolerance.hdev’。
在这里插入图片描述
参数[Module Szie]限制了模组的像素大小,以加速搜索流程。这个参数在模组大小有相似大小情况下是有用的。对于矩阵码,模组大小指的是模组的宽高,对于PDF417,模组的宽度和模组的高宽比[模组高度/模组宽度,见图3.9]。Module Size 的默认值取决于不同的二维码类型,‘Data Matrix ECC 200’ 在标准模式下的默认参数是 6-20pixel。因为案例中我们的模组尺寸较小,所以设置范围为4-7像素。

注意如果模组大小小于2像素,例如‘module_size_min’=1,那么参数‘small_modules_robustness’必须设置为‘high’以提高识别成功率。但是这个显著提高运行时间和系统内存消耗。

在这里插入图片描述
Module Gap[only Matrix Codes]
和PDF417不同,矩阵码的模组没必要相连,如果模组间的间隙存在,我们可以指定x和y方向的尺寸范围=‘small’ 小于10%模组大小,=‘big’ 小于50%模组大小。在标准模式中,只允许有小的间隙。在例程中,我们的二维码的模组没有间隙,所以我们限制参数’module_gao’=‘no’。图片2.10展示了不同的模组间隙。
在这里插入图片描述
最大倾斜[only Data Matirx]:
对于 Data Matirx L形的查找图案,默认假设是直角的,但是一定程度的倾斜也能够处理[如图3.11]。在标准模式下,最大倾斜角是10度,在增强模式下最大倾斜角是30度,本例中我们保持标准模式默认值。
模组栅格[only Data Matirx]:
模组栅格决定了算法计算二维码模组位置的方法。如果设置为‘fixed’。二维码的模组必须排列在一个矩形且有相似距离的栅格中。如果设置成‘variable’栅格沿着L查找图案对齐,默认模组大小可以变动在一定的范围内,特别注意的模组的大小可以在矩形栅格内,偏离设置的模组尺寸大小。如果设置为‘any’,两种方法都要查找。
在这里插入图片描述
请注意如果’module_grid’=‘fixed’ 自动设置参数‘finder_pattern_tolerace’=‘high’。这中情况[‘finder_pattern_tolerace’=‘high’]二维码是变形的甚至缺失查找图案。这个是在最大识别模式[‘maximun_recognition’]下的值。

限制静默区域[除了Aztec Code之外]
除了Aztec Code,其他的二维码都有静默区[一个二维码周围没有干扰的区域]。然而Halcon仍然在静默区有缺陷时候读取二维码。案例展示如何通过设置参数来压制这个属性。

在这里插入图片描述
定位图案的数量[only QR Code]
当处理QR Code时候,你可以通过设置参数’p’ [代表最少的定位图形的数量]=3或者2。标准模式下默认值=2,就是所有定位图形都要有,增强模式下默认值=2,就是可以缺少一个定位图形
在这里插入图片描述
模型控制参数
除了二维码的尺寸和外观,你可以通过指定参数‘persistence’和‘strict_model’来控制模型的行为。
‘persistence’参数决定如何保存在算子‘find_data_code_2d’查找二维码是产生的即时数据结果。默认情况下是’persistence’=0 只是临时保存,以便节约内存。如果设置’persistence’=1,结果将被持续保存。由于这个消耗非常多的内存,我们建议仅仅在需要展示这些结果或者调试时候才这样处理。更多的如何调试在第五章。如果仅仅需要二维码解码信息,不需要其他信息,那么’persistence’=1.这样只有解码结果被储存,内存的消耗将降低到最低。

在这里插入图片描述
有时候,一些二维码能读取,但是并不满足模型的尺寸限制条件。参数’strict_model’,控制算子‘find_data_code_2d’的行为,使他拒绝这样的二维码或者返回这样的结果。对于前者使默认的设置‘strict_model’=‘yes’.这个设置在这样的情况下使合理的,就是我们的二维码是一定大小,同时在图片上也包含其他的二维码,但是必须忽略。如果设置‘strict_model’=‘no’。那么不满足限制条件的二维码仍然可以被发现。

3.4 Miscellaneous

在这里插入图片描述
算子[find_data_code_2d]加速
你可以通过两种方法加速算子的运行时间。一种是限制搜索范围,一种是通过设置模型参数限制搜索范围。下面详细描述两种方法。

  1. ROI
    Halcon的通用加速方法就是限制查找范围。为了达成这个目的,可以定义一个ROI,包含我们需要找的二维码。举个例子:如果所有图像中,二维码都在左上角,你可以定义在左上角一个区域,包含所有图像中的二维码。我们可以通过算子[gen_rectangle1]创建一个矩形区域。读取图像后,你可以减少图像的图像的有效区域通过算子reduce_domain。这样我们就用缩减域后的图片使用算子find_data_code_2d。更多ROI的信息,请参照手册I 第三章 33页。

在这里插入图片描述
2. 限制模型
3.1节 在12页已经提到了调整模型参数能够显著影响算子的运行时间。所以第二种加速的方法就是将算子的参数限制在二维码的所需要的最小范围。为了能够更好的理解限制参数范围的重要性,我们进一步观察二维码搜索的步骤。
搜索有几个passes,首先在金字塔最高级[就是二维码的最大的模组尺寸可见的那一层]开始。最小的模组大小决定了评估的最低的金字塔层。减少module_size的范围,可以减少二维码搜索的passes的数量,因此提高了运行时间。
在每个金字塔层,参数会被检查。如果’polarity’=‘any’,在第一遍[in the first pass],模型查找’dark_on_light’的二维码,如果没有发现,在第二遍查找‘light_on_dark’的二维码,因此限制‘polarity’的值可以显著提高运效率。

在这里插入图片描述
每一步有两个阶段构成:搜索阶段,评估阶段。搜索阶段用于搜索定位图案,和在扎找到定位图案未知确定二维码的候选目标。评估阶段用于在低层的金字塔中评估候选,如果有可能进行读取二维码结果。算子[find_data_code_2d]当获成功读取足够数量的二维码,或者最后一步已经完成,结束运行。这就解释了为什么合理的参数设置可以获得快速的运行结果。较大范围的参数检查,但是没有足够数量的二维码时,会需要更长的运行时间。

在这里插入图片描述
注意:对于AztecCode 你可以添加更多的金字塔层,以增加程序的稳定性。但是这个设置会需要更多的运行时间。
总结一下,如果你的应用中运行时间很重要,你需要特别关注一下模型参数:

  • polarity
  • 最小模组尺寸
  • 二维码的行数:对于PDF417 ,尤其是有较严重的褶皱和纹理图片
  • 模组间隙 :对于矩阵码 有较小的模组间隙
  • 定位图案的最小数量 :QR Codes
  • 额外金字塔层级[additional_levels] ,查找定位图案的误差设置值[finder_pattern_tolerance] : Aztec Codes

如果这些值没有被正确的设置,或者没有设置在合理范围,搜索阶段会更慢,尤其是没有知道需要的二维码数量。查找二维码模型的参数可以通过算子[get_data_code_2d_results]获得,如5.1.2 ,36页
在这里插入图片描述
保存二维码模型
在训练模型或者,或者手动设置参数后,模型可以通过算子[write_data_code_2d_model]保存。案例[hdevelop\Identification\Data-Code\ecc200_training.hdev]展示了训练保存二维码模型的主要步骤。
首先和其他案例一样,通过算子创建 Data Matrix的模型。然后通过算子[find_data_code_2d],根据选定图片训练模型。这个步骤改变了二维码模型,然后通过算子[write_data_code_2d_model]保存在文件中,最后清除模型,释放内存空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值