DL | mmdetection笔记:安装+训练测试+部署服务

1.介绍

mmdetection是一个安装和使用方便,非常好用,非常优秀的一款国产cv框架。
可以方便的用来做目标检测、语义分割等。


2.安装

github:mmdetection安装官方说明文档就很好使;

【说明1】当然前提是需要先安装conda,可以去网上搜一下;

【说明2】一个稍微麻烦的地方就是安装mmcv的时候的版本问题,文档里有说明,不同的mmdetection版本需要对应版本的mmcv;


3. 训练和测试——以faster_rcnn_res50为例

3.1 coco数据集格式和构造

请参考:怎么把自己的数据集转化为coco格式【有空了写】;

3.2 训练参数配置

mmdetection配置参数比较方便,只需要修改相应的 configure py文件即可。

(步骤1)如果训练faster rcnn模型,就进入configures/faster_rcnn/路径,选取配置文件:
faster_rcnn_r50_fpn_1x_coco.py
(步骤2)vi faster_rcnn_r50_fpn_1x_coco.py,会看到里面是:

_base_ = [
    '../_base_/models/faster_rcnn_r50_fpn.py',
    '../_base_/datasets/coco_detection.py',
    '../_base_/schedules/schedule_1x.py',
    '../_base_/default_runtime.py'
]

(步骤3)挨个打开上述四个py文件,就能看到里面可以设置的参数了;

3.3 训练

训练很方便,做好配置文件之后,在 mmdetection路径下运行:

# 训练,格式:"python3 tool/train.py 配置文件路径"
python3 tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py

3.4 测试

# 测试,格式为:"python3 tool/test.py 配置文件路径 模型文件路径 其他控制参数"
python3 tools/test.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py work_dirs/faster_rcnn_r50_fpn_1x_coco_2class/epoch_20.pth --eval bbox

测试几个常用的参数:
–eval bbox :可选参数有{“bbox”,“segm”},faster rcnn 由于不能做分割,我只用过bbox;
–out : 如果我想把测试集上预测结果保存下来,就加入参数 --out pred.pkl,会保存到pred.pkl文件中;
–show-dir : 如果想把预测出来的检测框画到测试集图片上,把结果保存下来,就在这个参数后面写上 保存的文件夹名字,没有该文件夹会自动创建一个;


4.部署服务

4.1 部署

请参考官方文档中model serving一小节,其中有一些太长,下面的会补充一些简明一些的步骤;


【补充】安装docker或者nvidia-docker

(a)如果你的电脑没有安装docker:你可能需要 ubutnu安装docker简易命令


(b) 如果要用gpu,需要安装nvidia-docker(下述代码节选自 docker学习笔记(9):nvidia-docker安装、部署与使用):

curl https://get.docker.com | sh

sudo systemctl start docker && sudo systemctl enable docker

# 设置stable存储库和GPG密钥:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# 要访问experimental诸如WSL上的CUDA或A100上的新MIG功能之类的功能,您可能需要将experimental分支添加到存储库列表中.
# 可加可不加
curl -s -L https://nvidia.github.io/nvidia-container-runtime/experimental/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list

# nvidia-docker2更新软件包清单后,安装软件包(和依赖项):
sudo apt-get update

sudo apt-get install -y nvidia-docker2

# 设置默认运行时后,重新启动Docker守护程序以完成安装:
sudo systemctl restart docker

准备好必要的docker环境之后,就可以安装了,下述命令直接copy的官方教程:

# 1.生成  xxx.mar 文件
在可以正常运行mmdetection的路径(例如虚拟环境下)下执行下述命令:

python tools/deployment/mmdet2torchserve.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py work_dirs/faster_rcnn_r50_fpn_1x_coco/epoch_26.pth --output-folder /home/ubuntu/xxx/mmdetection/model_serve --model-name faster_rcnn_26

# 2. 生成 `mmdet-serve` 镜像

nvidia-docker build -t mmdet-serve:latest docker/serve/

# 3. 启动服务
sudo docker run --rm --cpus 8 --gpus device=0 -p8080:8080 -p8081:8081 -p8082:8082 --mount type=bind,source=/home/ubuntu/xxx/mmdetection/model_serve,target=/home/model-server/model-store mmdet-serve:latest

【说明1】我感觉部署中最难得其实是环境的设置:比如docker环境和安装,这个坑有可能比部署torchserve本身更大;

4.2 检查是否正常启动了服务

查看部署好的所有的模型:

curl http://localhost:8081/models/

查看刚才部署的模型名称:

curl http://localhost:8081/models/faster_rcnn_26

不会报错,会返回,相应的信息。

4.3 调用服务-curl命令

你可以准备好一张用来检测的图片,例如叫 temp.jpg。调用服务的命令就是:

curl http://127.0.0.1:8080/predictions/faster_rcnn_26 -T temp.jpg

4.4 调用服务-post请求

参考torchserve使用-网络端访问(三)里面的 1、通过http访问Using REST APIs里的写法,可以跑的通。

4.5 register 新模型

已经部署了一个服务,又训练了一个新模型,这时需要 register model:
生成 faster_rcnn_38.mar之后,运行:

curl -X POST  "http://localhost:8081/models?url=/home/ubuntu/xxx/mmdetection212/model_serve/faster_rcnn_38.mar"

其中url=后面,写上 你本地模型的路径。

【说明1】register模型有时候行,有时候不行,很奇怪,有时候会报错 “模型没有找到”;我遇到的情况是这样的:我第一次部署完一个检测目标A的模型,然后想register一个检测A和B两种目标的模型,register第二个模型的时候,用上面的方法,总是报错模型没找到;我没办法,关掉服务(这时发现docker环境坏了,我重新一通重装docker,还重启了一次服务器),一次部署了两个模型,然后我又训练好一个检测目标A和B的新模型,这时候register第三个模型的时候,用上面的方法register成功了,这个我也很迷。

register模型之后,需要设置worker数目:

curl -v -X PUT "http://localhost:8081/models/faster_rcnn_38?min_worker=1"

然后就可以正常使用了。

4.6 TorchServe的API使用说明文档

请参考 TorchServe REST API


5.遇到的小坑

5.1 build docker镜像时指定mmcv的版本

【现象】部署服务之后会报错(报错还是警告信息,我忘记了,log会很快跳过去,得往上翻才看到),提示你MMCV版本不对;
【原因】前面build镜像的时候,默认安装mmcv版本不对,我这默认安装1.2.7,我用的mmdetection中mmcv的版本是1.3.4;
【解决办法】修改对应的Dockerfile中mmcv的版本信息
如果不知道Dockerfile在哪里,可以用:

locate docker/serve/

找到 Dockerfile 的路径再打开就行了;

修改MMCV版本(其他的版本我没动,其实和我实际使用的版本也不相同,没管):

ARG MMCV="1.3.4"   

5.2 docker环境坏掉

这坑有点大,第一次部署完我把服务关了,第二次部署发现docker环境坏了,搞了半天才正常,总结起来两点体会:
(1)不要轻易重装 docker 或者 nvidia-docker;
(2)实在没办法,该做的都做了,还不管用,如果可以的话,重启一下服务器试试;

5.3 部署机器上请求服务可以,自己机器上请求不到

我遇到这个问题是因为部署机器上的相应端口没开,(找管理员)打开 8080,8081,8082几个用到的端口就可以了。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值