Halcon 深度学习初探

什么是深度学习?

深度学习是一系列机器学习的方法集合,其算法结构类似于多层级的神经网络。通过对大量的训练样本图像的学习,提取其各个层次的特征,使网络具有判别和推理能力。

关于halcon中的深度学习:

自halcon17版本开始,halcon就引用了深度学习这一技术应用到图像处理中,为机器视觉行业提升了一个很大的空间和解决方法。

halcon引用这个深度学习技术在halcon中它也是一个黑箱的,只要把模型需要的数据给到即可,使用步骤如下(安装步骤以及环境需要就不提了):

1、准备网络和数据
(1)、读取halcon自带的网络模型

  (2)、明确网络需求(3)、数据预处理(4)、数据集分割

以halcon17来说,halcon自带有两个网络模型,分别是:

pretrained_dl_classifier_compact.hdl

pretrained_dl_classifier_enhanced.hdl

按照halcon官方文档解释说这两种模型,前者相对于后者要简单很多(网络结构上),后者网络结构比较复杂能适用于较为复杂的训练和判断,然后在消耗上后者代价大于前者。

关于这两个模型对数据的要求可以通过get_dl_classifier_param算子查看:

*读取网络模型
read_dl_classifier ('pretrained_dl_classifier_compact.hdl', DLClassifierHandle)
*读取网络需要的图片大小
get_dl_classifier_param (DLClassifierHandle, 'image_width', DlImageWidth)
get_dl_classifier_param (DLClassifierHandle, 'image_height', DlImageHeight)
*读取网络需要的图片通道数
get_dl_classifier_param (DLClassifierHandle, 'image_num_channels', DlNumChannels)
*读取网络需要的图片灰度值范围
get_dl_classifier_param (DLClassifierHandle, 'image_range_min', DlRangeMin)
get_dl_classifier_param (DLClassifierHandle, 'image_range_max', DlRangeMax)

这样一来我们的训练样本图就要做一个预处理,把每个样本图才处理成224*224分辨率、3通道、-127到128亮度级图像。

halcon也提供了一个算子将样本图预处理成满足要求的样本图:preprocess_dl_fruit_example。不过这个算子是有很大局限的,也可以采用下面方法:

for I := 0 to |RawImageFiles| - 1 by 1*读取样本文件read_image (Image, RawImageFiles[I])*将图片缩放到网络model需求的大小zoom_image_size (Image, Image, DlImageWidth, DlImageHeight, 'constant')*将图像的灰度缩放成网络model需求范围convert_image_type (Image, Image, 'real')RescaleRange:=(DlRangeMax - DlRangeMin)/255.0scale_image (Image, Image, RescaleRange, DlRangeMin)*合成三通道图片count_obj (Image, Number)for Index := 1 to Number by 1select_obj (Image, ObjectSelected, Index)count_channels (ObjectSelected, Channel)*如果图片不是三通道图,就需要将图像合成三通道图if (Channel != DlNumChannels)compose3(ObjectSelected, ObjectSelected, ObjectSelected, ThreeChannelImage)*替换图元数组replace_obj (Image, ThreeChannelImage, Image, 1)endifendfor* Write preprocessed image to hobj file.write_object (Image, ObjectFilesOut[I])endfor
read_dl_classifier_data_set (PreprocessedFolder, 'last_folder', ImageFiles, Labels, LabelsIndices, Classes) **拆分数据集**
*训练占比
TrainingPercent := 70 
*验证占比
ValidationPercent := 15 
*将数据分割成三大块,分别为:训练集(TrainingImages, TrainingLabels)、验证集(ValidationImages, ValidationLabels)、测试集(TestImages, TestLabels)
split_dl_classifier_data_set (ImageFiles, Labels, TrainingPercent, ValidationPercent, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, TestImages, TestLabels) 
stop ()

最后可将这些预处理好的文件写出hobj文件保存到外部文件备,也可以通过split_dl_classifier_data_set算子将数据集分割成:训练集、验证集、测试集三份,分别会在后续步骤中使用到。

2、训练网络并评估训练过程
(1)、设置适合训练需要的网络参数

(2)、对数据进行增强和扩充(3)、开始训练并对训练过程进行评估

超参数是一种人为设置的超参数,它不同于网络模型参数可以在训练中进行评估和优化。也可以理解成为了干预这个“黑盒”过程而暴露出的必要参数,比如说’batch_size’的值决定了学习过程输入的每批次的数据量。

设置好超参数后可以直接使用到halcon提供的 train_fruit_classifier 算子,这个算子内部包括了训练过程以及将训练好的模型序列化到外部。

**设置超参数**
set_dl_classifier_param (DLClassifierHandle, 'classes', Classes) BatchSize := 64
set_dl_classifier_param (DLClassifierHandle, 'batch_size', BatchSize) try *初始化网络模型set_dl_classifier_param (DLClassifierHandle, 'runtime_init', 'immediately') 
catch (Exception) dev_disp_error_text (Exception) stop () 
endtry *学习率
InitialLearningRate := 0.001 
set_dl_classifier_param (DLClassifierHandle, 'learning_rate', InitialLearningRate) *学习率变化参数
LearningRateStepEveryNthEpoch := 30 
LearningRateStepRatio := 0.1 *迭代次数
NumEpochs := 50 **训练分类器**
dev_clear_window () 
* 每次迭代的间隔,它会体现在学习过程中的图标上的‘x’轴
PlotIterationInterval := 100 
*将训练好的网络模型序列化
FileName := 'classifier_minist.hdl' 
*训练模型
train_fruit_classifier (DLClassifierHandle, FileName, NumEpochs, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, LearningRateStepEveryNthEpoch, LearningRateStepRatio, PlotIterationInterval, WindowHandle) 
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) *清除网络句柄
clear_dl_classifier (DLClassifierHandle) 
stop ()

为了验证训练结果即评估网络的性能如何,可以观察不同的样本对训练过程的影响。调整learning_rate(学习率)和momentum(动量)两个参数,可以观察迭代过程中错误率和学习率的变化情况。如果知道图像的实际标注信息,可以与网络模型的预测结果做对比,得到正样本与负样本的预测正确率。

或者直接观察反馈图像是否 欠拟合 和 过拟合 。首先,一个网络在学习过程中遇到新的样本时的学习能力称为泛化。好的网络模型泛化性能良好,可以在实际检测中对新样本进行良好的预测。因此在评价网络性能时,泛化能力是一个重要的考量,由此有两个术语:欠拟合和过拟合。

欠拟合,一般是因为训练样本的不足等原因产生的,导致模型在训练集上的误差较大(错误率高)。可以通过增加训练样本或增加特征维度解决。

过拟合,一般是因为模型过度学习了训练样本,导致泛化能力变差,在遇到新的样本上表现较差。过度学习有可能学习过多的特征,甚至把样本的噪声等细节也当成特征。

过拟合的曲线通常表现为以下式样(错误率下降一定程度后急剧上升):

错误率随迭代次数的变化
3、应用网络与评估网络
混淆矩阵

*读取序列化网络模型
read_dl_classifier (FileName, DLClassifierHandle) 
*计算混淆矩
get_error_for_confusion_matrix (ValidationImages, DLClassifierHandle, Top1ClassValidation)
*生成混淆矩模型
gen_confusion_matrix (ValidationLabels, Top1ClassValidation, [], [], WindowHandle, ConfusionMatrix)
dev_disp_text ('Validation data', 'window', 'top', 'left', 'gray', 'box', 'false')
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
*清除混淆矩句柄
clear_matrix (ConfusionMatrix)
dev_clear_window ()
clear_dl_classifier (DLClassifierHandle)

混淆矩阵的含义:如果知道图像的实质标注信息,可以与网络模型的预测结果进行对比,得出正样本与负样本的预测正确率。混淆矩阵就是这样一种直观地显示判断结果的工具。

在halcon中,混淆矩阵的每一列代表原图像的真实分类,每一行表示网络预测的结果。混淆矩阵显示了以下分类结果:

1、真正列(TP):属于某类并被预测为某类

2、假正列(FP):不属于某类却被预测为某类

3、真反列(TN):不属于某类,也没被预测为某类

4、假反列(FN):属于某类,却被预测为不属于某类

于是结合反馈的混淆矩阵数据我们可以计算出 精度、召回率、F-Score,它们的公式分别是:

精度=TP/(TP+FP);

召回率=TP/(TP+FN);

F-Score=2(精度*召回率) / (精度+召回率)

从0的分类器上看,TP=44;FP=0;FN=1 => 精度=1;召回率≈0.977

从1的分类器上看,TP=44;FP=0;FN=1 => 精度=1;召回率≈0.977

从2的分类器上看,TP=41;FP=2;FN=4 => 精度≈0.953;召回率≈0.911

。。。

如果一个分类器具有高精度、低召回率,那么该分类器可能识别出了很少的正样本,但是这些正样本的正确率很高;相反,如果该分类器具有低精度、高召回率,那么该分类器能识别出大部分的正样本,但是这些正样本的结果也可能包含了很多误识别的负样本。所以,一个理想的情况是:分类器实现高精度、高召回率。

4、实际检测
注意,当我们把要识别的图片给到之前训练好的模型中去的时候也需要将图片预处理成模型需要的类型和大小,否则报错。

*读取训练好的模型
read_dl_classifier (FileName, DLClassifierHandle)*限制每次识别图像为1个
set_dl_classifier_param (DLClassifierHandle, 'batch_size', 1)
* 初始化网络环境
set_dl_classifier_param (DLClassifierHandle, 'runtime_init', 'immediately')
* 
dev_resize_window_fit_size (0, 0, WindowWidth, WindowHeight, -1, -1)set_display_font (WindowHandle, 30, 'mono', 'true', 'false')for Index := 0 to 10 by 1ImageFile := RawImageFiles[floor(rand(1) * |RawImageFiles|)]read_image (Image, ImageFile)*将图片缩放到网络model需求的大小zoom_image_size (Image, Image, DlImageWidth, DlImageHeight, 'constant')*将图像的灰度缩放成网络model需求范围convert_image_type (Image, Image, 'real')RescaleRange:=(DlRangeMax - DlRangeMin)/255.0scale_image (Image, Image, RescaleRange, DlRangeMin)count_channels (Image, Channel)*如果图片不是三通道图,就需要将图像合成三通道图if (Channel != DlNumChannels)compose3(Image, Image, Image, Image)endif*使用已经训练号的深度学习网络识别一组图像apply_dl_classifier (Image, DLClassifierHandle, DLClassifierResultHandle)*获取识别结果get_dl_classifier_result (DLClassifierResultHandle, 'all', 'predicted_classes', PredictedClass)*清除当前识别的句柄clear_dl_classifier_result (DLClassifierResultHandle)* dev_display (Image)Text := 'Predicted class: ' + PredictedClassdev_disp_text (Text, 'window', 'top', 'left', 'red', 'box', 'false')dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])stop ()
endfor
clear_dl_classifier (DLClassifierHandle)

参考博文:Halcon中的深度学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29020.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】文件操作

目录 前言: 一、为什么使用文件 二、什么是文件 (一)程序文件 (二)数据文件 (三)文件名 三、文件的打开和关闭 (一)文件指针 (二)文件的…

基于VUE的音乐qq网站设计与实现(Java+spring boot+MySQL+VUE)

获取源码或者论文请私信博主 演示视频: 基于VUE的音乐qq网站设计与实现(Javaspring bootMySQLVUE) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java springboot框架 my…

东莞-戴尔R540服务器故障告警处理方法

DELL PowerEdge R540服务器故障维修案例:(看到文章就是缘分) 客户名称:东莞市某街道管理中心 故障机型:DELL R540服务器 故障问题:DELL R540服务器无法开机,前面板亮黄灯,工程师通过…

功能丰富的 Markdown 笔记工具:FSNotes Mac中文版图文安装教程

FSNotes Mac版是Mac平台上一款纯文本笔记本管理器,FSNotes for mac中文版支持Markdown、RTF等格式,轻松查看和编辑数据,还可以将数据存储在文件系统中,同时具备iCloud同步功能,使用非常便捷。 FSNotes for mac官方介绍…

GO 语言GC

目录 写屏障 读屏障 GO语言GC准备 堆内存结构: GC内存分配: GC触发: P的作用: 写屏障 实现强弱三色不式,为了避免误删,则实现写屏障. 写屏障是在写操作中插入指令,目的是把数据对象的修改通知到GC GO语言支持两种写屏障 读屏障 非移动垃圾回收(例如 三色)天…

Kyuubi的介绍优势(官网链接)

官网链接:https://kyuubi.apache.org/ Apache Kyuubi™ 是一个分布式多租户网关,用于在数据仓库和 Lakehouse 上提供无服务器 SQL。 Kyuubi 在各种现代计算框架(例如 Apache Spark、 Flink、 Doris、 Hive和Trino等)之上构建分布…

Element-UI 实现动态增加多个不同类型的输入框并校验(双重v-for表单验证)

文章目录 前言定义表单格式表单渲染和验证扩展 前言 在做复杂的动态表单,实现业务动态变动,比如有一条需要动态添加的el-form-item中包含了多个输入框,并实现表单验证,但在element-ui组件库中给出的表单校验中没有这样的格式&…

navicate_windows_14

1.新建文本文档2.输入如下内容 echo off set dnInfo set dn2ShellFolder set rpHKEY_CURRENT_USER\Software\Classes\CLSID :: reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration14XCS /f %针对<strong><font color"#FF0000"…

Spring创建Ajax和接受Ajax数据-spring20

建一个AJAX.jsp页面 发送Ajax请求一般用jQuery 引入jQuery 引入文件&#xff1a; 弄一个请求 获得集合参数第二种应用场景 requestBody 的意思请求体 为什么找不到JQuery文件&#xff0c;原因是&#xff1a;前端控制器的配置&#xff1a;缺省&#xff0c;客户端发送请求&…

idea创建spark教程

1、环境准备 java -version scala -version mvn -version spark -version 2、创建spark项目 创建spark项目&#xff0c;有两种方式&#xff1b;一种是本地搭建hadoop和spark环境&#xff0c;另一种是下载maven依赖&#xff1b;最后在idea中进行配置&#xff0c;下面分别记录两…

Java开发中使用sql简化开发

引语&#xff1a; 在Java开发中&#xff0c;我们更希望数据库能直接给我们必要的数据&#xff0c;然后在业务层面直接进行使用&#xff0c;所以写一个简单的sql语句有助于提高Java开发效率&#xff0c;本文由简单到复杂的小白吸收&#xff0c;还请多多指教。 使用MySQL数据库…

Spark MLlib快速入门(1)逻辑回归、Kmeans、决策树、Pipeline、交叉验证

Spark MLlib快速入门(1)逻辑回归、Kmeans、决策树案例 除了scikit-learn外&#xff0c;在spark中也提供了机器学习库&#xff0c;即Spark MLlib。 在Spark MLlib机器学习库提供两套算法实现的API&#xff1a;基于RDD API和基于DataFrame API。今天&#xff0c;主要介绍下Data…