Halcon 深度学习(二):目标检测


前言

最近学习深度学习时的一些总结和看法,参照深度学习的自带案例(detect_pills_deep_learning_1_prepare.hdev)


一、准备

1、准备目标检测所需图片

images文件夹:训练模型的图片
在这里插入图片描述
testImages文件夹:模型训练完后测试模型所用图片
在这里插入图片描述

2、用工具将训练图片打上标签(MVTec Deep Learning Tool)

2.1、新建项目

在这里插入图片描述

2.2、打上标签

在这里插入图片描述

2.3、导出数据集

在这里插入图片描述
有这三个文件前期准备就完成了
在这里插入图片描述

二、编写代码

1、创建目标检测模型

以分类中的pretrained_dl_classifier_compact.hdl的模型为主体

dev_update_off ()

*** 创建检测模型 ***
**设置参数
*必须的参数
Backbone := 'pretrained_dl_classifier_compact.hdl'
*class_ids的数量,标签的总类别数量
NumClasses := 6
*模型所需图片的规格参数
ImageWidth := 512
ImageHeight := 320
ImageNumChannels := 3
*
MinLevel := 2
MaxLevel := 4
NumSubscales := 3
AspectRatios := [1.0,0.5,2.0]
*容量参数
Capacity := 'medium'

*创建模型参数字典
create_dict (DLModelDetectionParam)
set_dict_tuple (DLModelDetectionParam, 'image_width', ImageWidth)
set_dict_tuple (DLModelDetectionParam, 'image_height', ImageHeight)
set_dict_tuple (DLModelDetectionParam, 'image_num_channels', ImageNumChannels)
set_dict_tuple (DLModelDetectionParam, 'min_level', MinLevel)
set_dict_tuple (DLModelDetectionParam, 'max_level', MaxLevel)
set_dict_tuple (DLModelDetectionParam, 'num_subscales', NumSubscales)
set_dict_tuple (DLModelDetectionParam, 'aspect_ratios', AspectRatios)
set_dict_tuple (DLModelDetectionParam, 'capacity', Capacity)
* 创建模型
create_dl_model_detection (Backbone, NumClasses, DLModelDetectionParam, DLModelHandle)

2、预处理数据

*** 预处理数据 ***
**设置路径
*总路径
DataDir := 'E:/视觉/halcon_深度学习/DeepLearning/目标检测'
*图片路径
HalconImageDir:= DataDir + '/testImages/'
*数据集路径
PillBagHdictFile := DataDir + '/images.hdict'
*输出的模型路径
DLModelFileName := DataDir + '/pretrained_dl_model_detection.hdl'
* 用于预处理数据集的输出
DataDirectory := DataDir + '/dataset' 
* 分别存储预处理参数以便在推理过程中使用。
PreprocessParamFileName := DataDirectory + '/dl_preprocess_param_' + ImageWidth + 'x' + ImageHeight

**设置参数
TrainingPercent := 80
ValidationPercent := 10

SeedRand := 42

*判断总路径是否存在
file_exists (DataDir, FileExists)
if (not FileExists)
    make_dir (DataDir)
endif

*读取数据集
read_dict (PillBagHdictFile, [], [], DLDataset)
*获取数据集ID给到模型参数
get_dict_tuple (DLDataset, 'class_ids', ClassIDs)
set_dl_model_param (DLModelHandle, 'class_ids', ClassIDs)
*生成新的模型
write_dl_model (DLModelHandle, DLModelFileName)
set_system ('seed_rand', SeedRand)
*分割数据集
split_dl_dataset (DLDataset, TrainingPercent, ValidationPercent, [])
*从模型中获取预处理参数
create_dict (GenParam)
set_dict_tuple (GenParam, 'overwrite_files', true)
create_dl_preprocess_param_from_model (DLModelHandle, 'false', 'full_domain', [], [], [], DLPreprocessParam)
*预处理
preprocess_dl_dataset (DLDataset, DataDirectory, DLPreprocessParam, GenParam, DLDatasetFilename)

在这里插入图片描述
该路径下会生成此文件
在这里插入图片描述

3、训练

*** 训练 ***
* 设置训练相关模型参数.
set_dl_model_param (DLModelHandle, 'batch_size', 1)
set_dl_model_param (DLModelHandle, 'learning_rate', 0.001)
set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately')

* 创建在模型中使用的训练参数字典 
*参数:模型、将训练模型的时期数(越大训练效果越好)、定义将多少时间传递给下一个模型评估
*      是否显示训练进度、设置随机种子、输出参数的名称、输出参数的字典、输出句柄
create_dl_train_param (DLModelHandle, 20, 1, 'true', 42, [], [], TrainParam)
*在数据集上训练一个基于深度学习的模型
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)
* 
* 读取最佳模型,该模型由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 ()

在这里插入图片描述

4、评估

*** 评估 ***
create_dict (WindowDict)
create_dict (GenParamEval)
set_dict_tuple (GenParamEval, 'detailed_evaluation', true)
set_dict_tuple (GenParamEval, 'show_progress', true)
*对选定的DLDataset样本评估DLModelHandle给出的模型。
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams)
* 
create_dict (DisplayMode)
set_dict_tuple (DisplayMode, 'display_mode', ['pie_charts_precision','pie_charts_recall'])
*可视化类型检测模型的详细评估结果
dev_display_detection_detailed_evaluation (EvaluationResult, EvalParams, DisplayMode, WindowDict)
stop ()
*关闭字典中包含句柄的所有窗口。
dev_display_dl_data_close_windows (WindowDict)

在这里插入图片描述

5、测试

*** 测试 ***
*获取该路径下的所有图片  
list_image_files (HalconImageDir, 'default', 'recursive', ImageFiles)
*对图片文件进行随机排序
tuple_shuffle (ImageFiles, ImageFilesShuffled)
*每次读取一张
set_dl_model_param (DLModelHandle, 'batch_size', 1)
for i := 0 to |ImageFiles|-1 by 1
    read_image (Image, ImageFilesShuffled[i])
    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 Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
    stop ()
endfor
*关闭可视化窗体
dev_display_dl_data_close_windows (WindowDict)

在这里插入图片描述
在这里插入图片描述

三、总结

分类和目标检测的一些差异:
分类是直接将一张图片测试出为哪一个类别,而目标检测则是检测图片上的众多物体分别为哪种。

版权声明:本文为CSDN博主「qq_924771498」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41373415/article/details/115906517

qq_924771498

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

单目3D目标检测调研

单目3D目标检测调研 一、 简介 现有的单目3D目标检测方案主要方案主要分为两类,分别为基于图片的方法和基于伪雷达点云的方法。   基于图片的方法一般通过2D-3D之间的几何约束来学习,包括目标形状信息&#xff0