Halcon深度学习介绍(二)---分类

本文介绍了Halcon深度学习在分类问题中的应用,包括预处理、训练、预测和验证的基本流程。重点讲解了如何准备样本、进行训练以及使用训练结果进行预测。提供了简化后的训练脚本,并强调了图片大小、学习率和batch size等关键参数的选择。训练完成后,生成的best_model.hdl文件可用于实际检测任务。
摘要由CSDN通过智能技术生成

Halcon深度学习介绍–分类
#**1、说明
  前边讲述了几个具体的类别,但是并没有讲具体的操作,这里就具体将一下。其实在halcon中有非常详细的案例,无论是分类,还是目标检测,一般都分成预处理、训练、预测以及验证,预处理是对数据做前置处理,比如缩放、增强等等,实际上在halcon中这一部分就是黑匣子,我们更多的是去用,能理解大概用途就可以;对于训练,则是将已经处理好的数据进行训练,也就是根据ok与ng的样本,来不断的去迭代优化内部计算结果,能够直接根据输入图片,就判断是ok与ng,这个获取两者之间转换关系的过程就是训练,训练最终会得到一个hdl格式的训练结果,也就是权重;对于预测,那就是输入图片,根据我们训练的hdl去推理出结果;验证,则是通过多组图片来衡量我们训练的好坏。
在这里插入图片描述
对于我们来说,可能更注重如何去用,工业上还是以实用为主,直接简单整理下,只需要训练及预测即可。只希望看了这个,可以知道怎么去一个新项目中用,理解的事情就交给读者自己了。对于预处理跟预测直接放一起了,然后预测,而验证,有兴趣可以自己去了解。
#**2、样本准备
  首先创建一个大的文件夹,比如images,然后再里边创建ok文件夹与ng文件夹,分别将好的样本图与缺陷样本图片放入对应文件夹即可。需要主要的是,图片大小最好一致,容易训练,当然一般工业样机采集的图片大小本身就一致。
在这里插入图片描述
文件夹最就放在训练程序的外边就好了,images,内部是ok与ng。在这里插入图片描述

#**3、训练
  本身样例中也有例子,但是显示的东西太多,刚接触的可能会看晕,我直接把有用的整理了一下,也就是训练.dev,直接F5运行就行,一段时间就训练完事了,傻瓜式操作。F5后如果报错,可能是由于找不到hdl,直接电脑搜索一下,放到这个同一文件夹下就可以。
在这里插入图片描述
同时我们会发现多处了一个data文件夹,这里边就是对ok、ng图片预处理后的图片,中间文件,不需要我们管,别管他。
这样就开始训练了,左上角的数越小越好奥。不够小,就反复多次训练吧。
在这里插入图片描述
耐心等着结束,20版本以后可以支持cpu训练,之前的只能用gpu训练,我用的20的代码整理的,所以这里我用了cpu训练,本身电脑也必将卡,设置cpu与gpu的关键一句就是。

set_dl_classifier_param (DLModelHandle, 'runtime', 'cpu')

有几个参数需要讲述一下,一个是图片缩放,缩放的图片太大,会训练很慢,一般电脑也就是能够接受几百的图,太大就带不动了,同样太大的话,在预测阶段也会非常慢,不利于工业上的速度效率,太小也是不可以的,越小的话,特征丢失的多,所以不容易训练处好的结果,至于具体多少,可以重复多次去看看哪个效果而去确定,并不唯一。除此学习率、batchsize在下边代码中我有注释,一句话,如果你并不是很清楚这些含义,那么就改一个尺寸就算了,其他都用下边这些参数吧。除了这几个参数,其他没必要弄懂,因为本身就是黑匣子,也看不到里边。

*预训练模型 halcon本身提供的,选择哪这三个都可以
Model := 'pretrained_dl_classifier_compact.hdl'
* Model := 'pretrained_dl_classifier_enhanced.hdl'
* Model := 'pretrained_dl_classifier_resnet50.hdl'

*非首次训练,也就是第二次想再训练,可以用第一次训练输出的,第一训练会输出这个model_best.hdl
* Model := 'model_best.hdl'
dev_update_off ()
dev_close_window ()

*训练迭代次数,100次,当然也可以更大,可以设置100,重复训练几次
NumEpochs := 100
学习率,一般默认就可以了
LearningRate := 0.0001*1
LearningRateStepEveryNthEpoch := 5
tuple_pow(10, (-2.0 * LearningRateStepEveryNthEpoch / NumEpochs), LearningRateStepRatio)
list_files('images', 'directories', Directories)
tuple_regexp_replace(Directories, 'images', 'data', PreDirectories)
tuple_insert(PreDirectories,0,'data',PreDirectories)
file_exists ('data', FileExists) 
if (FileExists)
    remove_dir_recursively('data')
endif
for I := 0 to |PreDirectories| - 1 by 1
    make_dir (PreDirectories[I])
endfor

read_dl_classifier (Model, DLModelHandle)
list_image_files ('images', 'default', ['recursive','follow_links'], ImageFiles)
read_image (Image, ImageFiles[0])
get_image_size(Image, Width, Height)

*图像缩放 可以根据具体调 一般电脑性能有限,可以调小一些
Width  := 64*3
Height := 64*3

count_channels(Image, Channels)
set_dl_classifier_param (DLModelHandle, 'image_num_channels', Channels)
set_dl_classifier_param (DLModelHandle, 'image_dimensions', [Width,Height,Channels])
get_dl_classifier_param (DLModelHandle, 'image_dimensions', ImageDimensions)
for I := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[I])
    preprocess (Image, ImagePreprocessed, DLModelHandle)
    tuple_regexp_replace(ImageFiles[I], 'images', 'data', Name)
    write_image (ImagePreprocessed, 'tiff', 0, Name)
endfor
read_dl_classifier_data_set ('data', 'last_folder', ImageFiles, Labels, LabelsIndices, Classes)
set_dl_classifier_param (DLModelHandle, 'classes', Classes)
split_dl_classifier_data_set (ImageFiles, Labels, 80, 20, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, TestImages, TestLabels)
set_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate)

*每次送进去的样本的数目 一般是1,2,4,6,8,16等,但是我的电脑性能一般,就用1了,越大越好,但是太大不容易收敛,
*性能一般的电脑,反而建议给1
BatchSize:=8
*设置gpu或者cpu,直接改后边即可
set_dl_classifier_param (DLModelHandle, 'runtime', 'cpu')
set_dl_classifier_param (DLModelHandle, 'batch_size', BatchSize)
set_dl_classifier_param (DLModelHandle, 'runtime_init', 'immediately')
dev_open_window(0, 0, 800, 600, 'black', WindowHandle)
set_font(WindowHandle, 'default-16')
TrainingErrors := []
ValidationErrors := []
LearningRates := []
Epochs := []
LossByIteration := []
MinValidationError := 1
NumBatchesInEpoch := int(floor(|TrainingImages| / real(BatchSize)))
PlottedIterations := round([NumBatchesInEpoch * [0:1:NumEpochs - 1], (NumBatchesInEpoch * NumEpochs) - 1])
select_percentage_dl_classifier_data (TrainingImages, TrainingLabels, 20, TrainingImagesSelected, TrainingLabelsSelected)
tuple_gen_sequence (0, |TrainingImages| - 1, 1, TrainSequence)
for Epoch := 0 to NumEpochs - 1 by 1
    tuple_shuffle (TrainSequence, TrainSequence)
    for Iteration := 0 to NumBatchesInEpoch - 1 by 1
        * Select a shuffled batch every epoch
        BatchStart := Iteration * BatchSize
        BatchEnd := BatchStart + (BatchSize - 1)
        BatchIndices := TrainSequence[BatchStart:BatchEnd]
        BatchImageFiles := TrainingImages[BatchIndices]
        BatchLabels := TrainingLabels[BatchIndices]
        read_image (BatchImages, BatchImageFiles)
        GenParamName := 'mirror'
        GenParamValue := 'rc'
        augment_images (BatchImages, BatchImages, GenParamName, GenParamValue)
        train_dl_classifier_batch (BatchImages, DLModelHandle, BatchLabels, DLClassifierTrainResultHandle)
        get_dl_classifier_train_result (DLClassifierTrainResultHandle, 'loss', Loss)
        LossByIteration := [LossByIteration,Loss]
        CurrentIteration := int(Iteration + (NumBatchesInEpoch * Epoch))
        if (sum(CurrentIteration [==] PlottedIterations))
            apply_dl_classifier_batchwise (TrainingImagesSelected, DLModelHandle, TrainingDLClassifierResultIDs, TrainingPredictedLabels, TrainingConfidences)
            apply_dl_classifier_batchwise (ValidationImages, DLModelHandle, ValidationDLClassifierResultIDs, ValidationPredictedLabels, ValidationConfidences)
            evaluate_dl_classifier (TrainingLabelsSelected, DLModelHandle, TrainingDLClassifierResultIDs, 'top1_error', 'global', TrainingTop1Error)
            evaluate_dl_classifier (ValidationLabels, DLModelHandle, ValidationDLClassifierResultIDs, 'top1_error', 'global', ValidationTop1Error)
            get_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate)
            TrainingErrors := [TrainingErrors,TrainingTop1Error]
            ValidationErrors := [ValidationErrors,ValidationTop1Error]
            LearningRates := [LearningRates,LearningRate]
            Epochs := [Epochs,PlottedIterations[|Epochs|] / real(NumBatchesInEpoch)]
            plot_dl_classifier_training_progress (TrainingErrors, ValidationErrors, LearningRates, Epochs, NumEpochs, WindowHandle)
            if (ValidationTop1Error <= MinValidationError)
                write_dl_classifier (DLModelHandle, 'model_best.hdl')
                MinValidationError := ValidationTop1Error
            endif
        endif
    endfor
    * Reduce the learning rate every nth epoch.
    if ((Epoch + 1) % LearningRateStepEveryNthEpoch == 0)
        set_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate * LearningRateStepRatio)
        get_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate)
    endif
endfor
dump_window(WindowHandle, 'png', 'train')

训练完成后,你会发现多处一个best_model.hdl权重,这就是我们训练的结果,后边预测也只需要这个,也就是训练本地完成,你将来用在生产线啥的,只需要这个就行了。
在这里插入图片描述
如果需要加入样本或者再次训练,因为重复训练会提高效果,那么第一行注释,后边取消注释即可。
在这里插入图片描述
#**4、检测
  既然已经训练好,那就拿去检测,到底如何用?
首先建一个test文件夹,放几张图片进去,因为用这个测试。

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

*测试图路径
TestImageDir := 'test/'
*可信度
ClassifyThreshold := 0.5
dev_update_off()

read_dl_classifier ('model_best.hdl', DLModelHandle)
set_dl_classifier_param (DLModelHandle, 'batch_size', 1)
*设置cpu
set_dl_classifier_param (DLModelHandle, 'runtime', 'cpu')
get_dl_classifier_param(DLModelHandle, 'image_dimensions', ImageSize)
get_dl_classifier_param(DLModelHandle, 'classes', Classes)

list_image_files (TestImageDir, 'default', 'recursive', ImageFiles)
read_image (Image, ImageFiles[0])
get_image_size(Image, Width, Height)
count_channels(Image, Channels)
Seconds := 0
for I := 0 to |ImageFiles|-1 by 1
    read_image (Image, ImageFiles[I])
    *缩放图片到预处理图片大小
    zoom_image_size (Image, ImagePreprocessed, ImageSize[0], ImageSize[1], 'constant')
    convert_image_type (ImagePreprocessed, ImagePreprocessed, 'real')
    scale_image (ImagePreprocessed, ImagePreprocessed, 1, -127)
    *深度学习检测
    apply_dl_classifier (ImagePreprocessed, DLModelHandle, DLResult)
    *获取检测结果
    get_dl_classifier_result (DLResult, 'all', 'predicted_classes', PredictedClass)
    get_dl_classifier_result (DLResult, 'all', 'confidences', Confidence)
    *显示结果
    dev_display (Image)
    disp_message (WindowHandle, PredictedClass, 'window', 0, 0, 'black', 'true')
    stop ()
endfor
``![在这里插入图片描述](https://img-blog.csdnimg.cn/eef4d1fed63d477caa43ab17ca1baa80.png)

这样就完成喽。效果就得多次训练,靠自己把握了。重复训练会有效提高检测率的。

**以上纯属个人理解,如有理解不到位地方,欢迎留言交流。看具体浏览量,再看情况是否继续更新吧。**

Halcon是一款强大的机器视觉软件,可以用于深度学习分类任务。下面是一个简单的示例,介绍如何使用Halcon实现深度学习分类。 1. 准备数据集 首先,我们需要准备一个数据集。这个数据集可以是一个文件夹,里面包含不同类别的图像。在这个示例中,我们使用了一个包含4个类别的图像数据集:苹果、香蕉、橙子和西瓜。 2. 训练模型 在Halcon中,我们可以使用Deep Learning Assistant来训练模型。打开Deep Learning Assistant,选择“Create new project”,然后按照提示进行操作。在这个示例中,我们选择了“Classification”作为任务类型,然后将数据集导入到Halcon中。 在训练模型之前,我们需要对数据集进行一些预处理。在这个示例中,我们对图像进行了缩放和归一化处理。然后,我们选择了一个预训练的模型(例如ResNet50),并对其进行微调。最后,我们将模型保存到本地。 3. 测试模型 在训练模型之后,我们可以使用Halcon测试模型。我们可以选择一张图像,并使用模型来预测它所属的类别。在这个示例中,我们选择了一张香蕉的图像,并将其导入到Halcon中。然后,我们使用已经训练好的模型来预测该图像所属的类别。预测结果为“banana”。 这就是一个简单的Halcon深度学习分类实例。通过使用Halcon,我们可以轻松地训练和测试深度学习模型,以解决各种机器视觉任务。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值