网上看到Labview调用Halcon 的例子好少,有好多都是培训班的收费课程,交了钱还不一定能成功,所以想自己折腾一下,最新版的Halcon来做个猫狗分类玩一下。
下面是准备工作:
1. Halcon 23.11版本,必须64位系统,最好有显卡,不然训练超级慢。
2. MVTec Deep Learning Tool 23.11,这个是Halcon的标记工具,功能强大,非常好用。
在安装时建议点击为所有用户安装。
安装完成后会找到如下功能模块。
3. NI LabVIEW 2024 Q1 (64-bit),必须64位版本,18版以后应该都行。
Labview安装就不说了,不会的请问百度。
安装后桌面找到如下三个图标:
环境搭建好后可以下载我网盘的相关图片与训练模型。
链接: https://pan.baidu.com/s/1wZ5i8wIazTmmylDvqeLr4Q?pwd=ecrf 提取码: ecrf 复制这段内容后打开百度网盘手机App,操作更方便哦
如下图,test是用来测试的图片,train是用来训练的图像。其他三个分别是训练的模型文件与训练时的相关参数文件,还有一个评估报告。
一切准备好后开始用MVTec Deep Learning Tool 23.11训练自己的模型。
打开MVTec Deep Learning Tool 23.11后界面如下:
第一次运行会跳出如下对话框,勾选后续每次启动不跳出后点OK;
点击OK进入主页面,先选择右上角设置把菜单改为中文,英文还是不太习惯。
好了现在我们可以开始训练我们的第一个模型了。
1. 点击如下图,新建项目
2. 选择分类,然后项目名称,项目路径都根据需要设置一下。
3. 点击创建项目,确定后进入主界面。
4. 选择图像旁边那个资料夹图标,如下图选择到下载的图片资料夹train文件夹里面,你会看到两个分好类的照片资料夹,点击添加文件夹。
5. 跳出如下图所示页面,点击导入并标注图像。
6. 到这里图像打标签就完成了,总共找到25000个图像,
7. 可以在检查窗口对标签进行修改。
8. 点击拆分,创建拆分数据。
9. 如下,使用默认参数,70%训练,15%验证,15%测试,或者根据样本数来适当修改。
10. 创建成功后如下图。
11. 点击训练菜单,选择刚刚的拆分名称,并设置好相应的图像尺寸与增强参数。
12. 如果有GPU的电脑会在下面设备这里有选择。我这给破笔记本这个MX 250也能用来跑,就用它试试吧。
13. 点击开始训练,我这里出现了这个错误,批次大小应该不对,自动检测一下
14. 点击迭代次数旁边那个表,就是向车速度表那个玩意,最大只能31,之前是32,改回去试试。
15. 电脑太差,要几个小时,如果只是用来练习可以修改参数来缩短训练时间。
16. 可以看出来GPU的压力还是很大的,持续满负荷运行温度已经到达72度了。
17. 训练完成后先进行评估,如下可以看到准确率只有97,可已将迭代次数调整大一些,用好点的电脑来训练。
18. 导出模型,和生成报告。
19. 到这里我们就已经完成模型训练了,下面开始打开HALCON进行推理。
20. 点击左边第3个图标跳出如下实例程序,找到深度学习(分类),进入第四个例子。
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进行测试,能够顺利找到并显示就说明代码运行正常。
26. 原本打算一章写完的,慢慢一写发现太长了,还是分两章写算了,请关注我,第二章Labview重构推理部分马上上传。