性能优化——使用多线程加速Halcon深度学习算子

性能优化——使用多线程加速Halcon深度学习算子,第1张

可以用Halcon建立深度学习模型,并用到实际项目中。

流程大概是使用免费的 Halcon Deeplearing Label Tool制作模型后,导出成 hdl 文件,并在应用程序中用 ApplyDlClassifier 应用模型。

经过测试, ApplyDlClassifer 在第一次运行时,无论数据集有多大,执行时间在500ms左右(AMD 5800X + Nvidia P2200),能够明显感受到卡顿,而在第二次运行时,就感受不到卡顿。所以我考虑,在应用程序启动时,使用线程对模型进行预热。

预热听着高深,其实就是读取模型( ReadDlClassifier ) 并送入一张空白图。

下面演示我的做法:

21 封装一个自己的Application类

22 我将Halcon算子封装成一个单例类,并使用 getAlgorithmGlobalData 获得这个单例对象。 slotDoModelWarmUp 是这个单例类一个槽函数。

23 在 slotDoModelWarmUp 中开多线程,对模型进行预热。

我将Halcon深度学习算子要用到的变量封装成一个 context 结构体,放在单例类中。为了节约开销,我使用引用,直接获取这个单例对象。这样,在向线程中传参数时,需要一个 std::ref 。

线程函数如下:

classifierHandle 是一个引用变量,这使得我可以直接 *** 控单例类中的数据成员,而不是使用拷贝。

经过测试,在AMD 5800X + Nvidia P2200下,推理速度达到了1166ms。

双目立体视觉的研究一直是机器视觉中的热点和难点。使用双目立体视觉系统可以确定任意物体的三维轮廓,并且可以得到轮廓上任意点的三维坐标。因此双目立体视觉系统可以应用在多个领域。现说明介绍如何基于HALCON实现双目立体视觉系统,以及立体视觉的基本理论、方法和相关技术,为搭建双目立体视觉系统和提高算法效率。

双目立体视觉是机器视觉的一种重要形式,它是基于视差原理并由多幅图像获取物体三维几何信息的方法。双目立体视觉系统一般由双摄像机从不同角度同时获得被测物的两幅数字图像,或由单摄像机在不同时刻从不同角度获得被测物的两幅数字图像,并基于视差原理恢复出物体的三维几何信息,重建物体三维轮廓及位置。双目立体视觉系统在机器视觉领域有着广泛的应用前景。

HALCON是在世界范围内广泛使用的机器视觉软件。它拥有满足您各类机器视觉应用需求的完善的开发库。HALCON也包含Blob分析、形态学、模式识别、测量、三维摄像机定标、双目立体视觉等杰出的高级算法。HALCON支持Linux和Windows,并且可以通过C、C、C#、VisualBasic和Delphi语言访问。另外HALCON与硬件无关,支持大多数图像采集卡及带有DirectShow和IEEE1394驱动的采集设备,用户可以利用其开放式结构快速开发图像处理和机器视觉应用软件。

Halcon对三角形进行开运算的算子是"opening_shape"。它可以对二值图像中的三角形进行开运算 *** 作,即先进行腐蚀 *** 作,再进行膨胀 *** 作,用于去除小的噪点和连接不完整的三角形。

对于规则形状的识别,可以使用不同的特征值来描述不同的形状。对于圆形,可以使用圆形度(circularity)作为特征值,圆形度定义为轮廓面积除以其最小外接圆面积。而对于三角形,可以使用诸如边长、内角、周长、面积等特征值来描述。Halcon中可以使用函数"shape_features"来计算形状的特征值,该函数可以计算诸如面积、周长、中心、方向、最小外接矩形等多种特征值。

halcon的模板匹配可以归为三类:

1、基于灰度:灰度,互相关ncc

2、基于形状:形状,组件

3、基于描述符:描述匹配

应用场合:定位对象内部的灰度值没有大的变化,没有缺失部分,没有干扰图像和噪声的场合。

1创建模板:create_template()

2寻找模板:best_match()

3释放模板:clear_template()

应用场合:搜索对象有轻微的变形,大量的纹理,图像模糊等场合,速度快,精度低。

1创建模板:create_ncc_model()

2寻找模板:find_ncc_model(),find_ncc_models()

3释放模板:clear_ncc_model()

4get_ncc_model_region (ModelRegion, ModelID)

smallest_rectangle2 (ModelRegion, Row3, Column3, Phi, Length1, Length2)

应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合。

算法步骤:

1获取组件模型里的初始控件 gen_initial_components()

参数:

ModelImage [Input] 初始组件的

InitialComponents [Output] 初始组件的轮廓区域

ContrastLow [Input] 对比度下限

ContrastHigh [Input] 对比度上限

MinSize [Input] 初始组件的最小尺寸

Mode[Input] 自动分段的类型

GenericName [Input] 可选控制参数的名称

GenericValue [Input] 可选控制参数的值

2根据图像模型,初始组件,训练来训练组件和组件相互关系 train_model_components()

3创建组件模型 create_trained_component_model()

4寻找组件模型 find_component_model()

5释放组件模型 clear_component_model()

应用场合:定位对象内部的灰度值可以有变化,但对象轮廓一定要清晰平滑。

1创建形状模型:create_shape_model()

2寻找形状模型:find_shpae_model()

3释放形状模型:clear_shape_model()

应用场合:搜索对象有轻微的变形。

1创建模板:create_local_deformable_model()

2寻找模板:find_local_deformable_model()

3释放模板:clear_deformable_model()

应用场合:搜索对象有轻微的变形,透视的场合,根据一些描述点的位置和灰度值来进行匹配。

1创建模板:create_calib_descriptor_model()

2寻找模板:find_calib_descriptor_model()

3释放模板:clear_descriptor_model()

以上就是关于性能优化——使用多线程加速Halcon深度学习算子全部的内容,包括:性能优化——使用多线程加速Halcon深度学习算子、双目视觉三维点云获取要学习什么知识、halcon对三角形进行开运算的算子是什么,对规则形状进行识别,圆用圆形度,三角形应该用什么特征值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9559317.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存