Halcon - 深度学习 - 目标分类

发布时间 2023-06-30 16:41:34作者: 广阔之海

这是一个例子,通过读取桃子和梨的图片集来进行模型训练,得到一个可以识别桃子或是梨的深度学习识别器。

*********************************************
* Halcon-深度学习-分类测试
* 这是一个例子,通过读取桃子和梨的图片集来进行模型训练,
* 得到一个可以识别桃子或是梨的深度学习识别器
*********************************************
dev_close_window ()
dev_update_off ()
set_system ('seed_rand', 42)
get_system ('example_dir', PathExample)
ImageBaseFolder := PathExample + '/images/food/'
ImageFolder := ImageBaseFolder + ['peach','pear']
OutputDir := './images/classify/'
************
* 预处理
************
read_dl_dataset_classification(ImageFolder, 'last_folder', DLDataSet)
read_dl_model ('pretrained_dl_classifier_compact.hdl', DLModelHandle)
get_dict_tuple(DLDataSet, 'class_names', ClassNames)
set_dl_model_param(DLModelHandle, 'class_names', ClassNames)
* 分割数据集,70%用作训练,15%用作验证,剩下作为测试
split_dl_dataset(DLDataSet, 70, 15, [])
create_dl_preprocess_param_from_model(DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)
create_dict(PreprocessSettings)
set_dict_tuple(PreprocessSettings, 'overwrite_files', true)
preprocess_dl_dataset(DLDataSet, OutputDir, DLPreprocessParam, PreprocessSettings, DLDatasetFileName)
************
* 训练模型
************
* 每次迭代的训练样本数,值过大可能会报内存不足
set_dl_model_param(DLModelHandle, 'batch_size', 64)
* 学习率,会影响识别准确率
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', 41, [], [], TrainParam)
train_dl_model(DLDataSet, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)
* 训练完成后将模型写入文件
write_dl_model(DLModelHandle, './trainModel.hdl')
stop ()
************
* 分类识别测试
************
dev_clear_window ()
dev_open_window (0, 0, 256, 256, 'black', WindowHandle)
set_display_font (WindowHandle, 20, '黑体', 'false', 'false')
* 读取训练模型
read_dl_model('./trainModel.hdl', DLModelHandle)
create_dl_preprocess_param_from_model(DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)
list_files('./images/test/', 'files', Files)
for I := 0 to |Files|-1 by 1
read_image (Image, Files[I])
    * 对测试图片进行识别
    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', ClassNames)
    dev_display(Image)
    dev_disp_text('识别结果:' + ClassNames[0], 'window', 'top', 'center', 'red', ['box'], ['false'])
    stop()
endfor

训练过程会有图形化输出显示:

训练完成后,在网上找了一些图片进行测试,效果还不错: