HALCON 深度学习异常检测实例

news2024/9/20 18:32:47

首先你需要下载软件,halcon 20+的版本和 Deep Learning Tool  工具 

注意了,下载的halcon 必须要专业版的电脑系统,win10或者win11 都可以但是版本必须是专业版的不能是家庭版的

详情可看我另一篇文章  halcon 深度学习软件工具安装以及用法-CSDN博客

下载之后配置结束就可以进行程序流程了

一、导入代码

打开halcon 点击如下

点击方法

如果你下载的是22以上的版本

依旧选择异常检测,三种异常看个人需求选择代码导入

导入后如下

如果你是家庭版的win系统 那么你导入的代码就会报错,会显示很多红色 xxx未知算子或函数的问题,所以最好是专业版的

以上你就可以直接F5运行了.

二、训练自己的数据集

      因为是无监督的异常检测,所以无需标注

       

  正样本和负样本放一个文件夹中,正样本可以多点

对应的路径也需要修改  

上面那个框是你的类别  如果没有就写成空   下面那个是你 异常数据的输出

然后就可以运行了或者按F5运行

当后面的页面上出了Press run(F5)to continue   时你才可以点继续点击F5 运行

如果你想只看推理的结果你可以在程序中   用鼠标点击你想要运行的地方  然后单步运行或者全部运行。

halcon  训练代码

dev_update_off ()
dev_close_window ()
set_system ('seed_rand', 25)
* 
* 
*----------------------------- 0.) 样本、保存模型路径 -----------------------*
* 
* 训练只需ok文件夹,其他文件夹用于之后的评估
* 
* 路径及子文件夹名
ImageDir := 'H:/AAVMcomputer/haclondeep/6meidi/images'
ImageSubDirs := ['good','que','quebig']
* 
* 缺陷区域的二值图路径(无)
AnomalyDir := []
* 
* 所有样本预处理后的保存路径
OutputDir := ImageDir+'/anomaly_output_data'
* 模型的保存路径+模型名
ModelFileFullName := ImageDir+'/model_final.hdl' 
* ********************** 自己需要设定的值 ****************** *
* 数据集特定的预处理
ExampleSpecificPreprocessing := true
* 缩放后的大小(32的倍数)
ImageWidth := 320
ImageHeight := 320
* 复杂度,越大准确率越高,训练越耗时
Complexity := 15
* Complexity := 30
* 
*----------------------------- 1.) 读取、拆分样本集 DLDataset -----------------------*
create_dict (GenParamDataset)
set_dict_tuple (GenParamDataset, 'image_sub_dirs', ImageSubDirs)
read_dl_dataset_anomaly (ImageDir, AnomalyDir, [], [], GenParamDataset, DLDataset)
* 拆分样本集为训练集(60%)、验证集(20%)、测试集(剩余的20%)
split_dl_dataset (DLDataset, 60, 20, [])
* 
* 加载预训练模型、设置参数
read_dl_model ('initial_dl_anomaly_medium.hdl', DLModelHandle)
*read_dl_model ('initial_dl_anomaly_large.hdl', DLModelHandle)
set_dl_model_param (DLModelHandle, 'image_width', ImageWidth)
set_dl_model_param (DLModelHandle, 'image_height', ImageHeight)
set_dl_model_param (DLModelHandle, 'complexity', Complexity)
*set_dl_model_param (DLModelHandle, 'runtime', 'cpu')
set_dl_model_param (DLModelHandle, 'runtime', 'gpu')
set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately')
* 设置预处理参数,并进行预处理
create_dict (PreprocessSettings)
set_dict_tuple (PreprocessSettings, 'overwrite_files', true)
create_dl_preprocess_param ('anomaly_detection', ImageWidth, ImageHeight, 3, [], [], 'constant_values', 'full_domain', [], [], [], [], DLPreprocessParam)
preprocess_dl_dataset (DLDataset, OutputDir, DLPreprocessParam, PreprocessSettings, DLDatasetFileName)
* 
* 获取样本集DLDataset中的样本
get_dict_tuple (DLDataset, 'samples', DatasetSamples)
if (ExampleSpecificPreprocessing)
    read_dl_samples (DLDataset, [0:|DatasetSamples| - 1], DLSampleBatch)
    preprocess_dl_samples_bottle(DLSampleBatch)
    write_dl_samples (DLDataset, [0:|DatasetSamples| - 1], DLSampleBatch, [], [])
endif
* 
* 展示10个随机预处理后的 DLSamples
create_dict (WindowDict)
for Index := 0 to 9 by 1
    SampleIndex := int(rand(1) * |DatasetSamples|)
    read_dl_samples (DLDataset, SampleIndex, DLSample)
    dev_display_dl_data (DLSample, [], DLDataset, 'anomaly_ground_truth', [], WindowDict)
    dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
    * 
    get_dict_tuple (WindowDict, 'anomaly_ground_truth', WindowHandles)
    dev_set_window (WindowHandles[0])
    dev_disp_text ('Preprocessed image', 'window', 'top', 'left', 'black', [], [])
    * 
    *stop ()
endfor
dev_close_window_dict (WindowDict)
* 
*stop ()
* 
*----------------------------- 2.) 训练 DLDataset -----------------------*
*--- 设置训练参数
* 是否展示训练过程
EnableDisplay := true
* 设置训练终止条件,错误率、次数,满足其一则终止
ErrorThreshold := 0.001
MaxNumEpochs := 50
* 训练集中用于训练的样本比
*DomainRatio := 0.25
DomainRatio := 0.75
* 正则化噪声,使得训练更健壮。为防止训练失败,可以设置大些
RegularizationNoise := 0.01
* 创建字典,并存储键-值对
create_dict (TrainParamAnomaly)
set_dict_tuple (TrainParamAnomaly, 'regularization_noise', RegularizationNoise)
set_dict_tuple (TrainParamAnomaly, 'error_threshold', ErrorThreshold)
set_dict_tuple (TrainParamAnomaly, 'domain_ratio', DomainRatio)
*--- 创建训练参数
create_dl_train_param (DLModelHandle, MaxNumEpochs, [], EnableDisplay, 73, 'anomaly', TrainParamAnomaly, TrainParam)
*--- 开始训练
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window ()
* 
* 保存模型
write_dl_model (DLModelHandle, ModelFileFullName)
* 
* 
*----------------------------- 3.) 评估模型(计算得到分类、分割的阈值) -----------------------*
* 标准差因子(如果缺陷很小,推荐较大值)
StandardDeviationFactor := 1.0
* 往字典DLModelHandle里存储键-值对
set_dl_model_param (DLModelHandle, 'standard_deviation_factor', StandardDeviationFactor) 
* 计算阈值
create_dict (GenParamThreshold)
set_dict_tuple (GenParamThreshold, 'enable_display', 'true')
compute_dl_anomaly_thresholds (DLModelHandle, DLDataset, GenParamThreshold, AnomalySegmentationThreshold, AnomalyClassificationThresholds)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window ()
* 
* 设置评估参数,在test集上进行评估
create_dict (GenParamEvaluation)
set_dict_tuple (GenParamEvaluation, 'measures', 'all')
set_dict_tuple (GenParamEvaluation, 'anomaly_classification_thresholds', AnomalyClassificationThresholds)
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEvaluation, EvaluationResult, EvalParams)
* 
* 要展示的参数
create_dict (GenParamDisplay)
* 直方图、图例
set_dict_tuple (GenParamDisplay, 'display_mode', ['score_histogram','score_legend'])
create_dict (WindowDict)
dev_display_anomaly_detection_evaluation (EvaluationResult, EvalParams, GenParamDisplay, WindowDict)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', 'box', 'true')
stop ()
* 
dev_close_window_dict (WindowDict)
* 
* 可视化precision精确率, recall召回率, and confusion matrix
set_dict_tuple (GenParamDisplay, 'display_mode', ['pie_charts_precision','pie_charts_recall','absolute_confusion_matrix'])
* 展示 AnomalyClassificationThresholds 中的一个阈值(第三个)
set_dict_tuple (GenParamDisplay, 'classification_threshold_index', 2)
create_dict (WindowDict)
dev_display_anomaly_detection_evaluation (EvaluationResult, EvalParams, GenParamDisplay, WindowDict)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window_dict (WindowDict)
* 
* 
*----------------------------- 4.) 测试 -----------------------*
*** read_dl_model(ModelFullName, DLModelHandle)
************************ 测试的样本,随机的10个ng图(低于10以实际为准)
*list_image_files (ImageDir + '/' + ImageSubDirs, 'default', 'recursive', ImageFiles)
list_image_files (ImageDir + '/' + 'ng', 'default', 'recursive', ImageFiles)
* 打乱数据集
tuple_shuffle (ImageFiles, ImageFilesShuffled)
* 设置阈值(模型训练后得到)
InferenceClassificationThreshold := AnomalyClassificationThresholds[2]
InferenceSegmentationThreshold := AnomalySegmentationThreshold
* 
* 创建类别标签字典(不起作用,但是必须有)
create_dict (DLDatasetInfo)
set_dict_tuple (DLDatasetInfo, 'class_names', ['ok','ng'])
set_dict_tuple (DLDatasetInfo, 'class_ids', [0,1])
* 创建字典,承载窗体信息
create_dict (WindowDict)
for IndexInference := 0 to min2(|ImageFilesShuffled|,10) - 1 by 1
    * 读图
    read_image (Image, ImageFilesShuffled[IndexInference])
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples(DLSample, DLPreprocessParam)
    * 与训练时相同的特定处理
    if (ExampleSpecificPreprocessing)
        preprocess_dl_samples_bottle (DLSample)
    endif
    * 
    apply_dl_model (DLModelHandle, DLSample, [], DLResult)
    threshold_dl_anomaly_results (InferenceSegmentationThreshold, InferenceClassificationThreshold, DLResult)
    * 展示结果
    dev_display_dl_data (DLSample, DLResult, DLDatasetInfo, ['anomaly_result','anomaly_image'], [], WindowDict)
    dev_disp_text ('Press F5 (continue)', 'window', 'bottom', 'center', 'black', [], [])
    stop ()
endfor
* 
************************ 测试的样本,随机的10个ok图(低于10以实际为准)
list_image_files (ImageDir + '/' + 'ok', 'default', 'recursive', ImageFiles)
tuple_shuffle (ImageFiles, ImageFilesShuffled)
for IndexInference := 0 to min2(|ImageFilesShuffled|,10) - 1 by 1
    read_image (Image, ImageFilesShuffled[IndexInference])
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples(DLSample, DLPreprocessParam)
    if (ExampleSpecificPreprocessing)
        preprocess_dl_samples_bottle (DLSample)
    endif
    apply_dl_model (DLModelHandle, DLSample, [], DLResult)
    threshold_dl_anomaly_results (InferenceSegmentationThreshold, InferenceClassificationThreshold, DLResult)
    dev_display_dl_data (DLSample, DLResult, DLDatasetInfo, ['anomaly_result','anomaly_image'], [], WindowDict)
    dev_disp_text ('Press F5 (continue)', 'window', 'bottom', 'center', 'black', [], [])
    stop ()
endfor

dev_close_window_dict (WindowDict)

halcon 推理代码

* 读取模型
read_dl_model ('H:/AAVMcomputer/haclondeep/6meidi/images/model_final.hdl', DLModelHandle)
* 设置阈值(模型训练后得到)
InferenceClassificationThreshold := 0.183618
InferenceSegmentationThreshold := 0.236205
* 用模型中已设定的尺寸缩放
get_dl_model_param (DLModelHandle, 'image_width', ImageWidth)
get_dl_model_param (DLModelHandle, 'image_height', ImageHeight)
create_dl_preprocess_param ('anomaly_detection', ImageWidth, ImageHeight, 3, [], [], 'constant_values', 'full_domain', [], [], [], [], DLPreprocessParam)
* 创建类别标签字典(不起作用,但是必须有)
create_dict (DLDatasetInfo)
set_dict_tuple (DLDatasetInfo, 'class_names', ['ok','ng'])
set_dict_tuple (DLDatasetInfo, 'class_ids', ['0','1'])
* 创建字典,承载窗体信息
create_dict (WindowDict)
* 读图
list_files ('H:/AAVMcomputer/haclondeep/6meidi/test', ['files','follow_links','recursive'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    * Image Acquisition 01: Do something
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples(DLSample, DLPreprocessParam)
    preprocess_dl_samples_bottle (DLSample)
    apply_dl_model (DLModelHandle, DLSample, [], DLResult)
    threshold_dl_anomaly_results (InferenceSegmentationThreshold, InferenceClassificationThreshold, DLResult)
    * 展示结果
    dev_display_dl_data (DLSample, DLResult, DLDatasetInfo, ['anomaly_result','anomaly_image'], [], WindowDict)
    dev_disp_text ('Press F5 (continue)', 'window', 'bottom', 'center', 'black', [], [])
    stop ()  
    
endfor
dev_close_window_dict (WindowDict)

三、部署C#

对于C#的部署目前还在学习中期待后续更新。。。

有学习途径的兄弟姐妹们可以在评论区 分享分享 一起学习

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《高等代数》行(列)和相等行列式

说明:此文章用于本人复习巩固,如果也能帮助到大家那就更加有意义了。 注:1)行(列)和相等行列式的求解方法是将其于行都加到第一行(列),然后再提取第一行 …

Xilinx系ZYNQ学习笔记(一)Vivado使用说明

系列文章目录 文章目录 系列文章目录前言启示界面介绍新建工程主界面RTL分析与描述设计与综合引脚分配约束设计实现比特流文件的下载固化程序 添加源文件 前言 最近买了块xilinx的FPGA进行学习 启示界面介绍 新建工程 主界面 鼠标放在选项上时会出现中文翻译 RTL分析与描述…

基于STM32心电模块学习笔记

一、项目简介 技术原理和优势:通过医疗电子单片机高级开发系统,读取人体生理参数监测系统发送过来的心率和心电导联信息数据包,并对这两个数据包进行解包,最后,将解包之后的心率值和心电导联信息显示在OLED显示屏上,如下图所示。该实验的数据源是人体生理参数监测系统,该…

牛牛替换(c语言)

1.//描述 //牛牛有一个长度为 n 的字符数组,他尝试把字符数组中其中一些字符替换成另一些字符。 //输入描述: //第一行输入一个正整数 n 表示字符数组的长度,四个个字符分别 a1 和 a2 , a3 和 a4, // 表示把字符数组中…

【Unity实战】Visual Studio Debug失败

Visual Studio,就像以前Eclipse在Java领域中的地位一样,至少在Jetbrains人人皆爱之前,它是主流。可能对于当下来说显得臃肿,而且没有Jetbrains智能准确的代码分析提示,但是依旧能用。而且开大工程来说,至少…

内存管理笔记

1、内存管理简介 在计算机系统中,变量、中间数据一般存放在系统存储空间中,只有在实际使用时才将它们从存储空间调入到中央处理器内部进行运算。通常存储空间可以分为两种:内部存储空间和外部存储空间。内部存储空间访问速度比较快&#xff…

【Redis】缓存(上)

为什么要使用缓存? 在日常开发中,通常使用Redis来做MySQL的缓存。究其原因,首先,根据二八定律,20%的数据可以应对80%的请求;其次,对于MySQL这样的关系型数据库来说,性能普遍都不是很…

复习:存储类别内存分配动态分配内存

目录 存储类别说明符 自动变量(auto) 寄存器变变量(register) 块作用域的静态变量(static) 外部链接的静态变量(external) 内存分配 概念回顾 动态分配内存 malloc函数 free函数 回…

若依框架(前后端分离)增加手机号验证码登录

这篇文章主要介绍了如何在若依架(前后端分离)版本中集成短信验证码登录功能。文章内容包括了前后端的详细实现步骤,并通过代码示例展示了如何生成验证码、验证验证码、验证码登录、自定义的认证处理等功能的实现。 前端部分: 登录界面改造:在现有的登录界面上增加短信验证…

Spring Boot集成google Authenticator实现mfa

1.什么时候mfa? 多重身份验证(MFA)是多步骤的账户登录过程,它要求用户输入更多信息,而不仅仅是输入密码。例如,除了密码之外,用户可能需要输入发送到其电子邮件的代码,回答一个秘密…

GoodSync - 本地云端备份同步工具

最近几年各种加密勒索软件层出不穷,个人数据受到威胁。如何让风险降到最低?养成好的备份习惯就很重要。 GoodSync 就是你值得信赖的同步备份工具,能够实现多合一管理网盘、文件安全备份或同步。 文件同步、备份好助手 要在多种设备中同步文…

9.1centos安装postgres

目录 一、安装并启动postgres 二、设置允许远程连接 三、重置密码 四、开放防火墙端口 五、重启服务后进入命令行模式 六、远程连接 一、安装并启动postgres # Install the repository RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpm…

用Python实现时间序列模型实战——Day 7: ARIMA 模型的诊断与调整

一、学习内容 1. 残差分析与模型诊断 残差分析: 在 ARIMA 模型拟合之后,我们需要检查模型残差是否满足白噪声的假设。如果模型残差表现为零均值、方差恒定且无自相关性,这说明模型已经捕捉了时间序列中的主要结构,剩下的残差是…

jarbas 靶机渗透(cms 渗透)

靶机信息 vulnhub 靶机 主机发现 (base) ┌──(root㉿kali)-[/home/kali/testJarbas] └─# sudo nmap -sn 192.168.50.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-28 15:45 CST Nmap scan report for 192.168.50.1 Host is up (0.00023s latency). MAC …

职场真相:在草台班子中寻找自我价值

在踏入社会的那一刻起,我们每个人都怀揣着对未来的无限憧憬与梦想,渴望在职场这个广阔的舞台上绽放光彩。然而,现实往往比理想骨感得多,尤其是在初入职场的几年里,那些曾经以为的“精英团队”、“完美计划”逐渐被现实…

如何选到好的宠物空气净化器,用哪款宠物空气净化器比较好?

在当今社会,养宠物已成为许多家庭不可或缺的一部分,猫猫狗狗以其独特的魅力,悄然融入了我们的生活,成为了家中的一员,它们不仅带来了无尽的欢笑与陪伴,更在无形中丰富了我们的情感世界,让家充满…

【Python】如何使用pip,安装第三方库和生成二维码、操作Excel

文章目录 第三方库使用 pip安装第三方库 生成二维码1. 确定使用哪个库2. 查看对应文档3. 开始操作 操作 Excel1. 安装 xlrd2. 编写代码 第三方库 第三方库就是别人已经实现好了的库,我们可以拿过来直接使用 虽然标准库已经很强大了,但是终究是有限的&am…

QT线程同步

#线程同步 在前面理解了QThread两种使用方法,和线程机制以及退出过程后,需要了解线程同步的内容了,今天开启学习线程同步知识。 还是从大佬的文章开始。 从下面这篇文章开始学习 线程同步 线程同步有: QMutex(互斥&…

【PID系列】一文理解PID原理

【PID系列目录】 [1、一文理解PID原理] 2、PID代码设计 本文目录 1、引出2、 PID概念2.1 首先,什么是偏差呢?2.2 其次,什么是PID比例项?2.3 积分————解决稳态误差的利器2.4  微分————改善动态响应…

while (r > b[i].r) del(a[r--]); while (r < b[i].r)

论 分治 cdq | [SDOI2011] 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高于前一发的高度…