关于Halcon中variation_model模型的快速解读。

这篇具有很好参考价值的文章主要介绍了关于Halcon中variation_model模型的快速解读。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  十一期间在家用期间研读了下Halcon的variation_model模型,基本上全系复现了他的所有技术要求和细节,这里做个记录。

  其实这个模型的所有原理都不是很复杂的,而且Halcon中的帮助文档也讲的很是清楚,所以通过猜测、测试、编码基本能搞清楚是怎么回事。

  关于这个模型,Halcon里有如下十来个函数:

  create_variation_model、prepare_variation_model, train_variation_model、compare_variation_model、prepare_direct_variation_model、clear_variation_model, clear_train_data_variation_model, compare_ext_variation_model, get_thresh_images_variation_model, get_variation_model、 clear_train_data_variation_model, write_variation_model 。

  看起来涉及到了蛮多的东西的。

  那么一般的工作流程是:create_variation_model  ---> train_variation_model ---> prepare_variation_model  --->   compare_variation_model  ---> clear_variation_mode。

  即: 创建模型,然后训练模型,接着就是准备模型,这个时候就可以使用了,那么可以开始做输入比较了,比较完事了,清楚模型。 

  所谓的variation_model的模型呢,其实是从一系列已经确认是OK的样图中,训练出2幅结果图,即上限图和下限图,也可以认为是训练出图像公差带,当要进行比较的时候,就看输入的图像的每个像素是否位于这个公差带之类,如果是,则这个点是合格的,不是,则这个像素点就是不合格的区域。 

  那么在Halcon中,把这个工作就分解为了上面这一大堆函数。我们稍微来对每个函数做个解析。

  一、create_variation_model  创建模型。

  这个算子有如下几个参数:

      create_variation_model( : : Width, Height, Type, Mode : ModelID)

  这里主要是注意Type和Mode两个参数。  

  其中Type可以取'byte', 'int2', 'uint2' 这三种类型,我这里的解读是这个算子支持我们常用的8位灰度图像 和 16位的Raw图像, 16位因为有signed short和unsigned short,所有这里也有int2 和uint2两种类型。

  Mode参数有3个选择,: 'standard', 'robust', 'direct',这也是这个算子的灵魂所在,具体的做法后续再说,在创建时只是保存了他们的值,并没有做什么。

  那么创建的工作要做的一个事情就是分配内存,Halcon里的帮助文章是这样描述的:

  A variation model created with create_variation_model requires 12*Width*Height bytes of memory for Mode = 'standard' and Mode = 'robust' for Type = 'byte'. For Type = 'uint2' and Type = 'int2', 14*Width*Height are required. For Mode = 'direct' and after the training data has been cleared with clear_train_data_variation_model, 2*Width*Height bytes are required for Type = 'byte' and 4*Width*Height for the other image types.

  为什么是这样的内存,我们后续再说,接着看下一个函数。

  二、train_variation_model 训练模型

  这个算子是这个功能的最有特色的地方,他用于计算出variation_model 模型中的 ideal image和 variation image,即理想图像和方差图像。

  当Mode选择 'standard', 'robust'时,此算子有效,当Mode为'direct'无效。

  Mode为 'standard'时,训练采用求多幅平均值的方式获取理想图像以及对应的方差图像,Mode为 'robust'时,采用,求多幅图像的中间值的方式获取理想图像以及对应的方差图像。

  注意,这里的求均值和方差是针对同一坐标位置,不同图像而言的,而不是针对单一图像领域而言,这个概念一定不能能错了,比如训练5副图像,他们某一行的对应位置数据分别为:

       关于Halcon中variation_model模型的快速解读。

  当选择模式为 'standard',训练结果的 ideal image 值应该是(实际还需要四舍五入求整):     

         关于Halcon中variation_model模型的快速解读。

   当选择模式为 'robust',训练结果的 ideal image 值应该是:  

         关于Halcon中variation_model模型的快速解读。

   当选择'standard'模式,我们可以在找到一副OK图像的时候,单独把这幅图像的数据训练到variation_model模型,而如果使用'robust'方式,则必须一次性把所有的OK图像添加到训练模型中,无法动态的添加对象,但是,由于'robust'模式采用的是中值的方式,因此,其抗噪音效果要好很多。

  为什么'standard'模式可以随时添加,而'robust'只能一次性添加,其实这个也很简单,前一次求平均值的信息如果临时保存了,那么在新的OK图需要添加时,可以直接利用前一次的有关信息进行沟通,而如果是采用求中值的方式,前面的排序信息一是难以保存(数据量大),二是即使保存了,对本次排序的作用也不大。 

  这个时候我们停来下分析下前面Halcon文档里的提出的variation_model模型的内存占用大小,假如我们的Type是byte类型,使用'standard'模式,那么Ideal Image占用一份Width*Height字节内存,variation image必须是浮点类型的,占用 4 * Width*Height字节内存,另外,我们能随时添加新的OK的图像,应该还需要一个临时的int 类型的数据保存累加值(虽然Ideal Image保存了平均值,但是他是已经进行了取舍了, 精度不够),这需要额外的4 * Width*Height字节内存,后面我们提到variation_model还需要有2个width * height自己大小的内存用来保存上限和下限的图像数据,因此这里就有大概 1 + 4 + 4 + 2 = 11 * width * height的内存了,还差一个,呵呵,不知道干啥的了。 

  选择'robust'模式时, ideal image好说,就是取中间值,但是对于variation image,并不是普通的方差图像,在halcon中时这样描述的:The corresponding variation image is computed as a suitably scaled median absolute deviation of the training images and the median image at the respective image positions,实际上,他这里是计算的绝对中位差,即计算下面这个数的中间值了。       

         MAD=median(Xmedian(X))

  这个还需要举例说明吗????

  对于使用‘standard’模式的计算优化,也是有很多技巧的,不过这个应该很多人能掌握吧。但是如果是'robust'模式,直接写求中值的方法大家应该都会,但是因为这是个小规模大批量的排序和求中值的过程,其实是非常耗时的,比如W = 1000, H=1000,如果训练20副图像,那么就是1000*1000 = 100万个20个数字的排序,而且还涉及到到一个非常严重的cache miss问题。 即这20个数字的读取每次都是跨越很大的内存地址差异的。

  如何提高这个排序的过程,我觉得在这里指令集是有最大的优势的,他有两个好处,一是一次性处理多个字节,比如SSE处理16个字节,这样我也就可以一次性加载16个字节,整体而言就少了很多次cache miss,第二,如果我需要利用指令集,则我需要尽量的避免条件判断,因此,很多稍微显得高级一点的排序都不太合适,我需要找到那种固定循环次数的最为有效,比如冒泡排序,他就是固定的循环次数。

  对于N个图像的逐像素排序求中值,一个简单的C代码如下所示:

  关于Halcon中variation_model模型的快速解读。

  纯C代码的话,这个的效率绝对不是最高的,有很多优秀的排序算法都可以比这个快很多。但是他是最简单,也是最简洁的,最适合进行SIMD优化的。 看到中间的X循环了吗,那就是他主要的计算量所在,这个循环用指令集优化是不是很简单。

  有人说这个循环就是个典型的判断分支语句啊,你刚刚说要避免分支,这明显不就是个矛盾吗,那么我如果把这个循环这样写呢:

        关于Halcon中variation_model模型的快速解读。

 

  他们结果是不是一样,还有分支吗,好了,到这一步,后面的SIMD指令应该不需要我说怎么写了吧,_mm_min_epu8 + _mm_max_epu8。

  至于median absolute deviation的中值的计算,除了需要计算MAD值之外,其他有任何区别吗? MAD不恰好也可以用byte类型来记录吗,应该懂了吧。 

  三、prepare_variation_model 准备模型

     这个算子的有如下几个参数:

      prepare_variation_model( : : ModelID, AbsThreshold, VarThreshold : )

  这个算子实际上是根据前面的训练结果结合输入的 AbsThreshold和VarThreshold参数确定最终的上限和下限图像,即确认公差带。

  Halcon内部的计算公式为:

          关于Halcon中variation_model模型的快速解读。

   i(x,y)是前面得到的Ideal Image, v(x,y)为variation image,  au/al/bu/bl即为算子的输入参数。这个没有啥好说的,具体可以看Halcon的帮助文档。

  四、 compare_variation_model 比较模型

   算子原型为:    compare_variation_model(Image : Region : ModelID : )

  经过前面的一些列操作,我们的准备工作就完成了,现在可以用来进行检测了,检测的依据如下式:  

          关于Halcon中variation_model模型的快速解读。

   即在公差带内的图像为合格部分,否则为不合格部分。

  五、其他算子  

    clear_variation_model          --    删除模型数据,这个没啥好说的

    prepare_direct_variation_model    --    直接准备模型数据,这个在Mode设置为direct时有效,他无需经过训练,直接设置上下限数据,一般不使用

    clear_train_data_variation_model            --    清除训练数据,当我们训练完成后,那个Ideal Image 、variation image、临时数据等等都是没有用的了,都可以释放掉,只需要保留上下限的数据了。

   还有几个算子没有必要说了吧。 

  总的来说,这是个比较简单的算子,实际应用中可能还需要结合模版匹配等等定位操作,然后在映射图像等,当然也有特殊场合可以直接使用的。 

  我这里做了一个DEMO,有兴趣的朋友可以试用一下: https://files.cnblogs.com/files/Imageshop/Variation_Model.rar?t=1697790804&download=true

关于Halcon中variation_model模型的快速解读。

 

  

翻译

搜索

复制文章来源地址https://www.toymoban.com/news/detail-710915.html

到了这里,关于关于Halcon中variation_model模型的快速解读。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Training language models to follow instructions》论文解读--训练语言模型遵循人类反馈的指令

    目录 1摘要 2介绍 方法及实验细节 3.1高层次方法论 3.2数据集 3.3任务 3.4人体数据收集  3.5模型 3.6评价 4 结果 4.1 API分布结果 4.2公共NLP数据集的结果 4.3定性结果 问题 1.什么是rm分数 更多资料 使语言模型更大并不能使它们更好地遵循用户的意图。例如,大型语言模型可能生成不

    2024年01月24日
    浏览(51)
  • 关于线性模型的底层逻辑解读 (机器学习 细读01)

             线性回归是机器学习中 有监督机器学习 下的一种算法。 回归问题主要关注的是因变量(需要预测的值,可以是一个也可以是多个)和一个或多个数值型的自变量(预测变量)之间的关系。 需要预测的值:即目标变量, target ,y, 连续值预测变量 。 影响目标变量的因素

    2024年02月07日
    浏览(36)
  • 一个开源的大型语言模型LLaMA论文简单解读,LLaMA: Open and Efficient Foundation Language Models

    返回论文和资料目录 LLaMA 是 Meta AI 发布的包含 7B、13B、33B 和 65B 四种参数规模的基础语言模型集合,LLaMA-13B 仅以 1/10 规模的参数在多数的 benchmarks 上性能优于 GPT-3(175B),LLaMA-65B 与业内最好的模型 Chinchilla-70B 和 PaLM-540B 比较也具有竞争力。开源的代码在github上可以很方便获得

    2024年02月09日
    浏览(51)
  • 解读谷歌视频生成模型代表作:Lumiere A Space-Time Diffusion Model for Video Generation

    Diffusion Models视频生成-博客汇总 前言 :前段时间谷歌发布了基于LLMs的视频生成模型VideoPoet,这种信仰Transformers的做法就很Google。大家都以为2024年视频生成会是LLMs和SD两条路线之争,但是谷歌很快就发布了基于SD的视频生成模型Lumiere,这波直接偷家了?这篇博客详细解读Lum

    2024年02月19日
    浏览(40)
  • 3D Matching:实现halcon中的find_surface_model

            halcon中的三维匹配大致分为两类,一类是基于形状的(Shape-Based),一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体,3D物体模型必须是CAD模型,且几何边缘清晰可见,使用的相机也要预先进行校准。基于表面的匹配可用于3D场景中

    2024年04月11日
    浏览(43)
  • LLMs之llama_7b_qlora:源代码解读export_hf_checkpoint.py(模型权重合并文件)将LORA模型的权重合并回原始模型的权重(hf_llama_model+llama_

    LLMs之llama_7b_qlora:源码解读export_hf_checkpoint.py模型权重合并文件)将LORA模型的权重合并回原始模型的权重(hf_llama_model+llama_7b_qlora),并保存到指定的检查点文件中 目录

    2024年02月15日
    浏览(62)
  • HALCON visualize_object_model_3d 算子原理的理解以及使用HSmartWindowControlWPF重实现

    1. 参数说明 WindowHandle:显示点云的窗口句柄 ObjectModel3D:待显示的点云对象 CamParam:相机内参 此处的相机指的是一个虚拟相机,为观察点云提供一个视角,如下图,点云在一个场景坐标系中(SCS),我们在WindowHandle中看到的点云效果就是通过此虚拟相机看到的点云 该值可以

    2024年02月14日
    浏览(81)
  • 使用HALCON标定板快速标定,纠正成像畸变

    gen_caltab ( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : ) 为具有矩形排列标记的标定板生成标定板描述文件和相应的后记文件。 该算子可以制作所需的标定板参数文件 Caltab.descr 和标定板图像文件 Caltab.ps。 参数: 输入: XNum X方向的标记点数。 默认值:7 建议值:5、

    2024年02月13日
    浏览(43)
  • Halcon读取3D模型

    Halcon 加载3D模型算子 read_object_model_3d 从文件加载点云模型,返回模型句柄 支持格式: “om3” halcon自定义格式 “dxf” ASCII 类型CAD文档 “off” Object格式 仅支持ASCII类型 不支持binary类型 “ply” 支持ASCII和binary格式 ‘obj’ 是一个ASCII格式 可存储点、轮廓、法向、纹理等 stl’,

    2024年02月05日
    浏览(33)
  • 【AI绘图学习笔记】Latent Diffusion Model(上)——论文解读

    gihub代码 论文-Arxiv-High-Resolution Image Synthesis with Latent Diffusion Models 参考视频:【渣渣讲课】试图做一个正常讲解Latent / Stable Diffusion的成年人 中文翻译论文(这篇翻译得很好) 我们来看一些主要的生成模型: 第一个GAN生成对抗网络,可以分为判别器和生成器两个部分,总体思想

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包