Detecton 是 Facebook 开源的目标检测,实例分割的统一框架,集成了很多最新的学术成果. 效果都很不错.
虽然有很多 Mask R-CNN 的实现和API , 如 Github项目 - Mask R-CNN 的 Keras 实现 和 Tensorflow - 目标检测 API 使用.
但 Detectron 中 Facebook 官方实现,个人感觉速度和显存占用,占优势.
基于 Caffe2. Caffe2 的 make
过程太久了,不知道相比于 Caffe 源码安装编译到底简单了多少,甚至感觉 Caffe make
更快. 可能 Caffe2 依赖项少了些吧.
不过,Caffe2 现在只到 0.8.1 版本,有些第三方库可能不可用了,未来将与 PyTorch 合并为一.
Detectron 的目标是, high-quality, high-performance 的目标检测研究平台. 以快速实现新想法
Detectron 项目论文:
- Feature Pyramid Networks for Object Detection
- Mask R-CNN - Marr Prize at ICCV 2017
- Detecting and Recognizing Human-Object Interactions
- Focal Loss for Dense Object Detection - RetinaNet -- Best Student Paper Award at ICCV 2017
- Non-local Neural Networks
- Learning to Segment Every Thing
- Data Distillation: Towards Omni-Supervised Learning.
- DensePose:Dense Human Pose Estimation In The Wild
- Group Normalization
- Faster R-CNN
- RPN
- Fast R-CNN
- R-FCN
基于的 Backbone 网络结构:
- ResNeXt{50,101,152}
- ResNet{50,101,152}
- Feature Pyramid Networks (with ResNet/ResNeXt)
- VGG16
Mask RCNN 输出.
From Detectron README.md.
1. Detectron 安装
Detectron ops 现还未给出 CPU 实现,需要基于 GPU 环境.
Requirements:
- NVIDIA GPU, Linux, Python2
- Caffe2, various standard Python packages, and the COCO API
- CUDA 8.0, cuDNN 6.0.21.(官方)
- CUDA 9.0, cuDNN 7.1.4.(测试)
- Ubuntu 16.04
1.1 Caffe2 安装
参考 Caffe2 - Source 安装及问题解决 和 Caffe2 官方 Install Instructions.
由于 Detectron 需要 Caffe2 包含 Detectron module,查看是否有该模块,没有的话更新 Caffe2 版本.
将 Caffe2 的 Python package 路径添加到 PYTHONPATH
环境变量,并确保 Caffe2 安装成功:
# To check if Caffe2 build was successful
python2 -c 'from caffe2.python import core' 2>/dev/null && echo "Success" || echo "Failure"
# To check if Caffe2 GPU build was successful
# This must print a number>0 in order to use Detectron
python2 -c 'from caffe2.python import workspace; print(workspace.NumCudaDevices())'
1.2 依赖性安装
Python 依赖项:
sudo pip install numpy \
pyyaml \
matplotlib \
opencv-python>=3.0 \
setuptools \
Cython \
mock
COCO API 安装:
# COCOAPI=/path/to/clone/cocoapi
git clone https://github.com/cocodataset/cocoapi.git $COCOAPI
cd $COCOAPI/PythonAPI
# Install into global site-packages
make install
# Alternatively, if you do not have permissions or prefer
# not to install the COCO API into global site-packages
python2 setup.py install --user
1.3 Detectron 安装
[1] - Clone Detectron reposity:
# DETECTRON=/path/to/clone/detectron
git clone https://github.com/facebookresearch/detectron $DETECTRON
这里貌似也可以是 Detectron
....
[2] - 安装 Python 依赖项:
# requirements.txt
numpy>=1.13
pyyaml>=3.12
matplotlib
opencv-python>=3.2
setuptools
Cython
mock
scipy
sudo pip install -r requirements.txt
[3] - 设置 Python 模块
cd $DETECTRON
make
[4] - 测试 Detectron 安装,如 SpatialNarrowAsOp test
:
python2 $DETECTRON/detectron/tests/test_spatial_narrow_as_op.py
安装完成后,即可用提供的模型进行推理测试.
2. COCO Dataset
Detectron 通过软链接将 COCO 数据集的 images 和 annotations 链接到路径 lib/datasets/data
,如:
ln -s /path/to/coco $DETECTRON/detectron/datasets/data/coco
更多关于 COCO 数据集和其它数据集软链接创建方法参考:detectron/datasets/data/README.md
.
完成以后,即可进行模型训练.
3. 定制新的 Operators
首先阅读 FAQ.md
中关于定制 operators 的部分.
方便起见,Detectron 提供 CMake 支持以编译定制的 operators. 所有的定制 operators 可以被编译成单个库,以便于 从 Python 动态的加载.
将定制的 operator 实现放在路径 detectron/ops/
.
参考示例 tests/test_zero_even_op.py
,关于如何从 Python 中加载定制的 operators.
(早期版本有此项,版本更新后已不是下面的操作)
cd $DETECTRON/lib
# [1] - 编译定制的 operators 库
make ops
# [2] - 测试定制的 operator 是否成功:
python2 $DETECTRON/tests/test_zero_even_op.py
4. Detectron Docker 镜像
[1] - 首先,创建 Caffe2 镜像:
cd /path/to/caffe2/docker/ubuntu-16.04-cuda8-cudnn6-all-options
# Use the latest Caffe2 master
sed -i -e 's/ --branch v0.8.1//g' Dockerfile
docker build -t caffe2:cuda8-cudnn6-all-options .
[2] - 然后,创建 Detecron 镜像:
cd $DETECTRON/docker
docker build -t detectron:c2-cuda8-cudnn6 .
[3] - 运行 Detectron 镜像,如 BatchPermutationOp test
:
nvidia-docker run --rm -it detectron:c2-cuda8-cudnn6 python2 detectron/tests/test_batch_permutation_op.py
已更新为如下:
[1] - 创建镜像:
cd $DETECTRON/docker
docker build -t detectron:c2-cuda9-cudnn7 .
[2] - 运行镜像:
nvidia-docker run --rm -it detectron:c2-cuda9-cudnn7 python \
detectron/tests/test_batch_permutation_op.py
5. 问题及解决
5.1 Caffe2 Operator Profiling
profiling
为 Caffe2 提供了有用的 operators benchmarking 和 debugging 工具,示例可参考 BatchPermutationOp test
.
Profiling 不是默认编译的,可以在运行 Caffe2 CMake 时设置 -DUSE_PROF=ON
以开启.
5.2 CMake Cannot Find CUDA and cuDNN
编译 Caffe2 时如果找不到 CUDA 和 cuDNN 路径,可以在编译时指定 CMake 的 CUDA 和 cuDNN 路径:
cmake .. \
# insert your Caffe2 CMake flags here
-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda/toolkit/dir \
-DCUDNN_ROOT_DIR=/path/to/cudnn/root/dir
类似地,编译定制的 Detectron operators 时可以运行:
cd $DETECTRON
mkdir -p build
cd build
cmake .. \
-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda/toolkit/dir \
-DCUDNN_ROOT_DIR=/path/to/cudnn/root/dir
make
可以采用相同的方式,处理机器上同时有多个 CUDA 和 cuDNN 版本时的情况.
5.3 Protobuf Errors
Caffe2 使用 protobuf 作为序列化格式,并需要其版本高于 3.2.0
.
如果 protobuf 版本较低,可以从 Caffe2 的 protobuf 子模块编译 protobuf,来代替旧版本.
编译 Caffe2 protobuf 子模块:
# CAFFE2=/path/to/caffe2
cd $CAFFE2/third_party/protobuf/cmake
mkdir -p build
cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=$HOME/c2_tp_protobuf \
-Dprotobuf_BUILD_TESTS=OFF \
-DCMAKE_CXX_FLAGS="-fPIC"
make install
指定 Caffe2 CMake 到新版本的 protobuf:
cmake .. \
# insert your Caffe2 CMake flags here
-DPROTOBUF_PROTOC_EXECUTABLE=$HOME/c2_tp_protobuf/bin/protoc \
-DPROTOBUF_INCLUDE_DIR=$HOME/c2_tp_protobuf/include \
-DPROTOBUF_LIBRARY=$HOME/c2_tp_protobuf/lib64/libprotobuf.a
5.4 Caffe2 Python Binaries
如果在编译 Caffe2 Python binaries时,不能找到需要的 Python 路径,如 virtualenv 环境,可以指定 Caffe2 CMake 到 python library 库路径和 include 路径:
cmake .. \
# insert your Caffe2 CMake flags here
-DPYTHON_LIBRARY=$(python -c "from distutils import sysconfig; print(sysconfig.get_python_lib())") \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils import sysconfig; print(sysconfig.get_python_inc())")
5.5 Caffe2 with NNPACK Build
Detectron 不需要 Caffe2 的 NNPACK 支持.
如果编译时遇到 NNPACK 相关的问题,可以关闭 NNPACK,设置 CMake -DUSE_NNPACK=OFF
.
5.6 Caffe2 with OpenCV Build
Detectron 也不需要 Caffe2 的 OpenCV 的支持,也可以关闭,设置 CMake -DUSE_OPENCV=OFF
.
5.7 COCO API Undefined Symbol Error
如果遇到由于 undefined symbol 原因,出现的 COCO API import error,类似与 cocoapi - Import error,则需要确定 Python 版本是够混淆,如 both system and conda numpy installed 则会导致该问题.
5.8 CMake Cannot Find Caffe2
如果在编译定制的 operators 时,CMake 出现不能找到 Caffe2 package 的问题,则需要确定在 Caffe2 安装时运行了 make install
.