Spaces:
No application file
No application file
# Deployment | |
## Caffe2 Deployment | |
We currently support converting a detectron2 model to Caffe2 format through ONNX. | |
The converted Caffe2 model is able to run without detectron2 dependency in either Python or C++. | |
It has a runtime optimized for CPU & mobile inference, but not for GPU inference. | |
Caffe2 conversion requires PyTorch ≥ 1.4 and ONNX ≥ 1.6. | |
### Coverage | |
It supports 3 most common meta architectures: `GeneralizedRCNN`, `RetinaNet`, `PanopticFPN`, | |
and most official models under these 3 meta architectures. | |
Users' custom extensions under these architectures (added through registration) are supported | |
as long as they do not contain control flow or operators not available in Caffe2 (e.g. deformable convolution). | |
For example, custom backbones and heads are often supported out of the box. | |
### Usage | |
The conversion APIs are documented at [the API documentation](../modules/export). | |
We provide a tool, `caffe2_converter.py` as an example that uses | |
these APIs to convert a standard model. | |
To convert an official Mask R-CNN trained on COCO, first | |
[prepare the COCO dataset](../../datasets/), then pick the model from [Model Zoo](../../MODEL_ZOO.md), and run: | |
``` | |
cd tools/deploy/ && ./caffe2_converter.py --config-file ../../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ | |
--output ./caffe2_model --run-eval \ | |
MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl \ | |
MODEL.DEVICE cpu | |
``` | |
Note that: | |
1. The conversion needs valid sample inputs & weights to trace the model. That's why the script requires the dataset. | |
You can modify the script to obtain sample inputs in other ways. | |
2. With the `--run-eval` flag, it will evaluate the converted models to verify its accuracy. | |
The accuracy is typically slightly different (within 0.1 AP) from PyTorch due to | |
numerical precisions between different implementations. | |
It's recommended to always verify the accuracy in case your custom model is not supported by the | |
conversion. | |
The converted model is available at the specified `caffe2_model/` directory. Two files `model.pb` | |
and `model_init.pb` that contain network structure and network parameters are necessary for deployment. | |
These files can then be loaded in C++ or Python using Caffe2's APIs. | |
The script generates `model.svg` file which contains a visualization of the network. | |
You can also load `model.pb` to tools such as [netron](https://github.com/lutzroeder/netron) to visualize it. | |
### Use the model in C++/Python | |
The model can be loaded in C++. An example [caffe2_mask_rcnn.cpp](../../tools/deploy/) is given, | |
which performs CPU/GPU inference using `COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x`. | |
The C++ example needs to be built with: | |
* PyTorch with caffe2 inside | |
* gflags, glog, opencv | |
* protobuf headers that match the version of your caffe2 | |
* MKL headers if caffe2 is built with MKL | |
The following can compile the example inside [official detectron2 docker](../../docker/): | |
``` | |
sudo apt update && sudo apt install libgflags-dev libgoogle-glog-dev libopencv-dev | |
pip install mkl-include | |
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-cpp-3.6.1.tar.gz | |
tar xf protobuf-cpp-3.6.1.tar.gz | |
export CPATH=$(readlink -f ./protobuf-3.6.1/src/):$HOME/.local/include | |
export CMAKE_PREFIX_PATH=$HOME/.local/lib/python3.6/site-packages/torch/ | |
mkdir build && cd build | |
cmake -DTORCH_CUDA_ARCH_LIST=$TORCH_CUDA_ARCH_LIST .. && make | |
# To run: | |
./caffe2_mask_rcnn --predict_net=./model.pb --init_net=./model_init.pb --input=input.jpg | |
``` | |
Note that: | |
* All converted models (the .pb files) take two input tensors: | |
"data" is an NCHW image, and "im_info" is an Nx3 tensor consisting of (height, width, 1.0) for | |
each image (the shape of "data" might be larger than that in "im_info" due to padding). | |
* The converted models do not contain post-processing operations that | |
transform raw layer outputs into formatted predictions. | |
The example only produces raw outputs (28x28 masks) from the final | |
layers that are not post-processed, because in actual deployment, an application often needs | |
its custom lightweight post-processing (e.g. full-image masks for every detected object is often not necessary). | |
We also provide a python wrapper around the converted model, in the | |
[Caffe2Model.\_\_call\_\_](../modules/export.html#detectron2.export.Caffe2Model.__call__) method. | |
This method has an interface that's identical to the [pytorch versions of models](./models.md), | |
and it internally applies pre/post-processing code to match the formats. | |
They can serve as a reference for pre/post-processing in actual deployment. | |