【mmYOLO】部署到推理还是等官方的教程吧,难顶

  • MMYOLO 中部署配置,所有部署配置文件在 configs/deploy 目录下。可以部署静态输入或者动态输入的模型,因此需要修改模型配置文件中与此相关的数据处理流程。MMDeploy 将后处理整合到自定义的算子中,因此可以修改 codebase_config 中的 post_processing 参数来调整后处理策略,参数描述如下:

    • codebase_config = dict(
          type='mmyolo',
          task='ObjectDetection',
          model_type='end2end',
          post_processing=dict(
              score_threshold=0.05,
              confidence_threshold=0.005,
              iou_threshold=0.5,
              max_output_boxes_per_class=200,
              pre_top_k=5000,
              keep_top_k=100,
              background_label_id=-1),
          module=['mmyolo.deploy'])
      
      • score_threshold:在 nms 之前筛选候选框的类别分数阈值。

      • confidence_threshold:在 nms 之前筛选候选框的置信度分数阈值。

      • iou_threshold:在 nms 中去除重复框的 iou 阈值。

      • max_output_boxes_per_class:每个类别最大的输出框数量。

      • pre_top_k:在 nms 之前对候选框分数排序然后固定候选框的个数。

      • keep_top_knms 算法最终输出的候选框个数。

      • background_label_id:MMYOLO 算法中没有背景类别信息,置为 -1 即可。

  • 部署配置文件介绍,以 MMYOLO 中的 YOLOv5 部署配置为例,ONNXRuntime 部署 YOLOv5 可以使用 detection_onnxruntime_static.py 配置。backend_config 中指定了部署后端 type=‘onnxruntime’

  • 与 ONNXRuntime 部署配置不同的是,TensorRT 需要指定输入图片尺寸和构建引擎文件需要的参数,包括:

    • onnx_config 中指定 input_shape=(640, 640)

    • backend_config['common_config'] 中包括 fp16_mode=False 和 max_workspace_size=1 << 30fp16_mode 表示是否以 fp16 的参数格式构建引擎,max_workspace_size 表示当前 gpu 设备最大显存, 单位为 GBfp16 的详细配置可以参考 detection_tensorrt-fp16_static-640x640.py

    • backend_config['model_inputs']['input_shapes']['input'] 中 min_shape /opt_shape/max_shape 对应的值在静态输入下应该保持相同,即默认均为 [1, 3, 640, 640]

    • use_efficientnms 是 MMYOLO 系列新引入的配置,表示在导出 onnx 时是否启用Efficient NMS Plugin来替换 MMDeploy 中的 TRTBatchedNMS plugin 。

  • 部署动态输入模型时,无需修改任何模型配置文件,仅需要修改部署配置文件即可。ONNXRuntime 部署 YOLOv5 可以使用 detection_onnxruntime_dynamic.py 配置。

    • _base_ = ['./base_dynamic.py']
      codebase_config = dict(
          type='mmyolo',
          task='ObjectDetection',
          model_type='end2end',
          post_processing=dict(
              score_threshold=0.05,
              confidence_threshold=0.005,
              iou_threshold=0.5,
              max_output_boxes_per_class=200,
              pre_top_k=5000,
              keep_top_k=100,
              background_label_id=-1),
          module=['mmyolo.deploy'])
      backend_config = dict(type='onnxruntime')
      
  • TensorRT 部署需要配置 min_shapeopt_shapemax_shape ,TensorRT 限制输入图片的尺寸在 min_shape 和 max_shape 之间。min_shape 为输入图片的最小尺寸,opt_shape 为输入图片常见尺寸, 在这个尺寸下推理性能最好,max_shape 为输入图片的最大尺寸。

  • 设置 MMDeploy 根目录为环境变量 MMDEPLOY_DIR ,例如 export MMDEPLOY_DIR=/the/root/path/of/MMDeploy

    • python3 ${MMDEPLOY_DIR}/tools/deploy.py \
          ${DEPLOY_CFG_PATH} \
          ${MODEL_CFG_PATH} \
          ${MODEL_CHECKPOINT_PATH} \
          ${INPUT_IMG} \
          --test-img ${TEST_IMG} \
          --work-dir ${WORK_DIR} \
          --calib-dataset-cfg ${CALIB_DATA_CFG} \
          --device ${DEVICE} \
          --log-level INFO \
          --show \
          --dump-info
      
      • deploy_cfg : mmdeploy 针对此模型的部署配置,包含推理框架类型、是否量化、输入 shape 是否动态等。配置文件之间可能有引用关系,configs/deploy/detection_onnxruntime_static.py 是一个示例。

      • model_cfg : MMYOLO 算法库的模型配置,例如 configs/deploy/model/yolov5_s-deploy.py, 与 mmdeploy 的路径无关。

      • checkpoint : torch 模型路径。可以 http/https 开头,详见 mmengine.fileio 的实现。

      • img : 模型转换时,用做测试的图像文件路径。

      • --test-img : 用于测试模型的图像文件路径。默认设置成None

      • --work-dir : 工作目录,用来保存日志和模型文件。

      • --calib-dataset-cfg : 此参数只有int8模式下生效,用于校准数据集配置文件。若在int8模式下未传入参数,则会自动使用模型配置文件中的’val’数据集进行校准。

      • --device : 用于模型转换的设备。 默认是cpu,对于 trt 可使用 cuda:0 这种形式。

      • --log-level : 设置日记的等级,选项包括'CRITICAL', 'FATAL', 'ERROR', 'WARN', 'WARNING', 'INFO', 'DEBUG', 'NOTSET'。 默认是INFO

      • --show : 是否显示检测的结果。

      • --dump-info : 是否输出 SDK 信息。

  • 将 PyTorch 模型转换为后端支持的模型后,您可能需要验证模型的精度,使用 ${MMDEPLOY_DIR}/tools/test.py

    • python3 ${MMDEPLOY_DIR}/tools/test.py \
          ${DEPLOY_CFG} \
          ${MODEL_CFG} \
          --model ${BACKEND_MODEL_FILES} \
          [--out ${OUTPUT_PKL_FILE}] \
          [--format-only] \
          [--metrics ${METRICS}] \
          [--show] \
          [--show-dir ${OUTPUT_IMAGE_DIR}] \
          [--show-score-thr ${SHOW_SCORE_THR}] \
          --device ${DEVICE} \
          [--cfg-options ${CFG_OPTIONS}] \
          [--metric-options ${METRIC_OPTIONS}]
          [--log2file work_dirs/output.txt]
          [--batch-size ${BATCH_SIZE}]
          [--speed-test] \
          [--warmup ${WARM_UP}] \
          [--log-interval ${LOG_INTERVERL}]
      
      • deploy_cfg: 部署配置文件。

      • model_cfg: MMYOLO 模型配置文件。

      • --model: 导出的后端模型。 例如, 如果我们导出了 TensorRT 模型,我们需要传入后缀为 “.engine” 文件路径。

      • --out: 保存 pickle 格式的输出结果,仅当您传入这个参数时启用。

      • --format-only: 是否格式化输出结果而不进行评估。当您要将结果格式化为特定格式并将其提交到测试服务器时,它很有用。

      • --metrics: 用于评估 MMYOLO 中定义的模型的指标,如 COCO 标注格式的 “proposal” 。

      • --show: 是否在屏幕上显示评估结果。

      • --show-dir: 保存评估结果的目录。(只有给出这个参数才会保存结果)。

      • --show-score-thr: 确定是否显示检测边界框的阈值。

      • --device: 运行模型的设备。请注意,某些后端会限制设备。例如,TensorRT 必须在 cuda 上运行

      • --cfg-options: 传入额外的配置,将会覆盖当前部署配置。

      • --metric-options: 用于评估的自定义选项。 xxx=yyy 中的键值对格式,将是 dataset.evaluate() 函数的 kwargs。

      • --log2file: 将评估结果(和速度)记录到文件中。

      • --batch-size: 推理的批量大小,它将覆盖数据配置中的 samples_per_gpu。默认为 1。请注意,并非所有模型都支持 batch_size > 1

      • --speed-test: 是否开启速度测试。

      • --warmup: 在计算推理时间之前进行预热,需要先开启 speed-test

      • --log-interval: 每个日志之间的间隔,需要先设置 speed-test

  • 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。步骤概览如下:标注+训练+测试+部署全流程 — MMYOLO 0.5.0 文档

      1. 数据集准备:tools/misc/download_dataset.py

      2. 使用 labelme 和算法进行辅助和优化数据集标注:demo/image_demo.py + labelme

      3. 使用脚本转换成 COCO 数据集格式:tools/dataset_converters/labelme2coco.py

      4. 数据集划分为训练集、验证集和测试集:tools/misc/coco_split.py

      5. 根据数据集内容新建 config 文件

      6. 数据集可视化分析:tools/analysis_tools/dataset_analysis.py

      7. 优化 Anchor 尺寸:tools/analysis_tools/optimize_anchors.py

      8. 可视化 config 配置中数据处理部分: tools/analysis_tools/browse_dataset.py

      9. 训练:tools/train.py

      10. 推理:demo/image_demo.py

      11. 部署

  • 脚本 tools/analysis_tools/dataset_analysis.py 能够帮助用户得到数据集的分析图。该脚本可以生成 4 种分析图:

    • 显示类别和 bbox 实例个数的分布图:show_bbox_num;

    • 显示类别和 bbox 实例宽、高的分布图:show_bbox_wh;

    • 显示类别和 bbox 实例宽/高比例的分布图:show_bbox_wh_ratio;

    • 基于面积规则下,显示类别和 bbox 实例面积的分布图:show_bbox_area

    • python tools/analysis_tools/dataset_analysis.py ${CONFIG} \
                                                      [--val-dataset ${TYPE}] \
                                                      [--class-name ${CLASS_NAME}] \
                                                      [--area-rule ${AREA_RULE}] \
                                                      [--func ${FUNC}] \
                                                      [--out-dir ${OUT_DIR}]
      
  • 脚本 tools/analysis_tools/optimize_anchors.py 支持 YOLO 系列中三种锚框生成方式,分别是 k-meansDifferential Evolutionv5-k-means.

    • python tools/analysis_tools/optimize_anchors.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
                                                      --algorithm v5-k-means \
                                                      --input-shape 640 640 \
                                                      --prior-match-thr 4.0 \
                                                      --out-dir work_dirs/dataset_analysis_cat
      
  • 脚本 tools/analysis_tools/browse_dataset.py 能够帮助用户去直接窗口可视化 config 配置中数据处理部分,同时可以选择保存可视化图片到指定文件夹内。下面演示使用新建的 config 文件 configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py 来可视化图片,该命令会使得图片直接弹出显示,每张图片持续 3 秒,图片不进行保存:

    • python tools/analysis_tools/browse_dataset.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
                                                    --show-interval 3
      
  • 如果需要采用浏览器对训练过程可视化,MMYOLO 目前提供 2 种方式 wandb 和 TensorBoard,根据自己的情况选择其一即可(后续会扩展更多可视化后端支持)。

    • wandb 可视化需要在官网注册,并在 https://wandb.ai/settings 获取到 wandb 的 API Keys。

    • pip install wandb
      # 运行了 wandb login 后输入上文中获取到的 API Keys ,便登录成功。
      wandb login
      
    • 在新建的 config 文件 configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py 的最后添加 wandb 配置:

    • visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
      #tensorboard
      visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])
      
    • 运行训练命令后,Tensorboard 文件会生成在可视化文件夹 work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/${TIMESTAMP}/vis_data 下, 运行下面的命令便可以在网页链接使用 Tensorboard 查看 loss、学习率和 coco/bbox_mAP 等可视化数据了:

    • tensorboard --logdir=work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat
      
  • 使用最佳的模型进行推理

    • python demo/image_demo.py ./data/cat/images \
                                ./configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
                                ./work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth \
                                --out-dir ./data/cat/pred_images
      
  • COCO数据集中trainval.json 里面的 “categories” 有:

    •   "categories": [{"supercategory": "person","id": 1,"name": "person"},{"supercategory": "vehicle","id": 2,"name": "bicycle"},{"supercategory": "vehicle","id": 3,"name": "car"},{"supercategory": "vehicle","id": 4,"name": "motorcycle"},{"supercategory": "vehicle","id": 5,"name": "airplane"},{"supercategory": "vehicle","id": 6,"name": "bus"},{"supercategory": "vehicle","id": 7,"name": "train"},{"supercategory": "vehicle","id": 8,"name": "truck"},{"supercategory": "vehicle","id": 9,"name": "boat"},{"supercategory": "outdoor","id": 10,"name": "traffic light"},{"supercategory": "outdoor","id": 11,"name": "fire hydrant"},{"supercategory": "outdoor","id": 13,"name": "stop sign"},{"supercategory": "outdoor","id": 14,"name": "parking meter"},{"supercategory": "outdoor","id": 15,"name": "bench"},{"supercategory": "animal","id": 16,"name": "bird"},{"supercategory": "animal","id": 17,"name": "cat"},{"supercategory": "animal","id": 18,"name": "dog"},{"supercategory": "animal","id": 19,"name": "horse"},{"supercategory": "animal","id": 20,"name": "sheep"},{"supercategory": "animal","id": 21,"name": "cow"},{"supercategory": "animal","id": 22,"name": "elephant"},{"supercategory": "animal","id": 23,"name": "bear"},{"supercategory": "animal","id": 24,"name": "zebra"},{"supercategory": "animal","id": 25,"name": "giraffe"},{"supercategory": "accessory","id": 27,"name": "backpack"},{"supercategory": "accessory","id": 28,"name": "umbrella"},{"supercategory": "accessory","id": 31,"name": "handbag"},{"supercategory": "accessory","id": 32,"name": "tie"},{"supercategory": "accessory","id": 33,"name": "suitcase"},{"supercategory": "sports","id": 34,"name": "frisbee"},{"supercategory": "sports","id": 35,"name": "skis"},{"supercategory": "sports","id": 36,"name": "snowboard"},{"supercategory": "sports","id": 37,"name": "sports ball"},{"supercategory": "sports","id": 38,"name": "kite"},{"supercategory": "sports","id": 39,"name": "baseball bat"},{"supercategory": "sports","id": 40,"name": "baseball glove"},{"supercategory": "sports","id": 41,"name": "skateboard"},{"supercategory": "sports","id": 42,"name": "surfboard"},{"supercategory": "sports","id": 43,"name": "tennis racket"},{"supercategory": "kitchen","id": 44,"name": "bottle"},{"supercategory": "kitchen","id": 46,"name": "wine glass"},{"supercategory": "kitchen","id": 47,"name": "cup"},{"supercategory": "kitchen","id": 48,"name": "fork"},{"supercategory": "kitchen","id": 49,"name": "knife"},{"supercategory": "kitchen","id": 50,"name": "spoon"},{"supercategory": "kitchen","id": 51,"name": "bowl"},{"supercategory": "food","id": 52,"name": "banana"},{"supercategory": "food","id": 53,"name": "apple"},{"supercategory": "food","id": 54,"name": "sandwich"},{"supercategory": "food","id": 55,"name": "orange"},{"supercategory": "food","id": 56,"name": "broccoli"},{"supercategory": "food","id": 57,"name": "carrot"},{"supercategory": "food","id": 58,"name": "hot dog"},{"supercategory": "food","id": 59,"name": "pizza"},{"supercategory": "food","id": 60,"name": "donut"},{"supercategory": "food","id": 61,"name": "cake"},{"supercategory": "furniture","id": 62,"name": "chair"},{"supercategory": "furniture","id": 63,"name": "couch"},{"supercategory": "furniture","id": 64,"name": "potted plant"},{"supercategory": "furniture","id": 65,"name": "bed"},{"supercategory": "furniture","id": 67,"name": "dining table"},{"supercategory": "furniture","id": 70,"name": "toilet"},{"supercategory": "electronic","id": 72,"name": "tv"},{"supercategory": "electronic","id": 73,"name": "laptop"},{"supercategory": "electronic","id": 74,"name": "mouse"},{"supercategory": "electronic","id": 75,"name": "remote"},{"supercategory": "electronic","id": 76,"name": "keyboard"},{"supercategory": "electronic","id": 77,"name": "cell phone"},{"supercategory": "appliance","id": 78,"name": "microwave"},{"supercategory": "appliance","id": 79,"name": "oven"},{"supercategory": "appliance","id": 80,"name": "toaster"},{"supercategory": "appliance","id": 81,"name": "sink"},{"supercategory": "appliance","id": 82,"name": "refrigerator"},{"supercategory": "indoor","id": 84,"name": "book"},{"supercategory": "indoor","id": 85,"name": "clock"},{"supercategory": "indoor","id": 86,"name": "vase"},{"supercategory": "indoor","id": 87,"name": "scissors"},{"supercategory": "indoor","id": 88,"name": "teddy bear"},{"supercategory": "indoor","id": 89,"name": "hair drier"},{"supercategory": "indoor","id": 90,"name": "toothbrush"}],
      

你可能感兴趣的:(树莓派,人工智能)