0


halcon脚本-深度学习【语义分割】

文章目录


前言

本文讲解使用halcon的语义分割是使用步骤,标注工具不使用halcon提供的标注工具,而是使用各个深度学习框架都使用的labelMe工具,然后使用hde脚本以及python脚本转化为标准的halcon训练及文件
本文涉及数据标注、数据转化、训练、评估、预测几个模块。


一、数据标注

语义分割数据标注主要使用labelImg工具,python安装只需要:pip install labelme 即可,然后在命令提示符输入:labelme即可,如图:
在这里插入图片描述
在这里插入图片描述
在这里只需要修改“OpenDir“,“OpenDir“主要是存放图片需要标注的路径
选择好路径之后即可开始绘制:
在这里插入图片描述

我在平时标注的时候快捷键一般只用到:
createpolygons:(ctrl+N)开始绘制
a:上一张
d:下一张
绘制过程如图:
在这里插入图片描述
就只需要一次把目标绘制完成即可。
标注完的文件如图:
在这里插入图片描述


二、halcon训练预测流程步骤

本模块主要是做数据转换,转化为标准的halcon所需的训练文件

1.Json文件转label图片

本功能主要是解析所有的json文件,然后分别生成对应的label图片,classes.txt的类别文件

1.解析json

读取本地json获取本次标注的所有类别,以及得到各个类别的样本数:

  1. All_label_name =['_background_']
  2. label_name_dict ={}for each_img in ImgFile:if each_img.split('.')[0]+'.json'in JsonFile:
  3. ParseDataList.append([each_img,each_img.split('.')[0]+'.json'])
  4. data = json.load(open(os.path.join(JsonDir,each_img.split('.')[0]+'.json'),encoding='gbk'))for shape insorted(data['shapes'], key=lambda x: x['label']):
  5. label_name = shape['label']if label_name notin All_label_name:
  6. All_label_name.append(label_name)if label_name notin label_name_dict:
  7. label_name_dict[label_name]=0
  8. label_name_dict[label_name]+=1else:
  9. ParseDataList.append([each_img,''])

All_label_name:得到的类别列表
label_name_dict:得到类别样本数字典

2.生成label图片

  1. imageData = data.get('imageData')ifnot imageData:withopen(ImageFile,'rb')as f:
  2. imageData = f.read()
  3. imageData = base64.b64encode(imageData).decode('utf-8')
  4. label_name_to_value ={'_background_':0}for shape insorted(data['shapes'], key=lambda x: x['label']):
  5. label_name = shape['label']if label_name in label_name_to_value:
  6. label_value = label_name_to_value[label_name]else:
  7. label_value =len(label_name_to_value)
  8. label_name_to_value[label_name]= label_value
  9. img = utils.img_b64_to_arr(imageData)
  10. lbl, _ = utils.shapes_to_label(
  11. img.shape, data['shapes'], label_name_to_value
  12. )

lbl:为图片文件,此脚本最后得到的效果图如图:
在这里插入图片描述
label的图像解析为:像素值为0的代表背景,像素值为1的代表类别1,像素值代表2的为类别2,以此类推


2.转化halcon训练所需的hdict

1.定义输入的文件路径以及输出的路径

  1. * 存放图片的文件夹路径
  2. imageDir:='../DataSet/DataImage'* 存放上边python生成的label文件夹路径
  3. LabelDir:='../DataSet/Temp_SegDataSet/Labels'* 存放类别的classes.txt路径
  4. classFile:='../DataSet/Temp_SegDataSet/classes.txt'* 生成的halcon训练所需的hdict
  5. DataList:='../DataSet/Temp_SegDataSet/dataset.hdict'

备注:此处的hdict其实只是存放各种路径便于halcon对模型进行输入图片

2.读取classes.txt文件

  1. open_file (classFile,'input', FileHandle)
  2. repeat
  3. fread_line(FileHandle, oneline, IsEOF)if(IsEOF ==1)break
  4. endif
  5. if(oneline ==' 'or oneline=='\n')continue
  6. endif
  7. tuple_regexp_replace (oneline,'\n','', oneline)
  8. tuple_length (ClassIndex, Length)
  9. ClassIndex[Length]:=Length
  10. if(Length==0)
  11. oneline:='background'
  12. endif
  13. tuple_concat (ClassID, oneline, ClassID)
  14. until (IsEOF)
  15. close_file (FileHandle)

3.设置halcon字典内容

  1. tuple_remove (LabelFiles, Index1, LabelFiles)
  2. tuple_length (ImageDict, Length)
  3. create_dict (tempImgDist)
  4. set_dict_tuple (tempImgDist,'image_id', Length)
  5. set_dict_tuple (tempImgDist,'image_file_name', BaseName_Image +'.'+ Extension_Image)
  6. set_dict_tuple (tempImgDist,'segmentation_file_name', BaseName_Label +'.'+ Extension_Label)
  7. tuple_concat (ImageDict, tempImgDist, ImageDict)

4.hdict效果展示

使用hdevelop工具可以清楚看到hdict的文件内容如图:
在这里插入图片描述


3.halcon脚本-模型训练

1.定义变量

这里主要是输入数据的变量路径

  1. * 模型选择,此处是halcon的自带模型,halcon目前此版本无法自定义模型结构
  2. Base_ModelFile:=['./DL_BaseModel/BaseModel_seg_compact.dat','./DL_BaseModel/BaseModel_seg_enhanced.dat']* 上边使用脚本的生成的hdict文件路径
  3. TrainDataSetDict:='./DataSet/Temp_SegDataSet/dataset.hdict'* 原始图片的文件存放路径
  4. ImageDir:='./DataSet/DataImage'* 上边生成的Label的文件存放路径
  5. LabelDir:='./DataSet/Temp_SegDataSet/Labels'* 训练过程中生成的文件都存放到此文件夹中,后期训练完会自动删除
  6. OutputDir:='./DataSet/Temp_SegDataSet/Output'* 模型最终保存文件
  7. ModelFile:='./best_Seg.dat'

2.模型参数定义

此变量主要是模型训练的参数定义,可自行修改

  1. * halcon提供的模型,这里选择第0个模型
  2. ModelType:=0* 是否使用GPU
  3. UseGpu:=true
  4. * 每次迭代的batch_size,-1代表程序自己判断,以最大的可能去设置,否这可自行设置,
  5. BatchSize :=-1* 学习率
  6. lr :=0.0008* 优化器的参数,可设置0.99
  7. Momentum :=0.9* 训练次数
  8. NumEpochs :=120* 学习率在本次训练中修改的次数
  9. LRChangeNum:=5* 验证集合每经过1次大迭代进行一次验证
  10. EvaluationIntervalEpochs :=1* 随机数种子
  11. SeedRand :=42* 设置模型的输入图像的宽度和高度以及通道数
  12. ImageWidth :=512
  13. ImageHeight :=512
  14. ImageNumChannels :=3* 数据像素值预处理参数
  15. ImageRangeMin :=-127
  16. ImageRangeMax :=128* 归一化
  17. NormalizationType :='true'* 巻积操作前的处理方式
  18. DomainHandling :='full_domain'

3.读取数据集

这里主要是读取数据集然后分割数据集,按85%训练集和15%的验证集划分

  1. read_dict (TrainDataSetDict,[],[], DLDataset)
  2. get_dict_tuple (DLDataset,'class_ids', ClassIDs)
  3. get_dict_tuple (DLDataset,'class_names', ClassNames)
  4. set_dict_tuple (DLDataset,'image_dir', ImageDir)
  5. set_dict_tuple (DLDataset,'segmentation_dir', LabelDir)
  6. split_dl_dataset (DLDataset,85,15,[])
  7. create_dl_preprocess_param ('segmentation', ImageWidth, ImageHeight, ImageNumChannels, ImageRangeMin, ImageRangeMax, NormalizationType, DomainHandling,[],[],[],[], DLPreprocessParam)

4.预现实标注效果

此功能不是必须的

  1. if(ShowExample)
  2. get_dict_tuple (DLDataset,'samples', DatasetSamples)
  3. find_dl_samples (DatasetSamples,'split','train','match', SampleIndices)
  4. tuple_shuffle (SampleIndices, ShuffledIndices)
  5. read_dl_samples (DLDataset, ShuffledIndices[0:9], DLSampleBatchDisplay)
  6. create_dict (WindowHandleDict)for Index :=0 to |DLSampleBatchDisplay|-1 by 1
  7. dev_display_dl_data (DLSampleBatchDisplay[Index],[], DLDataset,['image','segmentation_image_ground_truth'],[], WindowHandleDict)
  8. get_dict_tuple (WindowHandleDict,'segmentation_image_ground_truth', WindowHandleImage)
  9. dev_set_window (WindowHandleImage[1])
  10. Text :='Press Run (F5) to continue'
  11. dev_disp_text (Text,'window',400,40,'black',[],[])
  12. stop ()
  13. endfor
  14. dev_display_dl_data_close_windows (WindowHandleDict)
  15. endif

5.学习率修改

此方式不是必须的,不过有会更好

  1. if(|ChangeLearningRateEpochs|>0)
  2. create_dict (ChangeStrategy)
  3. set_dict_tuple (ChangeStrategy,'model_param','learning_rate')
  4. set_dict_tuple (ChangeStrategy,'initial_value', lr)
  5. set_dict_tuple (ChangeStrategy,'epochs', ChangeLearningRateEpochs)
  6. set_dict_tuple (ChangeStrategy,'values', ChangeLearningRateValues)
  7. GenParamName :=[GenParamName,'change']
  8. GenParamValue :=[GenParamValue,ChangeStrategy]
  9. endif

6.读取模型文件

  1. read_dict (DLDatasetFileName,[],[], DLDataset)
  2. open_file (Base_ModelFile[ModelType],'input_binary', FileHandle)
  3. fread_serialized_item (FileHandle, SerializedItemHandle)
  4. close_file (FileHandle)
  5. deserialize_dl_model (SerializedItemHandle, DLModelHandle)

7.设置模型参数

  1. get_dict_tuple (DLDataset,'preprocess_param', DLPreprocessParam)
  2. get_dict_tuple (DLDataset,'class_ids', ClassIDs)
  3. set_dl_model_param_based_on_preprocessing (DLModelHandle, DLPreprocessParam, ClassIDs)
  4. set_dl_model_param (DLModelHandle,'learning_rate', lr)
  5. set_dl_model_param (DLModelHandle,'momentum', Momentum)if(BatchSize ==-1)
  6. set_dl_model_param_max_gpu_batch_size (DLModelHandle,100)else
  7. set_dl_model_param (DLModelHandle,'batch_size', BatchSize)
  8. endif
  9. if(|WeightPrior|>0)
  10. set_dl_model_param (DLModelHandle,'weight_prior', WeightPrior)
  11. endif
  12. set_dl_model_param (DLModelHandle,'runtime_init','immediately')

8.训练

  1. create_dl_train_param (DLModelHandle, NumEpochs, EvaluationIntervalEpochs, EnableDisplay, SeedRand, GenParamName, GenParamValue, TrainParam)
  2. train_dl_model (DLDataset, DLModelHandle, TrainParam,0.0, TrainResults, TrainInfos, EvaluationInfos)

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

4.halcon脚本-模型评估

1.参数定义

  1. RetrainedModelFileName := DataDirectory +'/best_model.hdl'
  2. DLDatasetFileName := DataDirectory +'/dl_dataset.hdict'* 评估指标
  3. SegmentationMeasures :=['mean_iou','pixel_accuracy','class_pixel_accuracy','pixel_confusion_matrix']
  4. BatchSize :=1
  5. UseGPU := true
  6. * 评估验证集,可视化10张图
  7. NumDisplay :=10

2.模型读取及设置

  1. read_dl_model (RetrainedModelFileName, DLModelHandle)
  2. set_dl_model_param (DLModelHandle,'batch_size', BatchSize)if(not UseGPU)
  3. set_dl_model_param (DLModelHandle,'runtime','cpu')
  4. endif
  5. set_dl_model_param (DLModelHandle,'runtime_init','immediately')
  6. read_dict (DLDatasetFileName,[],[], DLDataset)
  7. create_dict (GenParamEval)
  8. set_dict_tuple (GenParamEval,'measures', SegmentationMeasures)
  9. set_dict_tuple (GenParamEval,'show_progress','true')

3.模型评估及验证

  1. evaluate_dl_model (DLDataset, DLModelHandle,'split','validation', GenParamEval, EvaluationResult, EvalParams)
  2. create_dict (WindowHandleDict)
  3. create_dict (GenParamEvalDisplay)
  4. set_dict_tuple (GenParamEvalDisplay,'display_mode',['measures','absolute_confusion_matrix'])
  5. dev_display_segmentation_evaluation (EvaluationResult, EvalParams, GenParamEvalDisplay, WindowHandleDict)

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

4.模型保存

此处模型保存使用了halcon自带的序列化方式

  1. serialize_dl_model (DLModelHandle, SerializedItemHandle)
  2. open_file (ModelFile,'output_binary', FileHandle)
  3. fwrite_serialized_item (FileHandle, SerializedItemHandle)
  4. close_file (FileHandle)

5.halcon脚本-模型预测

1.参数变量设置

  1. testDir:='./DataSet/DataImage'
  2. ModelFile:='./best_Seg.dat'
  3. ClassTxt:='./DataSet/SegDataSet/classes.txt'
  4. UseGpu:=true
  5. ImageWidth :=512
  6. ImageHeight :=512
  7. ImageNumChannels :=3

2.模型参数设置

  1. open_file (ModelFile,'input_binary', FileHandle)
  2. fread_serialized_item (FileHandle, SerializedItemHandle)
  3. close_file (FileHandle)
  4. deserialize_dl_model (SerializedItemHandle, DLModelHandle)
  5. set_dl_model_param (DLModelHandle,'batch_size', BatchSizeInference)
  6. set_dl_model_param (DLModelHandle,'runtime','cpu')
  7. set_dl_model_param (DLModelHandle,'runtime_init','immediately')
  8. get_dl_model_param (DLModelHandle,'class_ids', ClassIDs)

3.模型预测

  1. read_image (ImageBatch, ImageFiles[Index1])
  2. gen_dl_samples_from_images (ImageBatch, DLSampleBatch)
  3. preprocess_dl_samples (DLSampleBatch, DLPreprocessParam)
  4. apply_dl_model (DLModelHandle, DLSampleBatch,['segmentation_image','segmentation_confidence'], DLResultBatch)
  5. get_dict_object (SegmentationImage, DLResultBatch,'segmentation_image')
  6. threshold (SegmentationImage, ClassRegions, ClassIDs, ClassIDs)
  7. dev_display_dl_data (DLSampleBatch, DLResultBatch, DatasetInfo,'segmentation_image_result', GenParamDisplay, WindowHandleDict)

效果如图:
以往训练模型已删除,重新训练后上传效果图


总结

源码私聊


本文转载自: https://blog.csdn.net/ctu_sue/article/details/127278530
版权归原作者 爱学习的广东仔 所有, 如有侵权,请联系我们删除。

“halcon脚本-深度学习【语义分割】”的评论:

还没有评论