性能优化——使用多线程加速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。

qt多次调用函数显示多张解决办法如下:

断开槽函数链接 只显示一遍;若要循环播放,改为 img_index=0 即可 } 三、资源 完整工程代码(vs2015/qt5100

前面总结了利用HALCON进行模板匹配的一些方法,讨论了利用物体形状的轮廓进行匹配的步骤和如何来优化匹配的速度,提高匹配的精度和速度,当然这两者之间本身也存在着制约,而在这两者之间找到一个适合自己要求的结合点,正是我们要研究和实验的。模板匹配并不是单纯的一个任务,它是一些其他工作的一个必备环节,比如物体识别、对象跟踪、检验产品、零件统计等等一些机器视觉应用。在很多情况下,模板匹配是个不错的选择。在前面总结模板匹配方法的基础上,利用HALCON做了一些视频对象跟踪的实验,并多次试验来调整程序参数优化跟踪过程,采用标准视频进行测试,将这些方法作了如下总结。

首先来看看HALOCN中的帧采集器(FrameGrabber),HDevelop提供这样一个函数来开启你采用的帧采集器(这里我的理解就是图像采集卡或工业摄像机)open_framegrabber(),这个函数中指定了HALCON目前支持的一些帧采集器的文件参数,主要有'BARRACUDA', 'BaumerFCAM', 'BCAM1394', 'BitFlow', 'DahengCAM', 'DahengFG', 'DFG-BW', 'DFG-LC', 'DirectFile', 'DirectShow', 'DT315x', 'DT3162', 'File', 'FireGrab', 'FirePackage', 'FlashBus', 'FlashBusMX', 'Ginga++', 'GingaDG', 'IDS', 'INSPECTA', 'Leutron', 'MatrixVision', 'MeteorII', 'mEnable3', 'MultiCam', 'Opteon', 'p3i2', 'p3i4', 'PT1000CL', 'PX', 'PXC', 'PXD', 'PXR', 'SaperaLT', 'TAG', 'TWAIN', 'uEye';除此之外,在官方网站上也在逐步推出新支持的一些采集卡,比如近期推出的支持大恒的DahengCAM的USB20接口(更多的信息请访问>

read_image (Winter, 'C:/Documents and Settings/All Users/Documents/My Pictures/示例/Winterjpg')

下面decompose3分离出R,G,B三个通道

decompose3(Winter, R, G, B)

trans_from_rgb得到H,S,V

trans_from_rgb(R, G, B, H, S, V, 'hsv')

在halcon中H,S,V都被量化为0~255,自己转化下就可以了

我们就说函数在x0点可微

仔细品味一下,当x趋向于x0时,o(x-x0)/(x-x0)趋向于0,

就是说当x趋向于x0时,f(x)-f(x0)=A(x-x0)+o(x-x0),o(x-x0)对函数增量的贡献远小于x-x0,因此函数在x0点

的性质可以用直线f(x)-f(x0)=A(x-x0)来讨论

由此可知A就是导数值,如果f(x)-f(x0)=A(x-x0)+o(x-x0)两边同除(x-x0),显然可以证明,可以知道可导就是可微,同样可微就是可导

1、灰度转换-->二值化(硬阈值或者动态阈值处理)-->连通区域-->抠图(reduce_domin)

2、创建一个与原始图像一样大小纯黑色的图像gen_image_const()

3、将抠图得到的目标图像与创建的纯黑图像拼接,union1()

4、运用for循环,遍历每个坐标,获取灰度值(get_grayval),将灰度值等于0的剔除,剩下的就是目标灰度值与对应的坐标。

比价原始的办法,不知道是否有更简单的方法

众所周知,二维码在网络上已经普及开来,由于他易于识别,信息量大,我们常常登陆微信网页版,支付的时候都需要进行二维码的扫描。而工业生产中,我们也常用二维码识别,如果自己开发二维码识别的话需要花大量的时间和经历,因此我们经常采用Halcon来进行调用。但是如果想进行二维码识别,首先要求是具有一定的对比度,其次二维码不能过小,最后互相之间不要连接起来。要采用白色底色,黑色块的组合,否则会产生误判。满足以上需求,我们就可以进行识别了。以下是Halcon的代码

read_image (Image, 'C:/Users/Administrator/Desktop/1tiff') //读取

create_data_code_2d_model ('QR Code', [], [], DataCodeHandle)//创建识别QR码模型

set_data_code_2d_param (DataCodeHandle, 'default_parameters', 'enhanced_recognition')//设置模型参数

find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)//进行识别,保存到DecodeDataStrings

代码非常简单,下面导出到C++的代码,方便我们嵌入到自己的软件中。结构都是一样的,只是调用了Halcon的头文件而函数而已。

#include <iostream>

#include "HalconCpph"

using namespace HalconCpp;

int main()

{

HObject ho_Image, ho_SymbolXLDs;

// Local control variables

HTuple hv_DataCodeHandle, hv_ResultHandles, hv_DecodedDataStrings;

ReadImage(&ho_Image, "C:/Users/Administrator/Desktop/1tiff");

CreateDataCode2dModel("QR Code", HTuple(), HTuple(), &hv_DataCodeHandle);

SetDataCode2dParam(hv_DataCodeHandle, "default_parameters", "enhanced_recognition");

FindDataCode2d(ho_Image, &ho_SymbolXLDs, hv_DataCodeHandle, HTuple(), HTuple(),

&hv_ResultHandles, &hv_DecodedDataStrings);

std::cout<<hv_DecodedDataStrings[0]S()<<std::endl;

system("pause");

return 0;

}

以上就是关于性能优化——使用多线程加速Halcon深度学习算子全部的内容,包括:性能优化——使用多线程加速Halcon深度学习算子、qt多次调用函数显示多张图片、基于HALCON的视频对象分割及跟踪方法总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9301722.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存