halcon19.11深度学习关于分类入门案例

目录

 

halcon19.11深度学习分类

关于配置环境

准备训练集

训练数据集

评估模型

测试模型


halcon19.11深度学习分类

关于配置环境

首先,如果你想使用halcon19.11学习深度学习,那么请保证你的电脑拥有独立显卡,关于配置的要求和如何进行配置,请参考这篇博文,传送门。

准备训练集

halcon准备训练集比较简单,只需要用户将自己分好类的图片放在不同的文件夹,每一类放入一个文件夹,文件夹的名字就是该类图片的类名。然后用代码进行处理即可。

我在D:/lixinze/halcon深度学习目录下放了两类图片,分别是D:/lixinze/halcon/huolong  D:/lixinze/halcon/miaowa 博主分类的是数码宝贝图片。

huolong文件夹下存放的全是火龙的图片,miaowa文件夹下存放的全是妙蛙种子的图片。所有图片必须是3通道图片。

dev_update_off ()
*存放分类图片的上一级路径
RawImageFolder := 'D:/lixinze/halcon深度学习/'
*存放预处理数据的总路径
ExampleDataDir:= 'D:/lixinze/halcon深度学习/class_data'
*存放预处理数据的二级路径
DataDirectoryBaseName := ExampleDataDir + '/dldataset_pokeman'
*默认参数,用来预处理数据集的
LabelSource := 'last_folder'
* 
*分割数据集的百分比。
*训练集
TrainingPercent := 70
*验证集
ValidationPercent := 15
* 
* 用户想要输入的图像大小,可更改
ImageWidth := 900
ImageHeight := 500
ImageNumChannels := 3
* 
*用于图像预处理的其他参数。
NormalizationType := 'none'
DomainHandling := 'full_domain'
* 
*为了获得可复制的分割,我们设置了一个随机种子。
*这意味着重新运行脚本将导致DLDataset的相同拆分。
SeedRand := 42
*设置随机种子。
set_system ('seed_rand', SeedRand)
* 
*使用过程read_dl_dataset_classification读取数据集。
*或者,您可以使用read_dict()读取由MVTec深度学习工具创建的DLDataset字典。
read_dl_dataset_classification (RawImageFolder, LabelSource, DLDataset)
*分割数据集
split_dl_dataset (DLDataset, TrainingPercent, ValidationPercent, [])
*创建输出目录(如果尚不存在)。
file_exists (ExampleDataDir, FileExists)
if (not FileExists)
    make_dir (ExampleDataDir)
endif
* 
*创建预处理参数。
create_dl_preprocess_param ('classification', ImageWidth, ImageHeight, ImageNumChannels, -127, 128, NormalizationType, DomainHandling, [], [], [], [], DLPreprocessParam)
* 
*数据集目录,用于由preprocess_dl_dataset编写的任何输出。
DataDirectory := DataDirectoryBaseName + '_' + ImageWidth + 'x' + ImageHeight
* 
*预处理数据集。 这可能需要几秒钟。
create_dict (GenParam)
set_dict_tuple (GenParam, 'overwrite_files', true)
preprocess_dl_dataset (DLDataset, DataDirectory, DLPreprocessParam, GenParam, DLDatasetFileName)
* 
*单独存储预处理参数以便使用,例如 在推论过程中。
PreprocessParamFileBaseName := DataDirectory + '/dl_preprocess_param.hdict'
write_dict (DLPreprocessParam, PreprocessParamFileBaseName, [], [])

这里预处理就完成了,可以显示一下图片打的标签是否正确

*在进行培训之前,建议先检查预处理后的数据集。
*
*显示10个随机选择的火车图像的DLSamples。
get_dict_tuple (DLDataset, 'samples', DatasetSamples)
find_dl_samples (DatasetSamples, 'split', 'train', 'match', SampleIndices)
tuple_shuffle (SampleIndices, ShuffledIndices)
read_dl_samples (DLDataset, ShuffledIndices[0:9], DLSampleBatchDisplay)
* 
create_dict (WindowHandleDict)
for Index := 0 to |DLSampleBatchDisplay| - 1 by 1
    *在DLSampleBatchDisplay中循环采样。
    dev_display_dl_data (DLSampleBatchDisplay[Index], [], DLDataset, 'classification_ground_truth', [], WindowHandleDict)
    Text := 'Press Run (F5) to continue'
    dev_disp_text (Text, 'window', 'bottom', 'right', 'black', [], [])
    stop ()
endfor
* 
* 关闭窗口,数据预处理完成
dev_close_window_dict (WindowHandleDict)
stop()

halcon19.11深度学习关于分类入门案例_第1张图片

查看下文件夹

halcon19.11深度学习关于分类入门案例_第2张图片

halcon19.11深度学习关于分类入门案例_第3张图片

halcon19.11深度学习关于分类入门案例_第4张图片

训练数据集

得到了dl_dataset.hdict文件,就是我们要得数据集,dl_preprocess_param.hdict是预处理过程我们设置的参数,将其以字典形式保存了。

下面开始训练

注意,每一个阶段都是在得到前一个阶段生成的文件下进行的。

*预处理后的文件路径
DLDatasetFileName := DataDirectory+'/dl_dataset.hdict'
*预处理的参数文件路径
DLPreprocessParamFileName := DataDirectory + '/dl_preprocess_param.hdict'
*最佳评估模型的输出路径。
BestModelBaseName := ExampleDataDir + '/best_dl_model_classification'
*最终训练模型的输出路径。
FinalModelBaseName := ExampleDataDir + '/final_dl_model_classification'
* Batch size.
BatchSize := 2
*学习率
InitialLearningRate := 0.0001
*如果批量小,动量应高。
Momentum := 0.9
* train_dl_model使用的参数。
*训练模型的时迭代次数。
NumEpochs := 20
*评估间隔(以时期计),以计算验证拆分上的评估度量。每迭代一次验证一次
EvaluationIntervalEpochs := 1
*在以下时期更改学习率,例如 [4、8、12]。
*如果不应该改变学习率,则将其设置为[]。
ChangeLearningRateEpochs := []
*将学习率更改为以下值,例如 InitialLearningRate * [0.1,0.01,0.001]。
*元组的长度必须与ChangeLearningRateEpochs相同。
ChangeLearningRateValues := InitialLearningRate * [0.1,0.01,0.001]
*事先设定权重。
WeightPrior := 0.0005
*控制是否显示训练进度(是/否)。
DisplayEvaluation := true
*设置一个随机的种子进行训练。
RandomSeed := 42
*设置create_dl_train_param的通用参数。
*请参阅create_dl_train_param的文档以获取所有可用参数的概述。
GenParamName := []
GenParamValue := []
*扩充参数。
*如果在训练过程中应增加样本,请创建extend_dl_samples所需的字典。
*在这里,我们设置增强百分比和方法。
*create_dict (AugmentationParam)
*要增加的样本百分比。
*set_dict_tuple (AugmentationParam, 'augmentation_percentage', 50)
*沿行和列镜像。
*set_dict_tuple (AugmentationParam, 'mirror', 'rc')
*GenParamName := [GenParamName,'augment']
*GenParamValue := [GenParamValue,AugmentationParam]
*更改策略。
*在训练过程中可以更改模型参数。
*在这里,如果上面指定了,我们将更改学习率。
if (|ChangeLearningRateEpochs| > 0)
    create_dict (ChangeStrategy)
    * Specify the model parameter to be changed, here the learning rate.
    set_dict_tuple (ChangeStrategy, 'model_param', 'learning_rate')
    * Start the parameter value at 'initial_value'.
    set_dict_tuple (ChangeStrategy, 'initial_value', InitialLearningRate)
    * Reduce the learning rate in the following epochs.
    set_dict_tuple (ChangeStrategy, 'epochs', ChangeLearningRateEpochs)
    * Reduce the learning rate to the following values.
    set_dict_tuple (ChangeStrategy, 'values', ChangeLearningRateValues)
    * Collect all change strategies as input.
    GenParamName := [GenParamName,'change']
    GenParamValue := [GenParamValue,ChangeStrategy]
endif
* 
*序列化策略。
*有多种选项可用于将中间模型保存到磁盘(请参见create_dl_train_param)。
*在这里,我们将最佳模型和最终模型保存到上面设置的路径中。
create_dict (SerializationStrategy)
set_dict_tuple (SerializationStrategy, 'type', 'best')
set_dict_tuple (SerializationStrategy, 'basename', BestModelBaseName)
GenParamName := [GenParamName,'serialize']
GenParamValue := [GenParamValue,SerializationStrategy]
create_dict (SerializationStrategy)
set_dict_tuple (SerializationStrategy, 'type', 'final')
set_dict_tuple (SerializationStrategy, 'basename', FinalModelBaseName)
GenParamName := [GenParamName,'serialize']
GenParamValue := [GenParamValue,SerializationStrategy]
* 
*显示参数。
*在此示例中,选择了20%的训练分组以显示
*评估在训练过程中减少训练次数的评估措施。 较低的百分比
*有助于加快评估/培训。 如果评估措施用于培训分裂
*不会显示,将此值设置为0(默认值)。
*SelectedPercentageTrainSamples := 15
*create_dict (DisplayParam)
*set_dict_tuple (DisplayParam, 'selected_percentage_train_samples', SelectedPercentageTrainSamples)
*GenParamName := [GenParamName,'display']
*GenParamValue := [GenParamValue,DisplayParam]
*检查是否所有必需的文件都存在。
check_data_availability (ExampleDataDir, DLDatasetFileName, DLPreprocessParamFileName)
* 
*读入在预处理过程中初始化的模型。也就是读取神经网络模型,halcon自带的
read_dl_model ('pretrained_dl_classifier_compact.hdl', DLModelHandle)
*读取预处理后的图片DLDataset文件。
read_dict (DLDatasetFileName, [], [], DLDataset)
*按照上述设置指定模型超参数。
set_dl_model_param (DLModelHandle, 'learning_rate', InitialLearningRate)
set_dl_model_param (DLModelHandle, 'momentum', Momentum)
*设置模型的类名。
get_dict_tuple (DLDataset, 'class_names', ClassNames)
set_dl_model_param (DLModelHandle, 'class_names', ClassNames)
*从预处理参数获取图像尺寸并为模型设置它们。
read_dict (DLPreprocessParamFileName, [], [], DLPreprocessParam)
get_dict_tuple (DLPreprocessParam, 'image_width', ImageWidth)
get_dict_tuple (DLPreprocessParam, 'image_height', ImageHeight)
get_dict_tuple (DLPreprocessParam, 'image_num_channels', ImageNumChannels)
*设置输入模型的图片大小和维度
set_dl_model_param (DLModelHandle, 'image_dimensions', [ImageWidth,ImageHeight,ImageNumChannels])
if (BatchSize == 'maximum')
    set_dl_model_param_max_gpu_batch_size (DLModelHandle, 100)
else
    set_dl_model_param (DLModelHandle, 'batch_size', BatchSize)
endif
if (|WeightPrior| > 0)
    set_dl_model_param (DLModelHandle, 'weight_prior', WeightPrior)
endif
set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately')
stop()
*创建训练参数。有超参数的传入GenParamName、GenParamValue
create_dl_train_param (DLModelHandle, NumEpochs, EvaluationIntervalEpochs, DisplayEvaluation, RandomSeed, GenParamName, GenParamValue, TrainParam)
*create_dl_train_param (DLModelHandle, NumEpochs, EvaluationIntervalEpochs, DisplayEvaluation, RandomSeed, [], [], TrainParam)
*
*以下过程中的train_dl_model_batch()。
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)
stop()
* Close training windows.
dev_close_window ()

在上述代码中,我选择了不增强数据集处理。关于重点是read_dl_model,具体模型的优缺点可以看:https://blog.csdn.net/qq_18620653/article/details/106035517

如果程序报错说超出电脑内存,就调低BatchSize再尝试运行。这个参数是神经网络每次训练几张图片的意思。或者图片特征明显的话也可以考虑改变图片的大小,变小图片的输入大小。

halcon19.11深度学习关于分类入门案例_第5张图片

评估模型

完成训练后,程序会保存好准确率最高的一个模型,放在我们设置的路径下BestModelBaseName。代码如下

*******************************************************************评估****************************************************
*创建字典
create_dict (GenParamEval)
*设置参数
set_dict_tuple (GenParamEval, 'class_names_to_evaluate', 'global')
set_dict_tuple (GenParamEval, 'measures', ['top1_error','precision','recall','f_score','absolute_confusion_matrix'])
* Evaluate the trained model.
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams)
* 
create_dict (EvalDisplayMode)
set_dict_tuple (EvalDisplayMode, 'display_mode', ['measures','pie_charts_precision','pie_charts_recall','absolute_confusion_matrix'])
create_dict (WindowDict)
dev_display_classification_evaluation (EvaluationResult, EvalParams, EvalDisplayMode, WindowDict)
dev_disp_text ('Press F5 to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
dev_close_window_dict (WindowDict)

评估模型就是让我们看一看模型的准确率,我们主要看的是top1_error这个参数,它是错误率,至于后面的精确率和召回率,有兴趣的可以自己看看其意义。

halcon19.11深度学习关于分类入门案例_第6张图片

测试模型

现在我们就可以拿我们的模型去预测图片了,我们需最佳模型和预处理参数文件。

BestModelBaseName := 'D:/lixinze/hlacon深度学习/class_data/best_dl_model_classification.hdl'

*读取保存好的最佳模型
read_dl_model (BestModelBaseName, DLModelHandle)
*读取预处理的参数
read_dict ('D:/lixinze/halcon深度学习/class_data/dldataset_pokeman_900x500/dl_preprocess_param.hdict', [], [], DLPreprocessParam)
get_dict_tuple (DLPreprocessParam, 'image_width', ImageWidth)
get_dict_tuple (DLPreprocessParam, 'image_height', ImageHeight)
get_dict_tuple (DLPreprocessParam, 'image_num_channels', ImageNumChannels)

*create_dict (WindowDict)
dev_open_window (0, 0, 900, 512, 'black', WindowHandle)
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('D:/lixinze/halcon深度学习/huolong', ['files','follow_links'], 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])
    dev_display (Image)
    * 处理图片
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples (DLSample, DLPreprocessParam)
    *喂给模型
    apply_dl_model (DLModelHandle, DLSample, [], DLResult)
    *得到预判结果
    get_dict_tuple (DLResult, 'classification_class_names', Tuple)
    predictionname:=Tuple[0]
    *显示预测的类型
    disp_message (WindowHandle, predictionname, 'window', 12, 12, 'black', 'true')
    *dev_display_dl_data (DLSample, DLResult, DLDataset, 'classification_result', [], WindowDict)
    stop()
endfor

halcon19.11深度学习关于分类入门案例_第7张图片

编码不易,有问题请留言,方便的大哥给个赞再走啊。

你可能感兴趣的:(halcon,深度学习)