halcon脚本-深度学习【图像分类】


前言

本文讲述基于halcon实现图像分类的功能,本人对halcon例子稍作修改,更容易理解训练过程。


一、数据集准备

本文数据集使用中国象棋数据,目标是对中国象棋中的棋子分类,识别各种象棋,数据集如图所示:
在这里插入图片描述
在这里插入图片描述
每个文件夹的棋子都类似上边的文件夹路径,并且图像分类不需要使用标注


二、halcon训练准备工作

1.变量/程序初始化

一些重要变量如下:

* halcon提供的网络结构,这里有3种
Base_ModelFile := ['./DL_BaseModel/BaseModel_cls_compact.dat','./DL_BaseModel/BaseModel_cls_enhanced.dat','./DL_BaseModel/BaseModel_cls_resnet50.dat']
* 训练结束后保存的模型
ModelFile:='./best_Cls.dat'
* 训练图片的路径
ImageDir := './DataSet/DataImage_Cls/DataImage'
* 验证/测试 图片的路径
ValDir := './DataSet/DataImage_Cls/test'
* 选择模型
ModelType := 0
* 输入模型的大小
ImageSize := 224
* 训练临时文件夹
OutPutDir:='./DataSet/Temp_ClsDataSet'
* 每次迭代数
BatchSize := 4
* 学习率
learning_rate:=0.0001
* 迭代次数
NumEpochs := 100

2.数据预处理

根据结构重新新图像文件,此处是对图像预处理

parse_filename (RawImageFiles, BaseNames, Extensions, Directories)
ObjectFilesOut := OutPutDir + '/' + Labels + '/' + BaseNames + '.hobj'
for I := 0 to |RawImageFiles| - 1 by 1
    read_image (Image, RawImageFiles[I])
    zoom_image_size (Image, ImageZoom, ImageSize, ImageSize, 'constant')
    scale_image_max (ImageZoom, ImageZoom)
    convert_image_type (ImageZoom, ImageZoom, 'real')
    * 保存为本地图片
    write_object (ImageZoom, ObjectFilesOut[I])
endfor
dev_clear_window ()

三、halcon训练过程

1.加载模型

open_file (Base_ModelFile[ModelType], 'input_binary', FileHandle)
fread_serialized_item (FileHandle, SerializedItemHandle)
close_file (FileHandle)
deserialize_dl_classifier (SerializedItemHandle, DLClassifierHandle)

2.读取数据集

读取数据集,并分割数据集

read_dl_classifier_data_set (OutPutDir, 'last_folder', ImageFiles, Labels, LabelsIndices, Classes)
TrainingPercent := 85
ValidationPercent := 15
split_dl_classifier_data_set (ImageFiles, Labels, TrainingPercent, ValidationPercent, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, TestImages, TestLabels)

3.模型训练

for Epoch := 0 to NumEpochs - 1 by 1
    tuple_shuffle (TrainSequence, TrainSequence)
    for Iteration := 0 to NumBatchesInEpoch - 1 by 1
        BatchStart := Iteration * BatchSize
        BatchEnd := BatchStart + (BatchSize - 1)
        BatchIndices := TrainSequence[BatchStart:BatchEnd]
        BatchImageFiles := TrainingImages[BatchIndices]
        BatchLabels := TrainingLabels[BatchIndices]
        read_image (BatchImages, BatchImageFiles)
        augment_images (BatchImages, BatchImages, 'mirror', 'rc')
        try
            train_dl_classifier_batch (BatchImages, DLClassifierHandle, BatchLabels, DLClassifierTrainResultHandle)
        catch (Exception)
            train_dl_classifier_batch (BatchImages, DLClassifierHandle, BatchLabels, DLClassifierTrainResultHandle)
        endtry
        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, DLClassifierHandle, TrainingDLClassifierResultIDs, TrainingPredictedLabels, TrainingConfidences)
            apply_dl_classifier_batchwise (ValidationImages, DLClassifierHandle, ValidationDLClassifierResultIDs, ValidationPredictedLabels, ValidationConfidences)
            evaluate_dl_classifier (TrainingLabelsSelected, DLClassifierHandle, TrainingDLClassifierResultIDs, 'top1_error', 'global', TrainingTop1Error)
            evaluate_dl_classifier (ValidationLabels, DLClassifierHandle, ValidationDLClassifierResultIDs, 'top1_error', 'global', ValidationTop1Error)
            TrainingErrors := [TrainingErrors,TrainingTop1Error]
            ValidationErrors := [ValidationErrors,ValidationTop1Error]
            
            if (ValidationTop1Error <= MinValidationError)
                serialize_dl_classifier (DLClassifierHandle, SerializedItemHandle)
                open_file (ModelFile, 'output_binary', FileHandle)
                fwrite_serialized_item (FileHandle, SerializedItemHandle)
                close_file (FileHandle)
                MinValidationError := ValidationTop1Error
            endif
        endif
    endfor
endfor

这里有两个变量:
TrainingConfidences
ValidationConfidences
保存了训练过程中的损失值,如果能力可以可以按照此数据进行画图


四、模型测试

for Index := 0 to |test_img_file|-1 by 1
    ImageFile := test_img_file[Index]
    read_image (Image, ImageFile)
    convert_image_type (Image, Image, 'real')
    apply_dl_classifier (Image, DLClassifierHandle, DLClassifierResultHandle)
    get_dl_classifier_result (DLClassifierResultHandle, 'all', 'predicted_classes', PredictedClass)
    dev_display (Image)
    Text := 'Predicted class: ' + PredictedClass
    dev_disp_text (Text, 'window', 'top', 'left', 'white', 'box', 'false')
    stop()
endfor

效果图如下:
在这里插入图片描述


总结

好的,那么对于这个问题,我们需要使用 C# 与 Halcon 进行深度学习图像分类。在这里,我将提供一个简单的示例代码,以便您开始学习。但是,由于深度学习图像分类的复杂性,这个示例只是一个入门级别的例子,你需要根据实际需求进行修改。 首先,我们需要准备好 Halcon 的相关环境和引用库,你可以在官网上下载 Halcon 的安装包,并按照官方文档进行安装和配置。安装完成后,我们就可以编写代码了。 下面是一个使用 Halcon 进行图像分类的示例代码: ```csharp using HalconDotNet; class Program { static void Main(string[] args) { // 读入图像 HImage image = new HImage("test.jpg"); // 创建深度学习模型 HDeepLearningModel model = new HDeepLearningModel("model.hdl"); // 进行图像分类 HImage result = model.ApplyDeepLearningClassificaton(image); // 输出分类结果 HTuple values; result.GetGrayval(0, 0, out values); Console.WriteLine("分类结果为:" + values[0].I); } } ``` 在这段代码中,我们首先使用 HImage 类读入图像,然后使用 HDeepLearningModel 类创建深度学习模型,并将图像传入模型中进行分类。最后,我们使用 GetGrayval 方法获取分类结果,并输出到控制台上。 需要注意的是,这个示例代码中,我们使用的是已经训练好的深度学习模型,你需要根据自己的需求训练自己的模型,并将训练好的模型保存为 .hdl 文件格式。 希望这个示例代码能够帮助到你,祝你学习愉快!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的广东仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值