商汤科技(2018 COCO 目标检测挑战赛冠军)和香港中文大学最近开源了一个基于Pytorch实现的深度学习目标检测工具箱mmdetection,支持Faster-RCNN,Mask-RCNN,Fast-RCNN等主流的目标检测框架,现在又加入Cascade-RCNN、SSD以及其他一系列目标检测框架。目前没有yolo的计划hhh。
相比于Facebook开源的Detectron框架,作者声称mmdetection有三点优势:performance稍高、训练速度稍快、所需显存稍小。
项目需要,这个项目开源的时间又比较短,相关教程比较少啦,就记录下自己踩的坑给别人铺路吧。
本人的系统环境:
Ubuntu 16.04
Cuda 9.0 + Cudnn 7.1.3
Python 3.6 (mmdetection要求Python版本需要3.4+)
Anaconda 3 (可选)
这里推荐大家使用Anaconda,可以比较方便的创建Python虚拟环境,避免不同的Python库之间产生冲突。在安装mmdetection之前,需要安装以下几个依赖库:
PyTorch 0.4.1 和 torchvision
Cython
mmcv
下面是我的安装和测试步骤,以Anaconda 3为例。
1.安装anaconda3
这里官网https://www.anaconda.com/download/#linux 找对应的python版本即可,down下来之后 bash下载下来的.sh文件。
然后一路yes 即可。现在的版本自动加入~/.bashrc中,不需要手动添加路径啦。
下载包的过程很慢,因为默认是国外的源。推荐换源。不要用清华的源,反正我清华的源下着下着老是down掉了,用中科大的源。
sudo gedit ~/.condarc
然后替换下面的代码:
channels:
- https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
- https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
show_channel_urls: true
保存后source一下即可。
2. 使用conda创建Python虚拟环境,这样就创建了名为mmdetection的Python3.6环境,并且在terminal中激活
conda create -n mmdetection python=3.6
source activate mmdetection
3. 安装pytorch0.4.1 gpu版本,这里pytorch0.4.1 官网已经找不到了 需要翻墙才能找到 所以不建议pip安装,conda安装比较稳,反正我是被坑的 清华的源下载pytorch老是崩,pip方法又装不上,可以说来来回回折腾了好几遍了。 github mmdetection上说现在也支持1.0的了。没有人去弄过我不想当第一个吃螃蟹的人 就只在这里贴一下,如果有人实在想用pytorch1.0的话。
https://github.com/open-mmlab/mmdetection/pull/157
不想的话老老实实按照下面安装0.4.1吧。
conda install pytorch=0.4.1 torchvision -c pytorch
安装好以后,进入Python环境,输入以下代码测试是否安装成功,不报错则说明安装成功
import torch
import torchvision
在这里有一个困了我一天的天坑 , 我import torch的时候报了下面的错
>>> import torch
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/szagoruyko/anaconda/lib/python2.7/site-packages/torch/__init__.py", line 1, in <module>
from torch._C import *
ImportError: dlopen(/Users/szagoruyko/anaconda/lib/python2.7/site-packages/torch/_C.so, 2): Symbol not found: _THRefcountedMapAllocator
Referenced from: /Users/szagoruyko/anaconda/lib/python2.7/site-packages/torch/lib/libshm.dylib
Expected in: /Users/szagoruyko/torch/install/lib/libTH.dylib
in /Users/szagoruyko/anaconda/lib/python2.7/site-packages/torch/lib/libshm.dylib
(上述来自github的描述,我的报错忘记截图了)
网上给的一个最相关的解答竟然是重装conda或者降回到torch0.4.0 可是mmdetection必须要求0.4.1啊! 我就傻傻的重装了好几次 带着中科大的源也偶尔下载失败,耗了一天,最后在github上找到解答。是机器之前有人装过detectron,里面装过pytorch,在~/.bashrc中加入了 pytorch的 PATH,导致冲突,注释掉之前的即可。
4.安装cython
conda install cython
5.安装mmcv
git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
pip install .
注意pip install 后面有个点,别漏了
6.安装mmdetection
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
./compile.sh
python setup.py install
到此,我们就完成了mmdetection及其依赖库的安装
7.测试demo
将下方的代码写入py文件,并存放到mmdetection文件夹目录下,然后运行。该代码的功能是检测图片中的目标,测试模型是官方给出的Faster-RCNN-fpn-resnet50的模型,运行代码会自动下载模型。由于模型是存储在亚马逊云服务器上,速度可能会稍慢。
import mmcv
from mmcv.runner import load_checkpoint
from mmdet.models import build_detector
from mmdet.apis import inference_detector, show_result
cfg = mmcv.Config.fromfile('configs/faster_rcnn_r50_fpn_1x.py')
cfg.model.pretrained = None
# 构建网络,载入模型
model = build_detector(cfg.model, test_cfg=cfg.test_cfg)
_ = load_checkpoint(model, 'https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/faster_rcnn_r50_fpn_1x_20181010-3d1b3351.pth')
# 测试一张图片
img = mmcv.imread('test.jpg')
result = inference_detector(model, img, cfg)
show_result(img, result)
结果: