Labview 调用Halcon的深度学习实现猫狗分类(第一章Halcon训练加推理)

 

网上看到Labview调用Halcon 的例子好少,有好多都是培训班的收费课程,交了钱还不一定能成功,所以想自己折腾一下,最新版的Halcon来做个猫狗分类玩一下。

下面是准备工作:

1. Halcon 23.11版本,必须64位系统,最好有显卡,不然训练超级慢。

eafe1ff51f1243039dc3dc7b2aa285f6.png

2. MVTec Deep Learning Tool 23.11,这个是Halcon的标记工具,功能强大,非常好用。

在安装时建议点击为所有用户安装。

95e67b6c7dd84269935a68dba53f6105.png

安装完成后会找到如下功能模块。

1b27f618345544408365eb023a1a307b.png

3. NI LabVIEW 2024 Q1 (64-bit),必须64位版本,18版以后应该都行。

Labview安装就不说了,不会的请问百度。

安装后桌面找到如下三个图标:

f9350224718f44619a9b61f7271021d5.png

环境搭建好后可以下载我网盘的相关图片与训练模型。

链接: https://pan.baidu.com/s/1wZ5i8wIazTmmylDvqeLr4Q?pwd=ecrf 提取码: ecrf 复制这段内容后打开百度网盘手机App,操作更方便哦

如下图,test是用来测试的图片,train是用来训练的图像。其他三个分别是训练的模型文件与训练时的相关参数文件,还有一个评估报告。

38a5f370f1d140b2ab2b0f9cb57ac5a5.png

一切准备好后开始用MVTec Deep Learning Tool 23.11训练自己的模型。

打开MVTec Deep Learning Tool 23.11后界面如下:

第一次运行会跳出如下对话框,勾选后续每次启动不跳出后点OK;

48758d17269344e88a01c07b14c2ef0c.png

点击OK进入主页面,先选择右上角设置把菜单改为中文,英文还是不太习惯。

abd4cf3a3cdf4330be18fddbf0a05b37.png

dd852a80166c42a88dcb7847643effed.png

好了现在我们可以开始训练我们的第一个模型了。

1. 点击如下图,新建项目

2b91cab9d50d412bab157a8c86673b62.png

2. 选择分类,然后项目名称,项目路径都根据需要设置一下。

9b34e3c715cc4547925fc8060dc86546.png

3. 点击创建项目,确定后进入主界面。

53a2c73b231e49899b2736f7cef4c8e1.png

4. 选择图像旁边那个资料夹图标,如下图选择到下载的图片资料夹train文件夹里面,你会看到两个分好类的照片资料夹,点击添加文件夹。

e2b17e337e0c4fbbbaba0b438110e093.png

5. 跳出如下图所示页面,点击导入并标注图像。

9e20a287e6214636a5f5bf740f27e2fa.png

6. 到这里图像打标签就完成了,总共找到25000个图像,

6ffd8d26aeb347ac9b0c21bc0f2957eb.png

7. 可以在检查窗口对标签进行修改。

bd79327f2cec49469dd4565473985fc0.png

8. 点击拆分,创建拆分数据。

7fe71abef6374ebd8a98ecfff4a507fc.png

9. 如下,使用默认参数,70%训练,15%验证,15%测试,或者根据样本数来适当修改。

031c1f1bc0c949fe9e3d844aead876b2.png

10. 创建成功后如下图。

6162c261c7234778b9a29cafa38b2152.png

11. 点击训练菜单,选择刚刚的拆分名称,并设置好相应的图像尺寸与增强参数。

c3c878aaf9564a4dbf4cfd2127ce1c27.png

12. 如果有GPU的电脑会在下面设备这里有选择。我这给破笔记本这个MX 250也能用来跑,就用它试试吧。

d28cefc2357e4e24b7502495cf16b697.png

27659596658d436eb54aede25a118ea2.png

13. 点击开始训练,我这里出现了这个错误,批次大小应该不对,自动检测一下

efd68a10739c42af831024930ea5e17d.png

14. 点击迭代次数旁边那个表,就是向车速度表那个玩意,最大只能31,之前是32,改回去试试。

fc3d77a8cf474048b12cff07d5bcc841.png

15. 电脑太差,要几个小时,如果只是用来练习可以修改参数来缩短训练时间。

e4b074fa3eaf45c7bc7580b83fdd99b6.png

16. 可以看出来GPU的压力还是很大的,持续满负荷运行温度已经到达72度了。

575809b004534532a96902e337533a61.png

17. 训练完成后先进行评估,如下可以看到准确率只有97,可已将迭代次数调整大一些,用好点的电脑来训练。

2aa578586d5a4911913395038a2585f9.png

18. 导出模型,和生成报告。

f3578460e03f46a9b4b5b17bafae5043.png

4eb06cf20ae44b65a5abded4216ba0c8.png

 

28003625e91a425bb901013290e3d229.png

19. 到这里我们就已经完成模型训练了,下面开始打开HALCON进行推理。

a079a773188f49858ff5fe4aad3ec7bf.png

20. 点击左边第3个图标跳出如下实例程序d5cc09c2e17248a8b4b966bffbf8867e.png,找到深度学习(分类),进入第四个例子。

8f0bb4d60c8841a0823d59f64d26b174.png

21. 这个例子是药丸分类,我们第一步需要先另存一份这份程序,我另存为猫狗分类,然后打开这个备份的程序,然后删掉不需要部分,其中有两个Halcon的库封装函数需要重构,如下。

    *生成 DLSampleBatch.
    *gen_dl_samples_from_images (ImageBatch, DLSampleBatch)
    * 
    *预处理 DLSampleBatch.
    *preprocess_dl_samples (DLSampleBatch, DLPreprocessParam)

22. 重构代码如下,这段代码的作用就是先将训练模型中的参数读出来,然后设置送人图片。

*读取创建的模型文件。
read_dl_model (RetrainedModelFileName, DLModelHandle)
* 
*设置批次大小。
set_dl_model_param (DLModelHandle, 'batch_size', 32)
* 
*读取设备硬件信息,主要判断是否有显卡,用第几张显卡进行推理。
query_available_dl_devices (['runtime', 'runtime'], ['gpu', 'cpu'], DLDeviceHandles)
get_dl_device_param (DLDeviceHandles, 'type', [cpu_gpu])
DLDevice := DLDeviceHandles[0]
*
*初始化模型以进行推理。
set_dl_model_param (DLModelHandle, 'device', DLDevice)
*
*设置CPU设备以进行推理。
set_dl_model_param (DLModelHandle, 'runtime', cpu_gpu[0])
* 
*从模型中获取标签类名和ID。
get_dl_model_param (DLModelHandle, 'class_names', ClassNames)
get_dl_model_param (DLModelHandle, 'class_ids', ClassIDs)
* 
*获取用于预处理的参数。
read_dict (PreprocessParamFileName, [], [], DLPreprocessParam)
*读取批次的图像。
read_image (ImageBatch, Batch)
* 
*生成 DLSampleBatch.
*gen_dl_samples_from_images (ImageBatch, DLSampleBatch)
* 
*预处理 DLSampleBatch.
*preprocess_dl_samples (DLSampleBatch, DLPreprocessParam)
*
*查询模型设置参数,包含图像尺寸,图像灰度。
get_dict_tuple (DLPreprocessParam, 'image_width', TupleW)
get_dict_tuple (DLPreprocessParam, 'image_height', TupleH)
get_dict_tuple (DLPreprocessParam, 'image_range_max', image_max)
get_dict_tuple (DLPreprocessParam, 'image_range_min', image_min)
    
*将图片缩放到网络model需求的大小
zoom_image_size (ImageBatch, ImageBatch, TupleW, TupleH, 'constant')   
     
*将图像转换为32位图像
convert_image_type (ImageBatch, ImageBatch, 'real')
    
*灰度值增强    
scale_image (ImageBatch, ImageBatch, image_max, image_min) 
    
*创建一个新的空字典
create_dict (DLSampleBatch)
    
*向字典中添加图像,将ImageBatch添加到字典DLSampleBatch中去
set_dict_object (ImageBatch, DLSampleBatch, 'image')   
   
*如果图片不是三通道图,就需要将图像合成三通道图
count_channels (ImageBatch, Channel)
if (Channel != 3)
   compose3(ImageBatch, ImageBatch, ImageBatch, ImageBatch)
endif
    
* 加载模型和图像开始推理
apply_dl_model (DLModelHandle, DLSampleBatch, [], DLResultBatch)

23. 重构后就可以开始测试刚刚生成的模型了,完整代码如下,将下面代码复制到Halcon就可以还原推理过程了。

*默认情况下,此示例使用由MVTec预训练的模型,变量设置为false。
dev_update_off ()
* 
* 
**************************************************
*           **设置推理的路径和参数**               *
**************************************************
* 
*在这个例子中,我们从文件中读取图像。

ImageDir := 'E:/深度学习/test'
* 
*设置重新训练的模型的路径和相应的预处理参数。

PreprocessParamFileName := 'E:/深度学习/LABVIEW运行库/model_猫狗分类_opt_dl_preprocess_params.hdict'
RetrainedModelFileName  := 'E:/深度学习/LABVIEW运行库/model_猫狗分类_opt.hdl'
* 
* 
* ************************
* **   Inference推理   ***
* ************************
* 
*读取创建的模型文件。
read_dl_model (RetrainedModelFileName, DLModelHandle)
*  
*读取设备硬件信息,主要判断是否有显卡,用第几张显卡进行推理。
query_available_dl_devices (['runtime', 'runtime'], ['gpu', 'cpu'], DLDeviceHandles)

* 初始化参数元组
type_group := []
name_group := []
conversion_group := []

*读取硬件配置
for Index := 0 to |DLDeviceHandles|-1 by 1
    get_dl_device_param(DLDeviceHandles[Index], 'type', type_name)
    get_dl_device_param(DLDeviceHandles[Index], 'name', name_name)
    get_dl_device_param(DLDeviceHandles[Index], 'conversion_supported', conversion_name)
    
    type_group[Index] := type_name[0]
    name_group[Index] := name_name[0]
    conversion_group[Index] := conversion_name[0]

endfor

*设置CPU设备以进行推理。
set_dl_model_param (DLModelHandle, 'runtime',type_group[0])
*
*设置批次大小。
set_dl_model_param (DLModelHandle, 'batch_size', 32)
*
*从模型中获取标签类名和ID。
get_dl_model_param (DLModelHandle, 'class_names', ClassNames)
get_dl_model_param (DLModelHandle, 'class_ids', ClassIDs)
* 
*获取用于预处理的参数。
read_dict (PreprocessParamFileName, [], [], DLPreprocessParam)
* 
*创建用于显示结果的窗口词典。
WindowHandleDict := dict{}
*使用显示所需的数据集参数创建字典。
DLDataInfo := dict{class_names: ClassNames, class_ids: ClassIDs}
*设置可视化的通用参数。
GenParam := dict{scale_windows: 1.1}
* 
*读取文件夹所有文件名称
list_image_files (ImageDir, 'default', 'recursive', ImageFilesAll)
*排序文件名称
*tuple_shuffle (ImageFilesAll, ImageFilesAll)
*提取前一百个文件名
NumSamples := 10
ImageFiles := ImageFilesAll[0:NumSamples - 1]
* 
*在批量大小为BatchSizeInference的所有图像上循环进行推理。
BatchSizeInference := 1
for BatchIndex := 0 to floor(|ImageFiles| / real(BatchSizeInference)) - 1 by 1
    * 
    *获取批次图像的路径。
    Batch := ImageFiles[BatchIndex * BatchSizeInference:(BatchIndex + 1) * BatchSizeInference - 1]
    *读取批次的图像。
    read_image (ImageBatch, Batch)
    * 
    *生成 DLSampleBatch.
    *gen_dl_samples_from_images (ImageBatch, DLSampleBatch)
    * 
    *预处理 DLSampleBatch.
    *preprocess_dl_samples (DLSampleBatch, DLPreprocessParam)
    *
    *查询模型设置参数,包含图像尺寸,图像灰度。
    get_dict_tuple (DLPreprocessParam, 'image_width', TupleW)
    get_dict_tuple (DLPreprocessParam, 'image_height', TupleH)
    get_dict_tuple (DLPreprocessParam, 'image_range_max', image_max)
    get_dict_tuple (DLPreprocessParam, 'image_range_min', image_min)
    
    *将图片缩放到网络model需求的大小
    zoom_image_size (ImageBatch, ImageBatch, TupleW, TupleH, 'constant')   
     
    *将图像转换为32位图像
    convert_image_type (ImageBatch, ImageBatch, 'real')
    
    *灰度值增强    
    scale_image (ImageBatch, ImageBatch, image_max, image_min) 
    
    *创建一个新的空字典
    create_dict (DLSampleBatch)
    
    *向字典中添加图像,将ImageBatch添加到字典DLSampleBatch中去
    set_dict_object (ImageBatch, DLSampleBatch, 'image')   
   
    *如果图片不是三通道图,就需要将图像合成三通道图
    count_channels (ImageBatch, Channel)
    if (Channel != 3)
        compose3(ImageBatch, ImageBatch, ImageBatch, ImageBatch)
    endif
    
    * 加载模型和图像开始推理
    apply_dl_model (DLModelHandle, DLSampleBatch, [], DLResultBatch)
    
    * 
    *后处理和可视化,后面部分主要用于halcon显示用,仅用于调试代码,其他平台重构可不需要这部分。
    *在批次中的每个样品上循环。
    for SampleIndex := 0 to BatchSizeInference - 1 by 1
        * 
        * 获取样本并根据结果。
        DLSample := DLSampleBatch[SampleIndex]
        DLResult := DLResultBatch[SampleIndex]
        * 
        * 显示结果和文本。
        dev_display_dl_data (DLSample, DLResult, DLDataInfo, 'classification_result', GenParam, WindowHandleDict)
        WindowHandles := WindowHandleDict.classification_result
        dev_set_window (WindowHandles[0])
        set_display_font (WindowHandles[0], 16, 'mono', 'true', 'false')
        dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
        stop ()
    endfor
endfor

* 
* 关闭用于可视化的窗口。
dev_close_window_dict (WindowHandleDict)
* 

24. 记得修改如下面几个地方的路径。

**测试图片存放路径

ImageDir := 'E:/深度学习/test'

**模型存放路径
ExampleDataDir := 'E:/深度学习'

**模型名称和名称参数名称
PreprocessParamFileName := 'model_猫狗分类_opt_dl_preprocess_params.hdict'
RetrainedModelFileName  := 'model_猫狗分类_opt.hdl'

 

25. 到这里就完成HALCON代码的重建了,先按F5进行测试,能够顺利找到并显示就说明代码运行正常。

f08cf9827b8c48c7871931aeeb135f1b.png

26. 原本打算一章写完的,慢慢一写发现太长了,还是分两章写算了,请关注我,第二章Labview重构推理部分马上上传。

 

 

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用Halcon的HDevEngine接口在LabVIEW调用Halcon深度学习功能。具体步骤如下: 1. 在LabVIEW中创建一个VI。 2. 在VI中添一个ActiveX控件,选择Halcon的HDevEngine控件。 3. 在VI中使用LabVIEW的代码调用Halcon的HDevEngine接口,可以使用HDevEngine的RunScript函数来执行Halcon深度学习代码。 4. 在Halcon深度学习代码中,可以使用Halcon的DeepLearningTrain和DeepLearningClassify函数来训练分类图像。 需要注意的是,调用Halcon深度学习功能需要先安装Halcon并且拥有相应的许可证。此外,深度学习的算法也需要相应的硬件支持。 ### 回答2: 在LabVIEW调用Halcon深度学习的方法是通过使用Halcon的外部编程接口(API)来实现的。以下是基本的步骤: 1. 首先,将Halcon的库文件(DLL文件)添LabVIEW项目中。在LabVIEW中,点击“工具”->“向导”->“DLL导入”,然后选择Halcon的DLL文件。 2. 在LabVIEW中创建一个调用外部库函数的VI(虚拟仪器)。在VI中,使用“Call Library Function”节点来调用Halcon提供的特定函数。 3. 调用Halcon深度学习功能的函数可以根据具体需求选择。例如,可以调用Halcon提供的函数来训练好的深度学习网络、进行图像预处理、执行图像分类、目标检测等操作。 4. 在调用Halcon的函数之前,需要根据函数的参数和返回值类型设置“Call Library Function”节点的输入和输出参数。 5. 在LabVIEW中,可以使用其他节点来处理和显示Halcon返回的结果。例如,可以使用显示图像的节点来显示检测到的目标,或者使用文本框节点来显示分类结果。 需要注意的是,LabVIEW是一种图形化编程语言,因此可以通过将节点连接在一起来构建功能流程,而不是使用传统的代码编写方法。 此外,需要了解Halcon的使用方法和深度学习相关的知识,以便正确地使用Halcon的函数和算法。 总之,LabVIEW调用Halcon深度学习的写法涉及到添Halcon库文件、创建调用外部库函数的VI、调用Halcon的特定函数并处理结果。这需要对LabVIEWHalcon的使用有一定的了解。 ### 回答3: 在LabVIEW调用Halcon深度学习库可以通过以下步骤进行: 1. 首先,确保已经安装了HalconLabVIEW。 2. 在LabVIEW中创建一个新的VI(Virtual Instrument)。 3. 在Block Diagram(方框图)中右键单击,选择"Import ActiveX Control"(导入ActiveX控件)。 4. 在弹出的对话框中,选择Halcon的ActiveX 控件,点击OK。 5. 这将在Block Diagram中生成一个ActiveX 控件。 6. 双击这个ActiveX控件,会打开Halcon的图像处理界面。在该界面中,可以调用Halcon深度学习的相关方法。 7. 通过使用Halcon深度学习方法,可以进行图像分类、目标检测等任务。 8. 将Halcon的图像处理结果传递给LabVIEW的其他模块或控件,以便进行后续的数据处理和显示。 需要注意的是,LabVIEWHalcon之间的数据传递可以通过LabVIEW提供的数据类型进行。例如,可以使用数组或图像数据类型作为输入和输出参数。 通过上述步骤,可以在LabVIEW调用Halcon深度学习库进行图像处理任务。这样可以充分利用Halcon强大的深度学习功能,并通过LabVIEW的可视化编程环境进行更灵活和便捷的图像处理流程设计和数据分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值