深度学习halcon代码解析(接上文)

https://blog.youkuaiyun.com/m0_44975814/article/details/144260500

示例一:简单的自定义图像分类训练与测试(使用 Halcon 的浅层神经网络示例)

ddf252fc3d2c46f484af2d1c750dd6e1.webp

1. 数据准备阶段

首先假设你已经收集好了图像数据,并按照类别放在不同的文件夹下(例如 class1class2 等文件夹),且图像已经经过了合适的预处理(尺寸统一等)。

* 读取图像数据集路径
ImageDir := 'your_image_dataset_path'
Classes := ['class1', 'class2']  (* 定义类别名称列表 *)

* 初始化图像列表和标签列表
read_image (Images, ImageDir + '/**/*.png')  (* 根据实际图像格式修改扩展名 *)
Labels := []

* 为每张图像分配对应的类别标签
for Index := 0 to |Images| - 1 by 1
    Image := Images[Index]
    ClassIndex := find(Classes, get_image_class(Image))  (* 根据图像所在文件夹确定类别索引 *)
    Labels := [Labels, ClassIndex]
endfor

2. 模型创建与训练

创建一个简单的神经网络模型(这里只是示例一个简单结构,实际可根据需求调整),并进行训练。

* 创建一个神经网络模型
create_nn_classifier (NNHandle, 'mlp', 3, [20, 10], |Classes|)  (* 3层神经网络,隐藏层节点数示例为20和10,输出层节点数对应类别数 *)

* 设置训练参数
set_nn_param (NNHandle,'max_iterations', 100)  (* 最大迭代次数 *)
set_nn_param (NNHandle, 'learning_rate', 0.01)  (* 学习率 *)

* 训练模型
train_nn_classifier (NNHandle, Images, Labels)

3. 模型测试与分类

使用训练好的模型对新的图像进行分类预测。

* 读取测试图像
read_image (TestImage, 'test_image_path.png')  (* 替换为实际测试图像路径 *)

* 进行分类预测
classify_nn_classifier (NNHandle, TestImage, ClassProbabilities)
* 获取预测的类别(选择概率最大的类别)
PredictedClassIndex := arg_max(ClassProbabilities)
PredictedClass := Classes[PredictedClassIndex]
disp_message (WindowHandle, 'Predicted Class: ' + PredictedClass, 'window', 10, 10, 'black', 'true')

示例二:利用 Halcon 预训练模型进行目标分类(以图像分类任务为例)

1. 加载预训练模型

Halcon 提供了一些预训练好的模型,比如基于常见数据集训练的分类模型,这里以加载一个通用图像分类的预训练模型为例。

* 加载预训练的图像分类模型(假设模型格式支持且已下载好相关模型文件)
read_dl_model ('pretrained_model_path.dlmodel', DLModelHandle)  (* 替换为实际模型路径 *)

* 获取模型输入和输出层的名称等信息
get_dl_model_param (DLModelHandle, 'input_layer_names', InputLayerNames)
get_dl_model_param (DLModelHandle, 'output_layer_names', OutputLayerNames)

2. 准备测试图像并进行预处理

和前面类似,读取要分类的测试图像,并按照预训练模型要求的格式进行预处理(例如尺寸调整、归一化等)。

* 读取测试图像
read_image (TestImage, 'test_image.jpg')  (* 替换为实际测试图像路径 *)

* 进行图像预处理,假设预训练模型要求尺寸为224x224,归一化到[0,1]等,以下是示例代码实现这些操作
zoom_image_size (TestImage, PreprocessedImage, 224, 224, 'constant')
scale_image (PreprocessedImage, PreprocessedImage, 0, 1)

3. 使用预训练模型进行分类

将预处理后的图像输入到预训练模型中,获取分类结果并展示。

* 创建输入字典(按照模型输入要求组织数据)
create_dict (InputDict)
set_dict_object (PreprocessedImage, 'input_image', InputDict)

* 执行深度学习推理
execute_dl_model (DLModelHandle, InputDict, OutputDict)

* 从输出字典中获取分类概率等信息
get_dict_object (ClassProbabilities, OutputLayerNames[0], OutputDict)
* 获取预测的类别(选择概率最大的类别)
PredictedClassIndex := arg_max(ClassProbabilities)
* 假设你有对应的类别标签列表(此处可根据预训练模型对应的类别定义来设置)
Classes := ['cat', 'dog', 'bird',... ]  (* 根据实际类别补充完整 *)
PredictedClass := Classes[PredictedClassIndex]
disp_message (WindowHandle, 'Predicted Class: ' + PredictedClass, 'window', 10, 10, 'black', 'true')

示例三:基于深度学习的工业零部件分类应用示例

1. 数据采集与标注(假设已完成这一步骤,数据已整理好)

已经采集了工业生产线上不同零部件(比如螺丝、螺母、垫片等)的图像,并且对每张图像都准确标注了对应的零部件类别。

2. 模型配置与训练

这里采用适合工业图像分类的深度学习架构(例如基于卷积神经网络)进行模型训练,以下是简化的配置和训练代码示例。

* 创建卷积神经网络分类模型
create_dl_model (DLModelHandle, 'classification', 'your_model_architecture', [])  (* 根据实际选择合适架构,如ResNet等 *)

* 设置训练相关参数,如批次大小、迭代次数、学习率等
set_dl_model_param (DLModelHandle, 'batch_size', 32)
set_dl_model_param (DLModelHandle,'max_iterations', 500)
set_dl_model_param (DLModelHandle, 'learning_rate', 0.001)

* 加载整理好的训练数据集(图像和对应的标签)
load_dl_dataset ('training_dataset_path', Images, Labels)  (* 替换为实际数据集路径 *)

* 开始训练模型
train_dl_model (DLModelHandle, Images, Labels)

3. 模型在生产线上的实时应用

将训练好的模型部署到工业生产线上,对实时采集的零部件图像进行分类检测。

* 打开工业相机获取图像(这里假设已完成相机初始化等操作,以下是示例获取一帧图像)
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'your_camera_IP', 0, -1, AcqHandle)
grab_image (Image, AcqHandle)
close_framegrabber (AcqHandle)

* 对采集到的图像按照训练时的预处理要求进行处理(例如尺寸调整、归一化等)
preprocess_image (Image, PreprocessedImage)

* 创建输入字典用于模型输入
create_dict (InputDict)
set_dict_object (PreprocessedImage, 'input_image', InputDict)

* 执行深度学习推理
execute_dl_model (DLModelHandle, InputDict, OutputDict)

* 获取分类结果
get_dict_object (ClassProbabilities, OutputLayerNames[0], OutputDict)
PredictedClassIndex := arg_max(ClassProbabilities)
* 假设零部件类别有['screw', 'nut', 'washer']等
PartsClasses := ['screw', 'nut', 'washer']
PredictedPart := PartsClasses[PredictedClassIndex]

* 根据分类结果进行后续处理,比如将不同零部件分拣到不同区域等
if (PredictedPart =='screw')
    move_part_to_screw_bin()
elseif (PredictedPart == 'nut')
    move_part_to_nut_bin()
else
    move_part_to_other_bin()
endif

在完成模型的训练与测试后,我们可以对模型的性能进行多方面的数据分析。首先是准确率的计算,准确率是衡量模型分类正确的样本数占总样本数的比例。通过对测试集中大量样本的分类预测,并与真实标签进行对比,可以得到模型的准确率数值。例如,如果在 100 个测试样本中,模型正确分类了 80 个样本,那么准确率即为 80%。较高的准确率表明模型在该分类任务上具有较好的性能,能够较为可靠地对图像进行分类。

除了准确率,还可以分析模型的召回率和 F1 值。召回率反映了模型正确预测为正类的样本数占实际正类样本数的比例,对于多类别分类任务,可以分别计算每个类别的召回率。F1 值则是综合考虑准确率和召回率的一个指标,它能够更全面地评估模型在不同类别上的性能平衡。如果某个类别的召回率较低,可能意味着模型在识别该类别的样本时存在遗漏,需要进一步分析是数据不足、特征提取不充分还是模型结构的问题。

另外,还可以通过绘制混淆矩阵来直观地展示模型的分类结果。混淆矩阵的行表示真实类别,列表示预测类别,矩阵中的元素表示对应真实类别和预测类别的样本数量。通过观察混淆矩阵,可以清晰地看到模型在哪些类别之间容易发生混淆,例如,如果在某个分类任务中,类别 A 的样本经常被误分类为类别 B,那么就需要深入研究这两个类别在图像特征上的相似性以及模型为何难以区分它们,可能需要增加更多具有区分性的特征或者调整模型的参数以提高对这两个类别的分类能力。同时,还可以根据混淆矩阵计算每个类别的精确率,精确率是指模型预测为正类且实际为正类的样本数占模型预测为正类样本数的比例,它有助于进一步分析模型在不同类别上的预测准确性。

通过这些数据分析指标,可以全面地评估模型在实际应用中的性能表现,从而为模型的优化和改进提供有力的依据,以满足不同场景下对目标分类准确性和可靠性的要求。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值