文章目录
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几个用到的端口就可以了。