halcon的深度学习只做3件事,即“分类”,“对象检测”,“分割”。
下面是“对象检测”的例子。
这个例子是检测香烟的品牌。
下图是训练完成后实际检测的效果。
训练时注意下面几个问题:
(一)图像宽高要求:
1.图像宽高需是64的整数倍;
2.最好在图像标注之前,就对图像缩放或裁剪至合适宽高;
3.如果已在不符合要求的图像上完成标注,那么需要把图像扩充至合适宽高;避免单纯对图像进行缩放或裁剪,导致图像与标注坐标不一致影响标注准确性;
(二)深度学习对gpu的要求
深度学习在训练阶段需要使用gpu,推理阶段可以使用cpu,需要加上下面的代码:
set_dl_model_param(DLModelHandle, 'runtime', 'cpu')
但是要注意的是:
目前勇哥发现一个问题,同一组图片,经gpu训练后,用gpu推理结果是正确的,但是如果改用cpu推理则结果不正确,有很大差别。
暂时还不知道为什么!
而且cpu推理速度极慢,在勇哥的10核20线程的机器上面(cpu占用100%),还不到6帧。在勇哥的工作笔记本i5 7600上面更惨,才0.3帧。
而在最差的古老显卡gtx 750ti上面,轻松跑到38帧。可见深度学习cpu计算根本就是一个虚头,计算速度和显卡比完全不在一个数量级上面。
深度学习对gpu的计算能力要求极高,一块rtx2080ti显卡可以极大的提升计算能力。
下图可以看到训练的过程看上去要接近4小时,但这个时间不准确。
实际在勇哥的破显卡gtx750ti上面,大约1小时训练完成。
所有分类所占的比率。
Model := 'pretrained_dl_classifier_compact.hdl' *Model := 'pretrained_dl_classifier_enhanced.hdl' *Model := 'pretrained_dl_classifier_resnet50.hdl' *Model := 'model_best.hdl' AspectRatios := [0.5, 1, 2] dev_update_off () dev_close_window () NumEpochs := 200 LearningRate := 0.001*1 read_dict('dataset.hdict',[], [], DLDataset) get_dict_tuple (DLDataset, 'class_ids', ClassIDs) get_dict_tuple (DLDataset, 'class_names', ClassNames) list_image_files ('images', 'default', 'recursive', ImageFiles) read_image (Image, ImageFiles[0]) get_image_size(Image, Width, Height) Scale := 1 Width := (Width / Scale) / 64 * 64 Height := (Height / Scale) / 64 * 64 count_channels(Image, Channels) if(Model == 'model_best.hdl') read_dl_model('model_best.hdl', DLModelHandle) else create_dict (DLModelDetectionParam) set_dict_tuple (DLModelDetectionParam, 'image_dimensions', [Width, Height, Channels]) set_dict_tuple (DLModelDetectionParam, 'min_level', 2) set_dict_tuple (DLModelDetectionParam, 'max_level', 4) set_dict_tuple (DLModelDetectionParam, 'num_subscales', 3) set_dict_tuple (DLModelDetectionParam, 'aspect_ratios', AspectRatios) *set_dict_tuple (DLModelDetectionParam, 'capacity', 'medium') set_dict_tuple (DLModelDetectionParam, 'capacity', 'high') get_dict_tuple (DLDataset, 'class_ids', ClassIDs) set_dict_tuple (DLModelDetectionParam, 'class_ids', ClassIDs) create_dl_model_detection (Model, |ClassIDs|, DLModelDetectionParam, DLModelHandle) endif split_dl_dataset (DLDataset, 70, 20, []) create_dict (PreprocessSettings) set_dict_tuple (PreprocessSettings, 'overwrite_files', true) create_dl_preprocess_param_from_model (DLModelHandle, 'false', 'full_domain', [], [], [], DLPreprocessParam) preprocess_dl_dataset (DLDataset, 'dataset', DLPreprocessParam, PreprocessSettings, DLDatasetFileName) * Inspect several randomly selected preprocessed DLSamples visually. create_dict (WindowDict) get_dict_tuple (DLDataset, 'samples', DatasetSamples) for Index := 0 to |DatasetSamples|-1 by 1 SampleIndex := round(rand(1) * (|DatasetSamples| - 1)) read_dl_samples (DLDataset, SampleIndex, DLSample) dev_display_dl_data (DLSample, [], DLDataset, 'bbox_ground_truth', [], WindowDict) endfor *2.) TRAIN *** tuple_min2(round(|DatasetSamples|*0.7), 64, BatchSize) set_dl_model_param_max_gpu_batch_size (DLModelHandle, BatchSize) set_dl_model_param (DLModelHandle, 'learning_rate', LearningRate) set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately') create_dl_train_param (DLModelHandle, NumEpochs, 1, 'true', 42, [], [], TrainParam) train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos) dev_close_window () dev_get_window(WindowHandle) dump_window(WindowHandle, 'png', 'train') *3.) EVALUATE *** create_dict (GenParamEval) set_dict_tuple (GenParamEval, 'detailed_evaluation', true) set_dict_tuple (GenParamEval, 'show_progress', true) evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams) create_dict (DisplayMode) set_dict_tuple (DisplayMode, 'display_mode', ['pie_charts_precision','pie_charts_recall']) dev_display_detection_detailed_evaluation (EvaluationResult, EvalParams, DisplayMode, WindowDict) dev_get_window(WindowHandle) dump_window(WindowHandle, 'png', 'recall') dev_close_window () dev_get_window(WindowHandle) dump_window(WindowHandle, 'png', 'precision')
训练完成后,生成结果model_best.hdl,这个文件有137M。
未完待续。。。。

