【mmYOLO】促进视觉项目落地,主打工程经验和实用。从原理配置到属性设置,从模型训练到模型评测

  • MMYOLO 是一个基于 PyTorch 和 MMDetection 的 YOLO 系列算法开源工具箱,它是 OpenMMLab 项目的一部分。目前支持的任务有目标检测,旋转框目标检测。

  • 具有如下三个特性:

    • 统一便捷的算法评测:MMYOLO 统一了各类 YOLO 算法模块的实现,并提供了统一的评测流程,用户可以公平便捷地进行对比分析。

    • MMYOLO 提供了从入门到部署到进阶和算法解析等一系列文档,方便不同用户快速上手和扩展。

    • MMYOLO 将框架解耦成不同的模块组件,通过组合不同的模块和训练测试策略,用户可以便捷地构建自定义模型。

  • 配置文件遵循以下样式来命名配置文件。

    • {algorithm name}_{model component names [component1]_[component2]_[...]}-[version id]_[norm setting]_[data preprocessor type]_{training settings}_{training dataset information}_{testing dataset information}.py
      
      • {algorithm name}: 算法的名称。 它可以是检测器名称,例如 yolov5, yolov6, yolox 等。
      • {component names}: 算法中使用的组件名称,如 backbone、neck 等。
      • [version_id] (可选): 由于 YOLO 系列算法迭代速度远快于传统目标检测算法,因此采用 version id 来区分不同子版本之间的差异。
      • [norm_setting] (可选): bn 表示 Batch Normalization, syncbn 表示 Synchronized Batch Normalization。
      • [data preprocessor type] (可选): 数据预处理类型
      • {training settings}: 训练设置的信息,例如 batch 大小、数据增强、损失、参数调度方式和训练最大轮次/迭代。
        缩写介绍:
      • {gpu x batch_per_gpu}: GPU 数和每个 GPU 的样本数。bN 表示每个 GPU 上的 batch 大小为 N。例如 4x4b 是 4 个 GPU 每个 GPU 4 张图的缩写。如果没有注明,默认为 8 卡每卡 2 张图。
      • {schedule}: 训练方案。
      • {training dataset information}: 训练数据集,例如 coco, cityscapes, voc-0712, wider-face, balloon。
      • [testing dataset information] (可选): 测试数据集,用于训练和测试在不同数据集上的模型配置。 如果没有注明,则表示训练和测试的数据集类型相同。
  • 重要参数

    • img_scale = (640, 640)            # 高度,宽度
      deepen_factor = 0.33              # 控制网络结构深度的缩放因子,YOLOv5-s 为 0.33
      widen_factor = 0.5                # 控制网络结构宽度的缩放因子,YOLOv5-s 为 0.5
      max_epochs = 300                  # 最大训练轮次 300 轮
      save_epoch_intervals = 10         # 验证间隔,每 10 个 epoch 验证一次
      train_batch_size_per_gpu = 16     # 训练时单个 GPU 的 Batch size
      train_num_workers = 8             # 训练时单个 GPU 分配的数据加载线程数
      val_batch_size_per_gpu = 1        # 验证时单个 GPU 的 Batch size
      val_num_workers = 2               # 验证时单个 GPU 分配的数据加载线程数
      
  • 在 MMYOLO 的配置中,使用 model 字段来配置检测算法的组件。 除了 backbone、neck 等神经网络组件外,还需要 data_preprocessor、train_cfg 和 test_cfg。 data_preprocessor 负责对 dataloader 输出的每一批数据进行预处理。预处理包括:颜色空间变换,归一化,to cuda,pad 成一样大小方便组成 batch。

  • 模型配置中的 train_cfg 和 test_cfg 用于设置训练和测试组件的超参数。

    • anchors = [[(10, 13), (16, 30), (33, 23)], # 多尺度的先验框基本尺寸 
                 [(30, 61), (62, 45), (59, 119)],
                 [(116, 90), (156, 198), (373, 326)]]
      strides = [8, 16, 32] # 先验框生成器的步幅
      model = dict(
          type='YOLODetector', #检测器名
          data_preprocessor=dict(  # 数据预处理器的配置,通常包括图像归一化和 padding
              type='mmdet.DetDataPreprocessor',  # 数据预处理器的类型,还可以选择 'YOLOv5DetDataPreprocessor' 训练速度更快
              mean=[0., 0., 0.],  # 用于预训练骨干网络的图像归一化通道均值,按 R、G、B 排序
              std=[255., 255., 255.], # 用于预训练骨干网络的图像归一化通道标准差,按 R、G、B 排序
              bgr_to_rgb=True),  # 是否将图像通道从 BGR 转为 RGB
          backbone=dict(  # 主干网络的配置文件
              type='YOLOv5CSPDarknet',  # 主干网络的类别,目前可选用 'YOLOv5CSPDarknet', 'YOLOv6EfficientRep', 'YOLOXCSPDarknet' 3种
              deepen_factor=deepen_factor, # 控制网络结构深度的缩放因子
              widen_factor=widen_factor, # 控制网络结构宽度的缩放因子
              norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), # 归一化层(norm layer)的配置项
              act_cfg=dict(type='SiLU', inplace=True)), # 激活函数(activation function)的配置项
          neck=dict(
              type='YOLOv5PAFPN',  # 检测器的 neck 是 YOLOv5FPN,我们同样支持 'YOLOv6RepPAFPN', 'YOLOXPAFPN'
              deepen_factor=deepen_factor, # 控制网络结构深度的缩放因子
              widen_factor=widen_factor, # 控制网络结构宽度的缩放因子
              in_channels=[256, 512, 1024], # 输入通道数,与 Backbone 的输出通道一致
              out_channels=[256, 512, 1024], # 输出通道数,与 Head 的输入通道一致
              num_csp_blocks=3, # CSPLayer 中 bottlenecks 的数量
              norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), # 归一化层(norm layer)的配置项
              act_cfg=dict(type='SiLU', inplace=True)), # 激活函数(activation function)的配置项
          bbox_head=dict(
              type='YOLOv5Head', # bbox_head 的类型是 'YOLOv5Head', 我们目前也支持 'YOLOv6Head', 'YOLOXHead'
              head_module=dict(
                  type='YOLOv5HeadModule', # head_module 的类型是 'YOLOv5HeadModule', 我们目前也支持 'YOLOv6HeadModule', 'YOLOXHeadModule'
                  num_classes=80, # 分类的类别数量
                  in_channels=[256, 512, 1024], # 输入通道数,与 Neck 的输出通道一致
                  widen_factor=widen_factor, # 控制网络结构宽度的缩放因子
                  featmap_strides=[8, 16, 32], # 多尺度特征图的步幅
                  num_base_priors=3), # 在一个点上,先验框的数量
              prior_generator=dict( # 先验框(prior)生成器的配置
                  type='mmdet.YOLOAnchorGenerator', # 先验框生成器的类型是 mmdet 中的 'YOLOAnchorGenerator'
                  base_sizes=anchors, # 多尺度的先验框基本尺寸
                  strides=strides), # 先验框生成器的步幅, 与 FPN 特征步幅一致。如果未设置 base_sizes,则当前步幅值将被视为 base_sizes。
          ),
          test_cfg=dict(
              multi_label=True, # 对于多类别预测来说是否考虑多标签,默认设置为 True
              nms_pre=30000,  # NMS 前保留的最大检测框数目
              score_thr=0.001, # 过滤类别的分值,低于 score_thr 的检测框当做背景处理
              nms=dict(type='nms', # NMS 的类型
                       iou_threshold=0.65), # NMS 的阈值
              max_per_img=300)) # 每张图像 NMS 后保留的最大检测框数目
      
  • 在使用 执行器 进行训练、测试、验证时,需要配置 Dataloader 。构建数据 dataloader 需要设置数据集(dataset)和数据处理流程(data pipeline)。 由于这部分的配置较为复杂,使用中间变量来简化 dataloader 配置的编写。由于 MMYOLO 中各类轻量目标检测算法使用了更加复杂的数据增强方法,因此会比 MMDetection 中的其他模型拥有更多样的数据集配置

  • YOLOv5 的训练与测试的数据流存在一定差异。

    • dataset_type = 'CocoDataset'  # 数据集类型,这将被用来定义数据集 
      data_root = 'data/coco/'  # 数据的根路径
      file_client_args = dict(backend='disk')  # 文件读取后端的配置,默认从硬盘读取
      pre_transform = [ # 训练数据读取流程
          dict(
              type='LoadImageFromFile', # 第 1 个流程,从文件路径里加载图像
              file_client_args=file_client_args),  # 文件读取后端的配置,默认从硬盘读取
          dict(type='LoadAnnotations', # 第 2 个流程,对于当前图像,加载它的注释信息
               with_bbox=True) # 是否使用标注框(bounding box),目标检测需要设置为 True
      ]
      albu_train_transforms = [                # YOLOv5-v6.1 仓库中,引入了 Albumentation 代码库进行图像的数据增广, 请确保其版本为 1.0.+
          dict(type='Blur', p=0.01),       # 图像模糊,模糊概率 0.01
          dict(type='MedianBlur', p=0.01), # 均值模糊,模糊概率 0.01
          dict(type='ToGray', p=0.01),         # 随机转换为灰度图像,转灰度概率 0.01
          dict(type='CLAHE', p=0.01)                 # CLAHE(限制对比度自适应直方图均衡化) 图像增强方法,直方图均衡化概率 0.01
      ]
      train_pipeline = [                                # 训练数据处理流程
          *pre_transform,                                # 引入前述定义的训练数据读取流程
          dict(
              type='Mosaic',          # Mosaic 数据增强方法
              img_scale=img_scale,    # Mosaic 数据增强后的图像尺寸
              pad_val=114.0,          # 空区域填充像素值
              pre_transform=pre_transform), # 之前创建的 pre_transform 训练数据读取流程
          dict(
              type='YOLOv5RandomAffine',            # YOLOv5 的随机仿射变换
              max_rotate_degree=0.0,          # 最大旋转角度
              max_shear_degree=0.0,           # 最大错切角度
              scaling_ratio_range=(0.5, 1.5), # 图像缩放系数的范围
              border=(-img_scale[0] // 2, -img_scale[1] // 2), # 从输入图像的高度和宽度两侧调整输出形状的距离
              border_val=(114, 114, 114)), # 边界区域填充像素值
          dict(
              type='mmdet.Albu',                        # mmdet 中的 Albumentation 数据增强
              transforms=albu_train_transforms, # 之前创建的 albu_train_transforms 数据增强流程
              bbox_params=dict(
                  type='BboxParams',
                  format='pascal_voc',
                  label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
              keymap={
                  'img': 'image',
                  'gt_bboxes': 'bboxes'
              }),
          dict(type='YOLOv5HSVRandomAug'),            # HSV通道随机增强
          dict(type='mmdet.RandomFlip', prob=0.5),        # 随机翻转,翻转概率 0.5
          dict(
              type='mmdet.PackDetInputs',                                # 将数据转换为检测器输入格式的流程
              meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
                         'flip_direction'))
      ]
      train_dataloader = dict( # 训练 dataloader 配置
          batch_size=train_batch_size_per_gpu, # 训练时单个 GPU 的 Batch size
          num_workers=train_num_workers, # 训练时单个 GPU 分配的数据加载线程数
          persistent_workers=True, # 如果设置为 True,dataloader 在迭代完一轮之后不会关闭数据读取的子进程,可以加速训练
          pin_memory=True, # 开启锁页内存,节省 CPU 内存拷贝时间
          sampler=dict( # 训练数据的采样器
              type='DefaultSampler', # 默认的采样器,同时支持分布式和非分布式训练。请参考 https://github.com/open-mmlab/mmengine/blob/main/mmengine/dataset/sampler.py
              shuffle=True), # 随机打乱每个轮次训练数据的顺序
          dataset=dict( # 训练数据集的配置
              type=dataset_type,
              data_root=data_root,
              ann_file='annotations/instances_train2017.json', # 标注文件路径
              data_prefix=dict(img='train2017/'), # 图像路径前缀
              filter_cfg=dict(filter_empty_gt=False, min_size=32), # 图像和标注的过滤配置
              pipeline=train_pipeline)) # 这是由之前创建的 train_pipeline 定义的数据处理流程
      
  • YOLOv5 测试阶段采用 Letter Resize 的方法来将所有的测试图像统一到相同尺度,进而有效保留了图像的长宽比。因此我们在验证和评测时,都采用相同的数据流进行推理。

    • test_pipeline = [ # 测试数据处理流程
          dict(
              type='LoadImageFromFile', # 第 1 个流程,从文件路径里加载图像
              file_client_args=file_client_args),  # 文件读取后端的配置,默认从硬盘读取
          dict(type='YOLOv5KeepRatioResize', # 第 2 个流程,保持长宽比的图像大小缩放
               scale=img_scale), # 图像缩放的目标尺寸
          dict(
              type='LetterResize', # 第 3 个流程,满足多种步幅要求的图像大小缩放
              scale=img_scale, # 图像缩放的目标尺寸
              allow_scale_up=False, # 当 ratio > 1 时,是否允许放大图像,
              pad_val=dict(img=114)), # 空区域填充像素值
          dict(type='LoadAnnotations', with_bbox=True), # 第 4 个流程,对于当前图像,加载它的注释信息
          dict(
              type='mmdet.PackDetInputs', # 将数据转换为检测器输入格式的流程
              meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
                         'scale_factor', 'pad_param'))
      ]
      
      val_dataloader = dict(
          batch_size=val_batch_size_per_gpu, # 验证时单个 GPU 的 Batch size
          num_workers=val_num_workers, # 验证时单个 GPU 分配的数据加载线程数
          persistent_workers=True, # 如果设置为 True,dataloader 在迭代完一轮之后不会关闭数据读取的子进程,可以加速训练
          pin_memory=True, # 开启锁页内存,节省 CPU 内存拷贝时间
          drop_last=False, # 是否丢弃最后未能组成一个批次的数据
          sampler=dict(
              type='DefaultSampler', # 默认的采样器,同时支持分布式和非分布式训练
              shuffle=False), # 验证和测试时不打乱数据顺序
          dataset=dict(
              type=dataset_type,
              data_root=data_root,
              test_mode=True, # 开启测试模式,避免数据集过滤图像和标注
              data_prefix=dict(img='val2017/'), # 图像路径前缀
              ann_file='annotations/instances_val2017.json', # 标注文件路径
              pipeline=test_pipeline, # 这是由之前创建的 test_pipeline 定义的数据处理流程
              batch_shapes_cfg=dict(  # batch shapes 配置
                  type='BatchShapePolicy', # 确保在 batch 推理过程中同一个 batch 内的图像 pad 像素最少,不要求整个验证过程中所有 batch 的图像尺度一样
                  batch_size=val_batch_size_per_gpu, # batch shapes 策略的 batch size,等于验证时单个 GPU 的 Batch size
                  img_size=img_scale[0], # 图像的尺寸
                  size_divisor=32, # padding 后的图像的大小应该可以被 pad_size_divisor 整除
                  extra_pad_ratio=0.5))) # 额外需要 pad 的像素比例
      
      test_dataloader = val_dataloader
      
  • 评测器 用于计算训练模型在验证和测试数据集上的指标。评测器的配置由一个或一组评价指标(Metric)配置组成:

    • val_evaluator = dict(  # 验证过程使用的评测器
          type='mmdet.CocoMetric',  # 用于评估检测的 AR、AP 和 mAP 的 coco 评价指标
          proposal_nums=(100, 1, 10),        # 用于评估检测任务时,选取的Proposal数量
          ann_file=data_root + 'annotations/instances_val2017.json',  # 标注文件路径
          metric='bbox',  # 需要计算的评价指标,`bbox` 用于检测
      )
      test_evaluator = val_evaluator  # 测试过程使用的评测器
      
  • MMEngine 的 Runner 使用 Loop 来控制训练,验证和测试过程。

    • max_epochs = 300 # 最大训练轮次 300 轮
      save_epoch_intervals = 10 # 验证间隔,每 10 轮验证一次
      train_cfg = dict(
          type='EpochBasedTrainLoop',  # 训练循环的类型,请参考 https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py
          max_epochs=max_epochs,  # 最大训练轮次 300 轮
          val_interval=save_epoch_intervals)  # 验证间隔,每 10 个 epoch 验证一次
      val_cfg = dict(type='ValLoop')  # 验证循环的类型
      test_cfg = dict(type='TestLoop')  # 测试循环的类型
      
  • optim_wrapper 是配置优化相关设置的字段。优化器封装(OptimWrapper)不仅提供了优化器的功能,还支持梯度裁剪、混合精度训练等功能。

    • optim_wrapper = dict(  # 优化器封装的配置
          type='OptimWrapper',  # 优化器封装的类型。可以切换至 AmpOptimWrapper 来启用混合精度训练
          optimizer=dict(  # 优化器配置。支持 PyTorch 的各种优化器。请参考 https://pytorch.org/docs/stable/optim.html#algorithms
              type='SGD',  # 随机梯度下降优化器
              lr=0.01,  # 基础学习率
              momentum=0.937, # 带动量的随机梯度下降
              weight_decay=0.0005, # 权重衰减
              nesterov=True, # 开启Nesterov momentum,公式详见 http://www.cs.toronto.edu/~hinton/absps/momentum.pdf
              batch_size_per_gpu=train_batch_size_per_gpu),  # 该选项实现了自动权重衰减系数缩放
          clip_grad=None,  # 梯度裁剪的配置,设置为 None 关闭梯度裁剪。使用方法请见 https://mmengine.readthedocs.io/en/latest/tutorials/optimizer.html
          constructor='YOLOv5OptimizerConstructor') # YOLOv5 优化器构建器
      
  • 用户可以在训练、验证和测试循环上添加钩子,以便在运行期间插入一些操作。配置中有两种不同的钩子字段,一种是 default_hooks,另一种是 custom_hooks。default_hooks 是一个字典,用于配置运行时必须使用的钩子。这些钩子具有默认优先级,如果未设置,runner 将使用默认值。如果要禁用默认钩子,用户可以将其配置设置为 None

    • default_hooks = dict(
          param_scheduler=dict(
              type='YOLOv5ParamSchedulerHook', # MMYOLO 中默认采用 Hook 方式进行优化器超参数的调节
              scheduler_type='linear',
              lr_factor=0.01,
              max_epochs=max_epochs),
          checkpoint=dict(
              type='CheckpointHook', # 按照给定间隔保存模型的权重的 Hook
              interval=save_epoch_intervals, # 每 10 轮保存 1 次权重文件
              max_keep_ckpts=3)) # 最多保存 3 个权重文件
      
    • custom_hooks 是一个列表。用户可以在这个字段中加入自定义的钩子,例如 EMAHook。

    • custom_hooks = [
          dict(
              type='EMAHook', # 实现权重 EMA(指数移动平均) 更新的 Hook
              ema_type='ExpMomentumEMA', # YOLO 中使用的带动量 EMA
              momentum=0.0001, # EMA 的动量参数
              update_buffers=True, # 是否计算模型的参数和缓冲的 running averages
              priority=49) # 优先级略高于 NORMAL(50)
      ]
      
  • default_runtime.py 中的内容

    • default_scope = 'mmyolo'  # 默认的注册器域名,默认从此注册器域中寻找模块。请参考 https://mmengine.readthedocs.io/en/latest/tutorials/registry.html
      env_cfg = dict(
          cudnn_benchmark=True,  # 是否启用 cudnn benchmark, 推荐单尺度训练时开启,可加速训练
          mp_cfg=dict(  # 多进程设置
              mp_start_method='fork',  # 使用 fork 来启动多进程。‘fork’ 通常比 ‘spawn’ 更快,但可能存在隐患。请参考 https://github.com/pytorch/pytorch/issues/1355
              opencv_num_threads=0),  # 关闭 opencv 的多线程以避免系统超负荷
          dist_cfg=dict(backend='nccl'),  # 分布式相关设置
      )
      vis_backends = [dict(type='LocalVisBackend')]  # 可视化后端,请参考 https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/visualization.html
      visualizer = dict(
          type='mmdet.DetLocalVisualizer', vis_backends=vis_backends, name='visualizer')
      log_processor = dict(
          type='LogProcessor',  # 日志处理器用于处理运行时日志
          window_size=50,  # 日志数值的平滑窗口
          by_epoch=True)  # 是否使用 epoch 格式的日志。需要与训练循环的类型保存一致。
      log_level = 'INFO'  # 日志等级
      load_from = None  # 从给定路径加载模型检查点作为预训练模型。这不会恢复训练。
      resume = False  # 是否从 `load_from` 中定义的检查点恢复。 如果 `load_from` 为 None,它将恢复 `work_dir` 中的最新检查点。
      
  • 有时,您也许会设置_delete_=True 去忽略基础配置文件里的一些域内容。基础配置的 YOLOv5 使用 YOLOv5CSPDarknet,在需要将主干网络改成 YOLOv6EfficientRep 的时候,因为 YOLOv5CSPDarknet 和 YOLOv6EfficientRep 中有不同的字段,需要使用 _delete_=True 将新的键去替换 backbone 域内所有老的键。

    • _base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
      model = dict(
          backbone=dict(
              _delete_=True,
              type='YOLOv6EfficientRep',
              deepen_factor=deepen_factor,
              widen_factor=widen_factor,
              norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
              act_cfg=dict(type='ReLU', inplace=True)),
          neck=dict(...),
          bbox_head=dict(...))
      
  • 通常在安装文档里面都是推荐采用如下安装方式:

    • mim install -v -e .
      
    • -e 是编辑模式,其好处是你代码改了后依然可以立即生效。如果没有使用 -e 编辑模式,包将直接安装进入 python 中的 site-packages 目录。

  • 根注册器对应的是层级注册器。MMEngine 的注册器支持层级注册,利用该功能可实现跨项目调用,即可以在一个项目中使用另一个项目的模块。虽然跨项目调用也有其他方法的可以实现,但 MMEngine 注册器提供了更为简便的方法。各个下游库都会继承根注册器,然后在子注册器中进行注册。 MMYOLO/MMDet/MMRotate/MMOCR 等检测相关项目都是平行层级,虽然 MMYOLO 依赖了 MMDet,这样的好处也是为了跨库调用

  • MMCV 有点特殊,数据处理部分的 transform 虽然代码位于 MMCV,但是其是直接注册到了 MMEngine 中。 OpenMMLab 中一般注册层级不推荐超过 2 层,因为这会导致注册关系非常复杂,跨库调用配置写法和逻辑会难以理解

  • 配置中的 type 字段通常就是注册的类名。数据变换相关代码位于 MMCV,其余训练测试评估相关代码位于 MMEngine,算法本身的部分才位于 MMDet/MMYOLO

  • 常见错误排除流程

    • 提示自己写的模块没有注册

      • 环境要干净,环境管理很重要

      • 确保 init.py 中已经导入,如果新建了文件,确保 mim install -e . 再次运行了

    • 怀疑配置没有写对或者提示 num_classes 不对,或者没有生效

      • 可以 print_config 脚本确认,或者查看 work_dirs 里面生成的 config 文件里面是否正确
    • 怀疑是 dataloader 或者 pipeline 有问题部分的问题

      • 使用 tools/analysis_tools/browse_dataset.py 快速可视化
    • 怀疑 json 格式数据本身有问题

      • 使用 tools/analysis_tools/browse_coco_json.py 可视化验证正确性
    • test.py 报错或者模型推理不正确

      • 用 image_demo.py 对单张图片进行可视化推理,也可以快速排查和调试从而发现问题
    • 怀疑是训练或者测试代码有问题

      • 快速切分小数据集例如 4 张图片,进行训练和测试
    • 怀疑学习率曲线不对

      • 可以用 mmcls 脚本中的可视化 lr 脚本看下是否符合预期,后续也会用 mim 来调用
  • 在openmmlab项目中遇到问题,如何提一个好issue

      • 详细的错误描述 【必备】
      • 使用 mmyolo/utils/collect_env.py 脚本收集你的硬件和软件环境 【必备】
      • 提供配置文件修改内容和细节 【必备】
      • 错误的 log 【可选,如果不涉密,最好提供】
  • MMYOLO的核心组件都放在mmyolo/文件夹中,通过每个子文件夹下的__init__.py将文件夹变成一个Python模块。简单理解就是:在书写代码时用到 from mmyolo.models import backbones 调用的就是这个文件夹里的东西。其中最重要的三个部分datasets、models、engine需要大家了解。

      • datasets 支持用于目标检测的各种数据集。

        • transforms 包含各种数据增强变换。
      • models 是检测器最重要的部分,包含检测器的不同组件。

        • detectors 定义所有检测模型类。

        • data_preprocessors 用于预处理模型的输入数据。

        • backbones 包含各种骨干网络

        • necks 包含各种模型颈部组件

        • dense_heads 包含执行密集预测的各种检测头。

        • losses 包含各种损失函数

        • task_modules 为检测任务提供模块。例如 assigners、samplers、box coders 和 prior generators。

        • layers 提供了一些基本的神经网络层

      • engine 是运行时组件的一部分。

        • optimizers 提供优化器和优化器封装。

        • hooks 提供 runner 的各种钩子。

  • 如果是 CPU 训练,就会将输入的数据执行Normlization(标准化)、Padding(填充)和bgr2rgb(BGR转RGB)操作,对数据进行预处理,然后将数据送入模型。如果是 GPU 训练,就会先将输入的数据送去 CUDA ,然后后面的操作与CPU训练一致。

  • Cuda 就是为了让 GPU 能够有可用的编程环境,使得开发人员可以用程序控制 GPU 的硬件进行并行计算。简单说,就是加速计算,让运行速度更快,减少训练时长Normlization 是将数据标准化。进行 Normlization 是为了防止深度神经网络过拟合,每一层的参数更新会导致上层的输入数据发生变化,通过层层叠加,高层的输入分布变化会十分剧烈,这就使得高层需要不断去重新适应底层的参数更新padding 的作用是在采用批量样本训练时,对于长度不同的样本填充,比如,对于短的样本采用 padding 进行填充,使得每个样本的长度是一致的。bgr2rgb 转换其实就是将 B 通道与 R 通道互换。

  • 使用 cv2 打开图片默认是 BGR 模式,而使用 PIL 显示图片时是 RGB 模式。使用 cv2 打开图片默认是 BGR 模式,而使用 PIL 显示图片时是 RGB 模式。

  • analysis_tools 分析工具:benchmark.py 测推理速度脚本;browse_coco_json.py 可视化 COCO 标签;browse_dataset.py 可视化数据集;dataset_analysis.py 可视化数据集分析;optimize_anchors.py 优化锚框尺寸

  • dataset_converters 数据集转换:ballon2coco.py 将 ballon 数据集转换成 coco 的格式yolo2coco.py 将 yolo-style .txt 格式的数据集转换成 coco 的格式

  • Misc 杂项:download_dataset.py 下载数据集;extract_subcoco.py 提取COCO子集

  • model_converters 模型转换:六个脚本能够帮助用户将对应 YOLO 官方的预训练模型中的键转换成 MMyolo 格式

你可能感兴趣的:(树莓派,深度学习,人工智能,计算机视觉,yolo)