halcon19 深度学习--分类(by shany shang)

硬件环境:

   Think_pad T480
   GPU:英伟达 MX150
   CPU: Intel i5 8th 

软件环境:

   windows 10 X64
   halcon 19.05
   halcon deepleaening 19.05
   CUDA10
   CUDNN7.3

源代码:

  • This example shows how to train a deep learning fruit classifier, along with
  • a short overview of the necessary steps.
  • Initialization.
    dev_update_off ()
    dev_close_window ()
    WindowWidth := 800
    WindowHeight := 600
    dev_open_window_fit_size (0, 0, WindowWidth, WindowHeight, -1, -1, WindowHandle)
    set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)
  • Some procedures use a random number generator. Set the seed for reproducibility.
    set_system (‘seed_rand’, 42)
  • Introduction text.
    dev_disp_introduction_text ()
    stop ()
    dev_close_window ()
    dev_resize_window_fit_size (0, 0, WindowWidth, WindowHeight, -1, -1)
    dev_clear_window ()
  • ** TRAINING **
  • Read one of the pretrained networks.
    read_dl_classifier (‘pretrained_dl_classifier_compact.hdl’, DLClassifierHandle)
  • Path to directory with images.
    *RawDataFolder := ‘food/’ + [‘apple_braeburn’,‘apple_golden_delicious’,‘apple_topaz’,‘peach’,‘pear’]
    RawDataFolder := ‘E:/Deeplearning/shape/’ + [‘circle’,‘line’,‘square’,‘star’,‘tangle’]
  • Get the raw data set with labels.
    *使用正则化表达式提取所在文件夹的名称作为标签使用
    read_dl_classifier_data_set (RawDataFolder, ‘last_folder’, RawImageFiles, Labels, LabelIndices, Classes)
  • Path of output directory for preprocessed data set.
    PreprocessedFolder := ‘shape_preprocessed’
  • Set to true to overwrite existing images.
    OverwritePreprocessingFolder := false
  • By default, we will remove the folder with the preprocessed data.
  • In a real application you might want to keep this data (if the
  • preprocessing does not change to save time).
    RemovePreprocessingAfterExample := false
  • If the preprocessed has been generated already,
  • we skip this part.
    file_exists (PreprocessedFolder, FileExists)
    if (not FileExists or OverwritePreprocessingFolder)
    • Preprocessing of the raw data.
      if (FileExists)
      remove_dir_recursively (PreprocessedFolder)
      endif
    • Create output directories.
      make_dir (PreprocessedFolder)
      for I := 0 to |Classes| - 1 by 1
      make_dir (PreprocessedFolder + ‘/’ + Classes[I])
      endfor
    • Define output file names.
      parse_filename (RawImageFiles, BaseNames, Extensions, Directories)
      ObjectFilesOut := PreprocessedFolder + ‘/’ + Labels + ‘/’ + BaseNames + ‘.hobj’
    • Check if output file names
    • overlap in the preprocessed folder.
    • This is just a sanity check.
      check_output_file_names_for_duplicates (RawImageFiles, ObjectFilesOut)
    • Preprocess images and save them as hobj files.
      for I := 0 to |RawImageFiles| - 1 by 1
      read_image (Image, RawImageFiles[I])
      • Preprocess the image with a custom procedure
      • in order to remove the background.
        preprocess_dl_fruit_example (Image, ImagePreprocessed, DLClassifierHandle)
      • Write preprocessed image to hobj file.
        write_object (ImagePreprocessed, ObjectFilesOut[I])
        dev_disp_preprocessing_progress (I, RawImageFiles, PreprocessedFolder, WindowHandle)
        endfor
        dev_clear_window ()
        dev_disp_text (‘Preprocessing done.’, ‘window’, ‘top’, ‘left’, ‘black’, [], [])
        endif
    1. Split data into training, validation, and test set.
  • Read the data, i.e., the paths of the images and their respective ground truth labels.
    read_dl_classifier_data_set (PreprocessedFolder, ‘last_folder’, ImageFiles, Labels, LabelsIndices, Classes)
  • Split the data into three subsets,
  • for training 70%, validation 15%, and testing 15%.
    TrainingPercent := 70
    ValidationPercent := 15
    split_dl_classifier_data_set (ImageFiles, Labels, TrainingPercent, ValidationPercent, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, TestImages, TestLabels)
  • Set training hyper-parameters.
  • In order to retrain the neural network, we have to specify
  • the class names of our classification problem.
    *设置所有类型
    set_dl_classifier_param (DLClassifierHandle, ‘classes’, Classes)
    *设置训练bacth大小
  • Set the batch size.
    BatchSize := 16
    set_dl_classifier_param (DLClassifierHandle, ‘batch_size’, BatchSize)
  • Try to initialize the runtime environment.
    try
    set_dl_classifier_param (DLClassifierHandle, ‘runtime_init’, ‘immediately’)
    catch (Exception)
    dev_disp_error_text (Exception)
    if (RemovePreprocessingAfterExample and Exception[0] != 4104)
    remove_dir_recursively (PreprocessedFolder)
    dev_disp_text (‘Preprocessed data in folder "’ + PreprocessedFolder + ‘" have been deleted.’, ‘window’, ‘bottom’, ‘left’, ‘black’, [], [])
    endif
    stop ()
    endtry
  • For this data set, an initial learning rate of 0.001
  • has proven to yield good results.
    InitialLearningRate := 0.001
    set_dl_classifier_param (DLClassifierHandle, ‘learning_rate’, InitialLearningRate)
  • In this example, we reduce the learning rate
  • by a factor of 1/10 every 4th epoch.
    LearningRateStepEveryNthEpoch := 30
    LearningRateStepRatio := 0.1
  • We iterate 100 times over the full training set.
    NumEpochs := 100
  • Train the classifier.

dev_clear_window ()
dev_disp_text (‘Training has started…’, ‘window’, ‘top’, ‘left’, ‘black’, [], [])
*
PlotEveryNthEpoch := 4
FileName := ‘classifier_fruit.hdl’
train_fruit_classifier (DLClassifierHandle, FileName, NumEpochs, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, LearningRateStepEveryNthEpoch, LearningRateStepRatio, PlotEveryNthEpoch, WindowHandle)
dev_disp_text (‘Press Run (F5) to continue’, ‘window’, ‘bottom’, ‘right’, ‘black’, [], [])
stop ()
read_dl_classifier (FileName, DLClassifierHandle)
*

  • Compute the confusion matrix for the validation data set.
    get_predicted_classes (ValidationImages, DLClassifierHandle, PredictedClassesValidation)
    gen_confusion_matrix (ValidationLabels, PredictedClassesValidation, [], [], WindowHandle, ConfusionMatrix)
    dev_disp_text (‘Validation data’, ‘window’, ‘top’, ‘left’, ‘gray’, ‘box’, ‘false’)
    dev_disp_text (‘Press Run (F5) to continue’, ‘window’, ‘bottom’, ‘right’, ‘black’, [], [])
    stop ()
    dev_clear_window ()
  • ** INFERENCE **
  • This part shows a typical inference scenario.
  • Read the classifier.
    read_dl_classifier (FileName, DLClassifierHandle)
  • If it is not possible to accumulate more than one image
  • at a time the batch size should be set to 1.
    set_dl_classifier_param (DLClassifierHandle, ‘batch_size’, 1)
  • Set the runtime to ‘cpu’ to perform the inference on the
  • CPU, if this is possible on the current hardware.
  • (see the system requirements in the Installation Guide)
    try
    set_dl_classifier_param (DLClassifierHandle, ‘runtime’, ‘cpu’)
    Runtime := ‘cpu’
    catch (Exception)
    • Keep the ‘gpu’ runtime if switching to ‘cpu’ failed.
      Runtime := ‘gpu’
      endtry
  • This initializes the runtime environment immediately.
    set_dl_classifier_param (DLClassifierHandle, ‘runtime_init’, ‘immediately’)

dev_resize_window_fit_size (0, 0, WindowWidth, WindowHeight, -1, -1)
dev_disp_inference_text (Runtime)
stop ()

  • Read / acquire images in a loop and classify them.
    for Index := 0 to 20 by 1
    ImageFile := RawImageFiles[floor(rand(1) * |RawImageFiles|)]
    read_image (Image, ImageFile)
    dev_resize_window_fit_image (Image, 0, 0, -1, -1)
    preprocess_dl_fruit_example (Image, ImagePreprocessed, DLClassifierHandle)
    apply_dl_classifier (ImagePreprocessed, 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’)
    dev_disp_text (‘Press Run (F5) to continue’, ‘window’, ‘bottom’, ‘right’, ‘black’, [], [])
    stop ()
    endfor
    stop ()
    if (RemovePreprocessingAfterExample)
    remove_dir_recursively (PreprocessedFolder)
    dev_disp_text (‘End of program.\nPreprocessed data have been deleted.’, ‘window’, ‘bottom’, ‘right’, ‘black’, [], [])
    else
    dev_disp_text (’ End of program ', ‘window’, ‘bottom’, ‘right’, ‘black’, [], [])
    endif

你可能感兴趣的:(深度学习)