*
 *此示例是一系列示例的一部分,该示例总结了
 * DL细分的工作流程。 它使用MVTec药丸数据集。
 *四个部分是:
 * 1.数据集预处理
 * 2.训练模型。
 * 3.评估训练后的模型。
 * 4.推断新图像。
 *
 *此示例包含第3部分:训练模型的评估。
 *请注意:此脚本需要第1部分的输出:
 * segment_pill_defects_deep_learning_1_preprocess.hdev
 *如果将UsePretrainedModel设置为:= false,则还需要第2部分的输出:
 * segment_pill_defects_deep_learning_2_train.hdev
 * 
 dev_update_off ()
 * 
 *在此示例中,评估在图形窗口中进行了说明,
 *在执行之前,将以下参数设置为false可以跳过此可视化。
 ShowExampleScreens := true
 * 
 *默认情况下,此示例使用MVTec预训练的模型。 要使用在本示例系列的第2部分中训练的模型,请将以下变量设置为false。
 UsePretrainedModel := true
 * 
 if (ShowExampleScreens)
     * 初始示例窗口和参数等。
     dev_example_init (ShowExampleScreens, UsePretrainedModel, ExampleInternals)
     * 
     * 示例系列介绍文字。********************************************************************************************************************                                      分割模型的评估是通过程序'evaluate_dl_model \'进行的。在语义分割中,每个像素都被分配了一个类ID,因此,该评估基于像素级度量,我们将在以下幻灯片中简要说明这些度量 。********************************************************************************************************************
     dev_display_screen_introduction (ExampleInternals)
     stop ()
     * 
     * 评估措施。********************************************************************************************************************                                      分割模型的评估是通过程序'evaluate_dl_model \'进行的。在语义分割中,每个像素都被分配了一个类ID,因此,该评估基于像素级度量,我们将在以下幻灯片中简要说明这些度量 。********************************************************************************************************************
    dev_display_screen_evaluation_measures (ExampleInternals)
     stop ()********************************************************************************************************************                                      评估措施:平均IoU度量平均值IoU计算为所有IoU类的平均值。IoU表示“交集”。 
 因此,将类别IoU计算为特定类别的地面真实值和结果相交面积除以区域的并集面积。平均IoU是语义分割中的标准度量,因为它结合了真假判断。 因此,此度量非常适合比较多个模型的性能。下面,以“ apple \”类的IoU类计算为例。********************************************************************************************************************    dev_display_screen_mean_iou (ExampleInternals)
     stop ()********************************************************************************************************************                                      评估指标:像素精度
 像素精度是正确分类的像素与像素总数之比。
 也可以按类计算。
 在下面,您将看到总体像素精度的计算。********************************************************************************************************************
     dev_display_screen_pixel_accuracy (ExampleInternals)
     stop ()********************************************************************************************************************                                      混淆矩阵                                              ********************************************************************************************************************
     dev_display_screen_pixel_confusion_matrix (ExampleInternals)
     stop ()
     * 
     * 开始项目********************************************************************************************************************                                      首先,我们在'test'分割中计算评估度量,这可能需要一段时间,将显示评估进度和估计时间,然后显示结果度量,最后以视觉方式检查 一些测试图像的结果。********************************************************************************************************************
     dev_display_screen_run_program (ExampleInternals)
     stop ()
     * 终止示例屏幕。
     dev_display_example_reset_windows (ExampleInternals)
 endif
 * 
 * 
 * ******************************************************
 * **    评估的路径和参数   ***
 * ******************************************************
 * 
 * Paths.
 * 
 * Project directory for any outputs written by HALCON.
 ExampleDataDir := 'segment_pill_defects_data'
 * File path of the preprocessed DLDataset.
 DLDatasetCacheFile := ExampleDataDir + '/dldataset_pill_400x400/dl_dataset.hdict'
 * 
 if (UsePretrainedModel)
     * Use the pretrained model shipping with HALCON.
     RetrainedModelFileName := 'segment_pill_defects.hdl'
 else
     * Path of the retrained segmentation model.
     RetrainedModelFileName := ExampleDataDir + '/best_dl_model_segmentation.hdl'
 endif
 * 
 * Evaluation parameters.
 * 
 * Evaluation measures.
 SegmentationMeasures := ['mean_iou','pixel_accuracy','class_pixel_accuracy','pixel_confusion_matrix']
 * Batch size used during evaluation.
 BatchSize := 1
 * The evaluation can be performed on GPU or CPU.
 UseGPU := true
 * 
 * Display some segmentation results after determining the best model.
 NumDisplay := 10
 * 
 * 
 * **********************************
 * **   Evaluation of the model   ***
 * **********************************
 * 
 * Check availability of GPU mode.
 if (UseGPU)
     get_system ('cuda_loaded', CudaLoaded)
     get_system ('cudnn_loaded', CuDNNLoaded)
     get_system ('cublas_loaded', CuBlasLoaded)
     if (not (CudaLoaded == 'true' and CuDNNLoaded == 'true' and CuBlasLoaded == 'true'))
         UseGPU := false
     endif
 endif
 * 
 * Check if all necessary files exist.
 check_model_availability (ExampleDataDir, DLDatasetCacheFile, RetrainedModelFileName, UsePretrainedModel)
 * 
 * Read the retrained model.
 read_dl_model (RetrainedModelFileName, DLModelHandle)
 * 
 * Initialize the model.
 if (not UseGPU)
     set_dl_model_param (DLModelHandle, 'runtime', 'cpu')
 endif
 set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately')
 * 
 * Read the preprocessed DLDataset file.
 read_dict (DLDatasetCacheFile, [], [], DLDataset)
 * 
 * Set parameters for evaluation.
 create_dict (GenParamEval)
 set_dict_tuple (GenParamEval, 'measures', SegmentationMeasures)
 set_dict_tuple (GenParamEval, 'show_progress', 'true')
 * 
 set_dl_model_param (DLModelHandle, 'batch_size', BatchSize)
 * 
 * Evaluate the retrained model.
 evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams)
 * 
 * 
 * ******************************
 * **   Display the results   ***
 * ******************************
 * 
 * Display measures.
 create_dict (WindowHandleDict)
 create_dict (GenParamEvalDisplay)
 set_dict_tuple (GenParamEvalDisplay, 'display_mode', ['measures','absolute_confusion_matrix'])
 dev_display_segmentation_evaluation (EvaluationResult, EvalParams, GenParamEvalDisplay, WindowHandleDict)
 * 
 dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', 'box', 'true')
 stop ()
 * 
 * Close window handles.
 dev_display_dl_data_close_windows (WindowHandleDict)
 * 
 * 
 * **************************************
 * **   Visual inspection of images   ***
 * **************************************
 * 
 * Evaluate the performance of the model qualitatively
 * by visual inspection of images.
 * Select test images randomly.
 get_dict_tuple (DLDataset, 'samples', DatasetSamples)
 find_dl_samples (DatasetSamples, 'split', 'test', 'match', SampleIndices)
 tuple_shuffle (SampleIndices, ShuffledIndices)
 * Read the selected samples.
 read_dl_samples (DLDataset, ShuffledIndices[0:NumDisplay - 1], DLSampleBatch)
 * 
 * Set parameters for visualization of sample images.
 create_dict (WindowHandleDict)
 create_dict (GenParamDisplay)
 set_dict_tuple (GenParamDisplay, 'segmentation_exclude_class_ids', 0)
 set_dict_tuple (GenParamDisplay, 'segmentation_transparency', '80')
 * 
 * Set batch size of the model to 1.
 set_dl_model_param (DLModelHandle, 'batch_size', 1)
 * 
 * Apply the retrained model and visualize the results.
 for SampleIndex := 0 to NumDisplay - 1 by 1
     * 
     * Apply the model.
     apply_dl_model (DLModelHandle, DLSampleBatch[SampleIndex], [], DLResult)
     * 
     * Display the result.
     dev_display_dl_data (DLSampleBatch[SampleIndex], DLResult, DLDataset, ['segmentation_image_ground_truth','segmentation_image_result'], GenParamDisplay, WindowHandleDict)
     * 
     dev_display_continue_message (WindowHandleDict)
     stop ()
 endfor
 * 
 * Close the windows.
 dev_display_dl_data_close_windows (WindowHandleDict)
 * 
 if (ShowExampleScreens)
     * Display final screen.
     dev_display_screen_final (ExampleInternals)
     stop ()
     * Close example windows.
     dev_close_example_windows (ExampleInternals)
 endif