I found a third-party solution, but I need to compile opencv with mex, cv.FileStorage reads and writes various formats above, but I still feel that it is not what I really want. I very much hope that the official version will strengthen the readstruct function in the future!
How to effectively read ".yml" files as structures?
    74 views (last 30 days)
  
       Show older comments
    
The ".yml" file is also a storage structure similar to the ".xml" file. How do I read the content inside and save it as a struct type structure or dictionary type(introduced in R2022b)? Similar to the new function readstruct function in 2020b.
Similarly, whether format files such as'.json' can be read in matlab with a unified function, such as the readstruct function, the specified'FileType' can be {'.xml','.json','.yml' ,'.xml'} One or more than one kind of'.xml', although there are functions such as jsondecode and xmlread.
My ".yml" file is similar to the following format(in attachments):
#Config File example
save_dir: workspace/nanodet_m
model:
  arch:
    name: GFL
    backbone:
      name: ShuffleNetV2
      model_size: 1.0x
      out_stages: [2,3,4]
      activation: LeakyReLU
    fpn:
      name: PAN
      in_channels: [116, 232, 464]
      out_channels: 96
      start_level: 0
      num_outs: 3
    head:
      name: NanoDetHead
      num_classes: 80
      input_channel: 96
      feat_channels: 96
      stacked_convs: 2
      share_cls_reg: True
      octave_base_scale: 5
      scales_per_octave: 1
      strides: [8, 16, 32]
      reg_max: 7
      norm_cfg:
        type: BN
      loss:
        loss_qfl:
          name: QualityFocalLoss
          use_sigmoid: True
          beta: 2.0
          loss_weight: 1.0
        loss_dfl:
          name: DistributionFocalLoss
          loss_weight: 0.25
        loss_bbox:
          name: GIoULoss
          loss_weight: 2.0
data:
  train:
    name: coco
    img_path: coco/train2017
    ann_path: coco/annotations/instances_train2017.json
    input_size: [320,320] #[w,h]
    keep_ratio: True
2 Comments
Accepted Answer
  Martin Koch
      
 on 17 Feb 2022
        Hi, I wrote a wrapper for SnakeYAML with which you can load and dump YAML:
Requires R2019b or newer.
12 Comments
  Martin Koch
      
 on 19 Jun 2022
				there are two problems:
- The underlying SnakeYAML is written for YAML 1.1 for which the first line %YAML:1.0 is not valid (%YAML 1.0 without : would be acceptable). I will update the documentation to mention YAML 1.1.
- The custom opencv types are not supported.
You can build a workaround like this:
- Read file into string with fileread
- Delete all text occurrences of %YAML:1.0 and !!opencv-matrix (e.g. with strrep)
- Parse modified string with yaml.load
- Manually convert the content of the data field to a 2D array (e.g. with reshape)
To write YAML files in the same format you have to reverse the above process. However, it will not be formatted such that every row is in a new line.
More Answers (1)
  Walter Roberson
      
      
 on 2 Feb 2021
        2 Comments
  Razvan
 on 20 Oct 2022
				Just for others to know. The function from https://github.com/llerussell/ReadYAML  does not properly deals with multi level Yaml files.
See Also
Categories
				Find more on JSON Format in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


