windows环境下使用mmdetection+mmdeploy训练自定义数据集并转成onnx格式部署

实验环境

  • windows10
  • python:3.8
  • pytorch :1.8.1
  • cuda:11.1
  • mmdet:3.1.0
  • mmcv:2.0.1
  • onnxruntime-gpu:1.9.0

安装conda

conda下载地址:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.2.0-Windows-x86_64.exe

创建虚拟环境

conda create -n openmmlab python=3.8
conda activate openmmlab

安装pytorch

pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html

使用 MIM 安装 MMEngine 和 MMCV

pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0"

安装 MMDetection

在github上下载MMDetection:

git clone git@github.com:open-mmlab/mmdetection.git

如果网络不好也可到gitee下载:

git clone git@gitee.com:open-mmlab/mmdetection.git

或者可以直接下载zip压缩包:
在这里插入图片描述

准备自定义数据集

此处使用VOC数据集进行演示,使用的框架为Faster RCNN。VOC数据集的格式如下:

└─VOCdevkit
    └─VOC2007
        ├─Annotations
        ├─ImageSets
        │  └─Main
                 └─test.txt
                 └─train.txt
                 └─val.txt
        └─JPEGImages

其中Annotations存放xml文件,JPEGImages存放jpg文件。

修改配置信息

复制configs/_base_/datasets/voc0712.py,命名为configs/_base_/datasets/vocengine.py。(该名称可自定义)
修改数据集路径:
在这里插入图片描述
在这里插入图片描述

复制configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py,命名为configs/faster_rcnn/faster-rcnn_r50_fpn_1x_voc.py,修改信息如下:
在这里插入图片描述
修改mmdet/evaluation/functional/class_names.py和mmdet/datasets/voc.py的类别信息:
在这里插入图片描述

在这里插入图片描述

修改configs/_base_/models/faster-rcnn_r50_fpn.py的类别数:
在这里插入图片描述

修改epochs:
configs/_base_/schedules/schedule_1x.py
在这里插入图片描述

开始训练

python tools/train.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_voc.py

训练结束后将在work_dir下得到训练的相关信息以及模型权重文件。

模型转换与推理

下载mmdeploy:

git clone git@github.com:open-mmlab/mmdeploy.git
or
git clone git@gitee.com:open-mmlab/mmdeploy.git

安装相关库:

pip install mmdeploy==1.0.0
pip install mmdeploy-runtime-gpu==1.0.0
pip install onnxruntime-gpu==1.9.0

将训练得到的模型以及py文件复制到mmdeploy/faster_rcnn_configs/目录下,并设置结果路径为:faster_rcnn_onnx/。(这两个目录可以自定义)
在这里插入图片描述
新建inference.py,用以下代码进行模型转换以及推理:

from mmdeploy.apis import torch2onnx
from mmdeploy.apis.utils import build_task_processor
from mmdeploy.utils import get_input_shape, load_config
import torch


# 假设在安装步骤中,mmdetection 和 mmdeploy 代码库在同级目录下,并且当前的工作目录为 mmdetection 的根目录,
# 那么以 Faster R-CNN 模型为例,你可以从此处下载对应的 checkpoint,并使用以下代码将之转换为 onnx 模型:
def pth_to_onnx(args):
    """
    将pth模型转换为onnx模型
    Args:
        args: 

    Returns:

    """
    # 1. convert model to onnx
    torch2onnx(args.image, args.work_dir, args.save_file, args.deploy_cfg, args.model_cfg,
               args.model_checkpoint, args.device)


def onnx_inference(args):
    """
    使用onnx模型进行推理
    Args:
        args: 

    Returns:

    """
    # read deploy_cfg and model_cfg
    deploy_cfg, model_cfg = load_config(args.deploy_cfg, args.model_cfg)

    # build task and backend model
    task_processor = build_task_processor(model_cfg, deploy_cfg, args.device)
    model = task_processor.build_backend_model(args.backend_model)

    # process input image
    input_shape = get_input_shape(deploy_cfg)
    model_inputs, _ = task_processor.create_input(args.image, input_shape)

    # do model inference
    with torch.no_grad():
        result = model.test_step(model_inputs)

    # visualize results
    task_processor.visualize(
        image=args.image,
        model=model,
        result=result[0],
        window_name='visualize',
        output_file='output_detection.png')


if __name__ == '__main__':
    import argparse

    parser = argparse.ArgumentParser(
        description=__doc__)

    # 训练设备类型
    parser.add_argument('--device', default='cuda', help='device')
    # 图像
    parser.add_argument('--image', default='test.jpg')
    # 转换模型后的输出文件夹
    parser.add_argument('--work-dir', default='mmdeploy_models/mmdet/onnx')
    # 保存的模型名称
    parser.add_argument('--save-file', default='end2end.onnx')
    # mmdeploy的配置文件,使用目标检测应选择detection
    parser.add_argument('--deploy-cfg', default='configs/mmdet/detection/detection_onnxruntime_static.py')
    # 训练得到的配置文件
    parser.add_argument('--model-cfg', default='faster_rcnn_configs/faster-rcnn_r50_fpn_1x_voc.py')
    # 训练得到的配置文件
    parser.add_argument('--model-checkpoint', default='')
    # 转换后的onnx模型
    parser.add_argument('--backend_model', default=['mmdeploy_models/mmdet/onnx/end2end.onnx'], type=list)
    args = parser.parse_args()
    print(args)
    pth_to_onnx(args)
    onnx_inference(args)

其中的参数有:

  • –device:使用设备,可选择cuda or cpu
  • –image:测试使用的图片,可随意选择一张
  • –work-dir:转换模型后的输出文件夹
  • –save-file:保存的模型名称
  • –deploy-cfg:mmdeploy的配置文件,使用目标检测应选择detection
  • –model-checkpoint:训练得到的配置文件
  • –backend_model:转换后的onnx模型

然后,输入如下命令行(可根据实际需求修改):

python inference.py --model-checkpoint faster_rcnn_configs/epoch_1.pth --image test.jpg --device cuda

最后,将在根目录下得到如下onnx模型:
在这里插入图片描述
以及output_detection.png预测结果文件:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值