Halcon深度学习药片检测

1.应用示例思路

(1) 标注数据并获取halcon字典形式的训练数据;(2) 数据预处理;

(3) 模型训练;(4) 模型评估和验证;(5) 模型推理。

数据的标注使用labelimg工具,具体的参考以下博文:

https://blog.csdn.net/ctu_sue/article/details/127280183

 2.应用示例相关参数说明

(1) 创建目标检测模型(create_dl_model_detection)之前应设置的参数

序号

参数

解释

1

'class_ids'

类的ID,默认 'class_ids' = [0,...,num_classes-1]。

2

'class_names'

类的名称,设置之后,类名的顺序保持不变。

3

'image_height',

网络将处理的输入图像的高度。

4

'image_width'

网络将处理的输入图像的宽度。

5

'image_num_channels'

网络将处理的输入图像的通道数(默认值=3)。

6

'min_level'

决定了特征金字塔较低层次的特征图。

7

'max_level'

决定了特征金字塔较深层次的特征图。

8

'anchor_aspect_ratios'

用于创建不同形状(长宽比不一样)的锚框。

9

'anchor_num_subscales'

用于创建不同大小的锚框。

10

'capacity'

该参数决定了在目标检测网络的较深部分(在骨干之后)中参数的数量(或过滤权重)。它的可能值是'high', 'medium'和'low'。它可以用来在检测性能和速度之间进行权衡。

对于简单的目标检测任务,“低”或“中”设置可能足以实现与“高”相同的检测性能。

(2) 目标检测模型训练时应设置的参数

序号

参数

解释

1

'batch_size'

批大小,往设备内存中输入图像(包括标签)的数目。

2

'learning_rate'

学习率,在训练期间决定梯度的变化。

3

'momentum'

动量,当更新网络的权重时,超参数'动量'指定了将先前的更新向量添加到当前更新向量的程度。

4

'weight_prior'

用于损失函数正则化的正则化参数。

5

'device'

在设备上执行深度学习算子的设备句柄。

(3) 目标检测模型评估和推理时应设置的参数

序号

参数

解释

1

'batch_size'

批大小

2

'min_confidence'

最小置信度,所有置信度值小于'min_confidence'的输出边界框都会被抑制。

3

'max_overlap'

同一类的两个预测边界框的IoU所允许的最大值。

4

'max_overlap_class_agnostic'

两个不同类的预测边界框的IoU所允许的最大值。当两个边界框的IoU高于'max_overlap_class_agnostic'时

,具有较低置信度值的那个将被抑制。

5

'optimize_for_inference'

将此参数设置为'true'可以释放不需要用于推理的模型内存(例如,梯度内存)。

 3.应用示例相关代码

(1)解析xml,提取每张图像的目标类别和位置

import os
import xml.etree.ElementTree as ETdef Get_TrainData(xmlfile):TrainDataList = []Classes = []xml_file_name = os.path.basename(xmlfile)file_name = xml_file_name.split('.')[0]img_file_name = file_name + '.png'TrainDataList.append(img_file_name)with open(xmlfile,"r", encoding="utf-8") as in_file:tree = ET.parse(in_file)root = tree.getroot()for obj in root.iter('object'):cls = obj.find('name').textif cls not in Classes:Classes.append(cls)cls_id = Classes.index(cls)xmlbox = obj.find('bndbox')b = (int(xmlbox.find('xmin').text),int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text),int(xmlbox.find('ymax').text))list_file = "" + ",".join([str(a) for a in b]) + ',' + str(cls_id)TrainDataList.append(list_file)return  TrainDataList,ClassesSaveDir1='./pill data/DataLabel'
xml_file_path='./pill data/DataLabel'
xml_file_list = os.listdir(xml_file_path)
TotalTrainDataList=[]
TotalClasses=[]for xmlfile in list(xml_file_list):xml_file_path = os.path.join(SaveDir1, xmlfile)TrainDataList, Classes = Get_TrainData(xml_file_path)TotalTrainDataList.append(TrainDataList)TotalClasses.append(Classes)SaveDir2='./pill data/'
SaveDir3='./pill data/'with open(os.path.join(SaveDir2,'TrainList.txt'), encoding="utf-8", mode="w") as f:for each_TrainDataList in TotalTrainDataList:f.write(" ".join(each_TrainDataList)+"\n")with open(os.path.join(SaveDir3,'classes.txt'), encoding="utf-8", mode="w") as f:for each_Classes in TotalClasses:f.write(",".join(each_Classes) + "\n")

(2) 生成字典形式的训练数据

*1、变量定义* 前边生成的类别文件
class_txt:='./InputFile/classes.txt'
* 前边生成的数据标注文件
train_txt:='./InputFile/TrainList.txt'
* 基于halcon转化脚本下的图像保存路径
ImageDir:='./DataImage'
* 基于halcon训练脚本下的图像保存路径
BaseImgDir:='./DataImage'
* 保存为halcon识别的训练文件
dict_File:='./InputFile/dl_dataset.hdict'*2、读取种类ClassID:=[]
ClassName:=[]open_file (class_txt, 'input', FileHandle)
repeatfread_line(FileHandle, oneline, IsEOF)if(IsEOF == 1)break        endifif(oneline == ' ' or oneline=='\n')continueendiftuple_regexp_replace (oneline, '\n', '', oneline)tuple_length (ClassID, Length)ClassID[Length]:=Length+1tuple_concat (ClassName, oneline, ClassName)
until (IsEOF)*3、解析trainList.txtTrainDataList:=[]
open_file (train_txt, 'input', FileHandle)
repeatfread_line(FileHandle, oneline, IsEOF)if(IsEOF == 1)break        endifif(oneline == ' ' or oneline=='\n')continueendiftuple_regexp_replace (oneline, '\n', '', oneline)tuple_concat (TrainDataList, oneline, TrainDataList)
until (IsEOF)*4、生成字典class_ids:=[1,2,3,4,5,6,7,8,9,10]
class_names:=['黑圆','土圆','赭圆','白圆','鱼肝油','棕白胶囊','蓝白胶囊','白椭圆','黑椭圆','棕色胶囊']AllSamples:=[]for Index1 := 0 to |TrainDataList|-1 by 1EachTrainList:=TrainDataList[Index1]tuple_split (EachTrainList, ' ', DataList)imageFile:=DataList[0]tuple_length (DataList, Length)DataList:=DataList[1:Length-1]create_dict (SampleImage)set_dict_tuple (SampleImage, 'image_id', Index1+1)set_dict_tuple (SampleImage, 'image_file_name', imageFile)  bbox_label_id:=[]bbox_row1:=[]bbox_col1:=[]bbox_row2:=[]bbox_col2:=[]class_names_temp1:=[ClassName[Index1]]tuple_split (class_names_temp1, ',', class_names_temp2)for bbox_index:=0 to |DataList|-1 by 1bbox_data:=DataList[bbox_index]tuple_split (bbox_data, ',', bbox_data_list)tuple_number (bbox_data_list[4], Number)class_name:=class_names_temp2[Number]tuple_find_first (class_names, class_name, class_name_index)tuple_concat (bbox_label_id, class_name_index+1, bbox_label_id)tuple_number (bbox_data_list[1], Number)tuple_concat (bbox_row1, Number, bbox_row1)tuple_number (bbox_data_list[0], Number)tuple_concat (bbox_col1, Number, bbox_col1)tuple_number (bbox_data_list[3], Number)tuple_concat (bbox_row2, Number, bbox_row2)tuple_number (bbox_data_list[2], Number)tuple_concat (bbox_col2, Number, bbox_col2)endforset_dict_tuple (SampleImage, 'bbox_label_id', bbox_label_id)set_dict_tuple (SampleImage, 'bbox_row1', bbox_row1)set_dict_tuple (SampleImage, 'bbox_col1', bbox_col1)set_dict_tuple (SampleImage, 'bbox_row2', bbox_row2)set_dict_tuple (SampleImage, 'bbox_col2', bbox_col2)tuple_concat (AllSamples, SampleImage, AllSamples)endfor*5、生成最终字典形式的训练数据create_dict (DLDataset)
set_dict_tuple (DLDataset, 'image_dir', './DataImage')
set_dict_tuple (DLDataset, 'class_ids', class_ids)
set_dict_tuple (DLDataset, 'class_names', class_names)
set_dict_tuple (DLDataset, 'samples', AllSamples) write_dict (DLDataset, dict_File, [], [])

(3) 应用示例代码

dev_close_window ()
dev_update_off ()
set_system ('seed_rand', 42)***0.)  设置输入输出路径(SET INPUT/OUTPUT PATHS)  ***get_system ('example_dir', HalconExampleDir)
PillBagJsonFile := HalconExampleDir + '/hdevelop/Deep-Learning/Detection/pill_bag.json'
InputImageDir := HalconExampleDir + '/images/'
OutputDir := 'detect_pills_data'*设置为true,如果运行此程序后应删除结果。
RemoveResults := false***1.)准备(PREPARE )****我们从一个COCO文件中读取数据集。
*或者读取由MVTec深度学习工具使用read_dict()创建的DLDataset字典。read_dl_dataset_from_coco (PillBagJsonFile, InputImageDir, dict{read_segmentation_masks: false}, DLDataset)*创建适合数据集参数的检测模型。
DLModelDetectionParam := dict{image_dimensions: [512, 320, 3], max_level: 4}
DLModelDetectionParam.class_ids := DLDataset.class_ids
DLModelDetectionParam.class_names := DLDataset.class_names
create_dl_model_detection ('pretrained_dl_classifier_compact.hdl', |DLModelDetectionParam.class_ids|, DLModelDetectionParam, DLModelHandle)*对DLDataset中的数据进行预处理。
split_dl_dataset (DLDataset, 60, 20, [])*如有需要,现有的预处理数据将被覆盖。
PreprocessSettings := dict{overwrite_files: 'auto'}
create_dl_preprocess_param_from_model (DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)
preprocess_dl_dataset (DLDataset, OutputDir, DLPreprocessParam, PreprocessSettings, DLDatasetFileName)*随机挑选10个预处理的样本进行可视化
WindowDict := dict{}
for Index := 0 to 9 by 1SampleIndex := round(rand(1) * (|DLDataset.samples| - 1))read_dl_samples (DLDataset, SampleIndex, DLSample)dev_display_dl_data (DLSample, [], DLDataset, 'bbox_ground_truth', [], WindowDict)dev_disp_text ('Press F5 to continue', 'window', 'bottom', 'right', 'black', [], [])stop ()
endfor
dev_close_window_dict (WindowDict)***2.) 训练(TRAIN) ****训练可以在GPU或CPU上执行。
*本例中尽可能使用GPU。*如果你明确希望在CPU上运行这个例子,选择CPU设备。
query_available_dl_devices (['runtime', 'runtime'], ['gpu', 'cpu'], DLDeviceHandles)
if (|DLDeviceHandles| == 0)throw ('No supported device found to continue this example.')
endif*由于query_available_dl_devices中使用了过滤,如果可用,第一个设备是GPU。
DLDevice := DLDeviceHandles[0]
get_dl_device_param (DLDevice, 'type', DLDeviceType)
if (DLDeviceType == 'cpu')*使用的线程数可能会对训练持续时间产生影响。NumThreadsTraining := 4set_system ('thread_num', NumThreadsTraining)
endif*详细信息参见set_dl_model_param()和get_dl_model_param()的文档。
set_dl_model_param (DLModelHandle, 'batch_size', 1)
set_dl_model_param (DLModelHandle, 'learning_rate', 0.001)
set_dl_model_param (DLModelHandle, 'device', DLDevice)*在这里,我们进行10次的短训练。为了更好的模型性能,增加epoch的数量,例如从10到60。create_dl_train_param (DLModelHandle, 10, 1, 'true', 42, [], [], TrainParam)*使用以下函数调用train_dl_model_batch()完成训练train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)*读取由by train_dl_model保存的最佳模型文件。
read_dl_model ('model_best.hdl', DLModelHandle)
dev_disp_text ('Press F5 to continue', 'window', 'bottom', 'left', 'black', [], [])
stop ()dev_close_window ()
dev_close_window ()***3.) 评估(EVALUATE) ***
* 
GenParamEval := dict{detailed_evaluation: true, show_progress: true}set_dl_model_param (DLModelHandle, 'device', DLDevice)
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams)DisplayMode := dict{display_mode: ['pie_charts_precision', 'pie_charts_recall']}
dev_display_detection_detailed_evaluation (EvaluationResult, EvalParams, DisplayMode, WindowDict)
dev_disp_text ('Press F5 to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
dev_close_window_dict (WindowDict)*优化模型进行推理,也就是说,减少它的内存消耗。
set_dl_model_param (DLModelHandle, 'optimize_for_inference', 'true')
set_dl_model_param (DLModelHandle, 'batch_size', 1)
*保存此优化状态下的模型。
write_dl_model (DLModelHandle, 'model_best.hdl')***4.) 推理(INFER) ****为了演示推理步骤,我们将训练好的模型应用于一些随机选择的示例图像。list_image_files (InputImageDir + 'pill_bag', 'default', 'recursive', ImageFiles)
tuple_shuffle (ImageFiles, ImageFilesShuffled)*创建用于可视化的窗口字典。
WindowDict := dict{}
DLDatasetInfo := dict{}
get_dl_model_param (DLModelHandle, 'class_ids', DLDatasetInfo.class_ids)
get_dl_model_param (DLModelHandle, 'class_names', DLDatasetInfo.class_names)
for IndexInference := 0 to 9 by 1read_image (Image, ImageFilesShuffled[IndexInference])gen_dl_samples_from_images (Image, DLSampleInference)preprocess_dl_samples (DLSampleInference, DLPreprocessParam)apply_dl_model (DLModelHandle, DLSampleInference, [], DLResult)dev_display_dl_data (DLSampleInference, DLResult, DLDataset, 'bbox_result', [], WindowDict)dev_disp_text ('Press F5 to continue', 'window', 'bottom', 'right', 'black', [], [])stop ()
endfor
dev_close_window_dict (WindowDict)***5.) 删除文件(REMOVE FILES) ***clean_up_output (OutputDir, RemoveResults)

如果不想自己标注数据的,可以下载我整理好的资源:https://download.csdn.net/download/qq_44744164/88595779

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

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

相关文章

笔记-模拟角频率和数字角频率的关系理解

先建议阅读前人此文(点击这里),有助于理解。 模拟频率:f 模拟角频率:Ω 数字角频率:ω 其中:在模拟信号中Ω 2πf 正弦波表示:sin(2πft) sin(Ωt) 数字信号就是离散的&#xff…

深度学习(五):pytorch迁移学习之resnet50

1.迁移学习 迁移学习是一种机器学习方法,它通过将已经在一个任务上学习到的知识应用到另一个相关任务上,来改善模型的性能。迁移学习可以解决数据不足或标注困难的问题,同时可以加快模型的训练速度。 迁移学习的核心思想是将源领域的知识迁…

出现数据库出现没有时间格式的错误,实体类Date类型不对导致时间报错

目录 报错现场解决办法java与mysql中的日期类型及二者的对应关系和使用场景 报错现场 数据库最早时间为2023年1月1日,前端查询后却出现2022年12月31日的数据 数据库时间类型为date swagger接口测试 解决办法 讲until的Date改成sql类的Date,就可以了…

[ 蓝桥杯Web真题 ]-视频弹幕

目录 介绍 准备 目标 效果 规定 思路 解答参考 扩展功能 介绍 弹幕指直接显现在视频上的评论,可以以滚动、停留甚至更多动作特效方式出现在视频上,是观看视频的人发送的简短评论。通过发送弹幕可以给观众一种“实时互动”的错觉,弹幕…

基于STM32的智慧农业项目(物联网专业毕设)附送源码和文档材料+学习路线

文章目录 概要整体架构流程硬件选型软件总体框架技术细节实现效果小结 概要 传统农业存在着产量受到环境因素影响较大的问题,现有的农业监测系统数据太过简单、太过理想化。而随着现代科学的持续发展,一个精准化、自动化的现代智能农产品管理系统将在农业生产中起着…

个人Windows电脑通过Cloudreve+Cpolar搭建PHP云盘系统公网可访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…

⭐ Unity + ARKIT 介绍 以及 平面检测的实现

在AR插件中,ARKIT是比较特殊的一个,首先他在很多追踪上的效果要比其他的AR插件要好,但是只能在IOS系统设备上运行。 1.首先ARKIT在最新版Unity已经集成在AR Foundation中,那我们就需要ARSession 和ARSessionOrigin这两个重要组件…

【DevOps】Jenkins:配置jenkins 流水线/多分支流水线任务构建成功通知企业微信@相关人(二)

目录 一、调用Kubernetes API二、打包编译三、应用于流水线上一篇文章实现了企业微信通知,但仅仅是Jenkins构建后通知,如果在K8s侧配置了就绪检测和滚动更新,那构建完成并不能代表服务已经发布完成,本篇文章我们就来解决这个问题 一、调用Kubernetes API 我这里使用Golan…

[Ubuntu 20.04] 使用Netplan配置网络静态IP

Netplan 是一个在 Ubuntu 系统中进行网络配置的工具。它提供了一种简单和统一的方式来管理网络配置,包括网络接口、IP 地址、网关、DNS 设置等。 以下是 Netplan 的特点和功能: 声明性配置: Netplan 使用 YAML 文件格式进行网络配置,这使得配置文件更易于阅读和编写。你可以…

netcore swagger 错误 Failed to load API definition

后端接口报错如下: 前端nswag报错如下: 根据网上查询到的资料说明,说一般swagger这种错误都是控制器里有接口代码异常造成的,通常是接口没有加属性Attribute, 比如[HttpPost("Delete")]、[HttpGet("Del…

chown和chmod

chown和chmod都是在Linux和Unix系统中用于设置文件和文件夹权限的命令,但它们的功能和用途有所不同。 功能:chown主要用于修改文件或文件夹的所有者和所属组,而chmod则主要用于修改文件或文件夹的读写执行权限。用途:如果想要授权…

Vue3 组合式实现 带连接线的Tree型 架构图(一级树形图)

创建组件名称 TreeNodeView.vue <template><div class"tree-node"><div class"node">{{ rootNodeName }}</div><div class"children" :style"childrenLineStyle"><div class"child-node"…

12月4日作业

完成沙发床的多继承 #include <iostream>using namespace std;class Sofa { private:string sit;int *price; public:Sofa() {cout << "Sofa::无参构造函数" << endl;}Sofa(string sit,int price):sit(sit),price((new int(price))){cout <<…

Java中的类与类之间的关系

1、Java中类与类之间的关系 依赖&#xff08;Dependency&#xff09;&#xff1a;一个类依赖于另一个类的定义。这种关系通常通过在一个类的方法中创建另一个类的实例来实现。依赖关系是类与类之间最基本的关系之一。关联&#xff08;Association&#xff09;&#xff1a;关联…

AutoHotKey-study

目录 使用编辑器脚本注意函数解释信息调试方法键盘获取方法脚本练习 最近发现常用键盘的上下左右箭头去操作输入输出问题感觉很不是滋味&#xff0c;不像Linux那样&#xff0c;有vim的使用&#xff0c;就想着有没有什么方法更快捷&#xff0c;更方便的去使用电脑键盘&#xff0…

分享80个菜单导航JS特效,总有一款适合您

分享80个菜单导航JS特效&#xff0c;总有一款适合您 80个菜单导航JS特效下载链接&#xff1a;https://pan.baidu.com/s/1NgNc759Kg1of_8vR7kaj6A?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

pip的基本命令和使用

pip 简介 pip是Python官方的包管理器&#xff0c;可以方便地安装、升级和卸载Python包。 pip 常用命令 显示版本和路径 pip --version获取帮助 pip --help升级pip和升级包 pip install --upgrade pip # Linux/macOS pip install -U pip # windowspip install…

java中isBefore和isAfter的用法?

在Java中&#xff0c;isBefore()和isAfter()是用于比较日期和时间的方法&#xff0c;用于判断一个日期或时间是否早于或晚于另一个日期或时间。这两个方法是java.time包中的Temporal接口的一部分&#xff0c;被多个日期和时间类&#xff08;如LocalDate、LocalTime、LocalDateT…

【Cesium】模型平面裁切

const scene viewer.scene;let tileset; let targetY 400.0; let planeEntities []; let selectedPlane; // 选择的切面 let clippingPlanes; // 切面属性// 当鼠标点击切面时&#xff0c;修改相关属性 const downHandler new Cesium.ScreenSpaceEventHandler(viewer.sce…

表达式二叉树的中序遍历:2017年408算法题

算法思想 表达式二叉树的中序遍历即中缀表达式除了根节点和叶结点&#xff0c;遍历到其他结点时在遍历其左子树前加上左括号&#xff0c;在遍历完右子树后加上右括号 算法实现 //中序遍历&#xff0c;deep从1开始&#xff0c;即根节点的深度为1 void midOrder(BTree T,int …