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

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

#**3、训练
  本身样例中也有例子,但是显示的东西太多,刚接触的可能会看晕,我直接把有用的整理了一下,也就是训练.dev,直接F5运行就行,一段时间就训练完事了,傻瓜式操作。F5后如果报错,可能是由于找不到hdl,直接电脑搜索一下,放到这个同一文件夹下就可以。
Halcon深度学习介绍(二)---分类_第4张图片
同时我们会发现多处了一个data文件夹,这里边就是对ok、ng图片预处理后的图片,中间文件,不需要我们管,别管他。
这样就开始训练了,左上角的数越小越好奥。不够小,就反复多次训练吧。
Halcon深度学习介绍(二)---分类_第5张图片
耐心等着结束,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权重,这就是我们训练的结果,后边预测也只需要这个,也就是训练本地完成,你将来用在生产线啥的,只需要这个就行了。
Halcon深度学习介绍(二)---分类_第6张图片
如果需要加入样本或者再次训练,因为重复训练会提高效果,那么第一行注释,后边取消注释即可。
Halcon深度学习介绍(二)---分类_第7张图片
#**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深度学习,深度学习,分类,人工智能)