Spaces:
Runtime error
Runtime error
# DeepLab2 | |
## **Requirements** | |
DeepLab2 depends on the following libraries: | |
* Python3 | |
* Numpy | |
* Pillow | |
* Matplotlib | |
* Tensorflow 2.5 | |
* Cython | |
* [Google Protobuf](https://developers.google.com/protocol-buffers) | |
* [Orbit](https://github.com/tensorflow/models/tree/master/orbit) | |
* [pycocotools](https://github.com/cocodataset/cocoapi/tree/master/PythonAPI/pycocotools) | |
(for AP-Mask) | |
## **Installation** | |
### Git Clone the Project | |
Clone the | |
[`google-research/deeplab2`](https://github.com/google-research/deeplab2) | |
repository. | |
```bash | |
mkdir ${YOUR_PROJECT_NAME} | |
cd ${YOUR_PROJECT_NAME} | |
git clone https://github.com/google-research/deeplab2.git | |
``` | |
### Install TensorFlow via PIP | |
```bash | |
# Install tensorflow 2.5 as an example. | |
# This should come with compatible numpy package. | |
pip install tensorflow==2.5 | |
``` | |
**NOTE:** You should find the right Tensorflow version according to your own | |
configuration at | |
https://www.tensorflow.org/install/source#tested_build_configurations. You also | |
need to choose the right cuda version as listed on the page if you want to run | |
with GPU. | |
### Install Protobuf | |
Below is a quick-to-start command line to install | |
[protobuf](https://github.com/protocolbuffers/protobuf) in Linux: | |
```bash | |
sudo apt-get install protobuf-compiler | |
``` | |
Alternatively, you can also download the package from web on other platforms. | |
Please refer to https://github.com/protocolbuffers/protobuf for more details | |
about installation. | |
### Other Libraries | |
The remaining libraries can be installed via pip: | |
```bash | |
# Pillow | |
pip install pillow | |
# matplotlib | |
pip install matplotlib | |
# Cython | |
pip install cython | |
``` | |
### Install Orbit | |
[`Orbit`](https://github.com/tensorflow/models/tree/master/orbit) is a flexible, | |
lightweight library designed to make it easy to write custom training loops in | |
TensorFlow 2. We used Orbit in our train/eval loops. You need to download the | |
code below: | |
```bash | |
cd ${YOUR_PROJECT_NAME} | |
git clone https://github.com/tensorflow/models.git | |
``` | |
### Install pycocotools | |
We also use | |
[`pycocotools`](https://github.com/cocodataset/cocoapi/tree/master/PythonAPI/pycocotools) | |
for instance segmentation evaluation. Below is the installation guide: | |
```bash | |
cd ${YOUR_PROJECT_NAME} | |
git clone https://github.com/cocodataset/cocoapi.git | |
# Compile cocoapi | |
cd ${YOUR_PROJECT_NAME}/cocoapi/PythonAPI | |
make | |
cd ${YOUR_PROJECT_NAME} | |
``` | |
## **Compilation** | |
The following instructions are running from `${YOUR_PROJECT_NAME}` directory: | |
```bash | |
cd ${YOUR_PROJECT_NAME} | |
``` | |
### Add Libraries to PYTHONPATH | |
When running locally, `${YOUR_PROJECT_NAME}` directory should be appended to | |
PYTHONPATH. This can be done by running the following command: | |
```bash | |
# From ${YOUR_PROJECT_NAME}: | |
# deeplab2 | |
export PYTHONPATH=$PYTHONPATH:`pwd` | |
# orbit | |
export PYTHONPATH=$PYTHONPATH:${PATH_TO_MODELS} | |
# pycocotools | |
export PYTHONPATH=$PYTHONPATH:${PATH_TO_cocoapi_PythonAPI} | |
``` | |
If you clone `models(for Orbit)` and `cocoapi` under `${YOUR_PROJECT_NAME}`, | |
here is an example: | |
```bash | |
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/models:`pwd`/cocoapi/PythonAPI | |
``` | |
### Compile Protocol Buffers | |
In DeepLab2, we define | |
[protocol buffers](https://developers.google.com/protocol-buffers) to configure | |
training and evaluation variants (see [proto definition](../../config.proto)). | |
However, protobuf needs to be compiled beforehand into a python recognizable | |
format. To compile protobuf, run: | |
```bash | |
# `${PATH_TO_PROTOC}` is the directory where the `protoc` binary locates. | |
${PATH_TO_PROTOC} deeplab2/*.proto --python_out=. | |
# Alternatively, if protobuf compiler is globally accessible, you can simply run: | |
protoc deeplab2/*.proto --python_out=. | |
``` | |
### (Optional) Compile Custom Ops | |
We implemented efficient merging operation to merge semantic and instance maps | |
for fast inference. You can follow the guide below to compile the provided | |
efficient merging operation in c++ under the folder `tensorflow_ops`. | |
The script is mostly from | |
[Compile the op using your system compiler](https://www.tensorflow.org/guide/create_op#compile_the_op_using_your_system_compiler_tensorflow_binary_installation) | |
in the official tensorflow guide to create custom ops. Please refer to | |
[Create an op](https://www.tensorflow.org/guide/create_op#compile_the_op_using_your_system_compiler_tensorflow_binary_installation) | |
for more details. | |
```bash | |
TF_CFLAGS=( $(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_compile_flags()))') ) | |
TF_LFLAGS=( $(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))') ) | |
OP_NAME='deeplab2/tensorflow_ops/kernels/merge_semantic_and_instance_maps_op' | |
# CPU | |
g++ -std=c++14 -shared \ | |
${OP_NAME}.cc ${OP_NAME}_kernel.cc -o ${OP_NAME}.so -fPIC ${TF_CFLAGS[@]} ${TF_LFLAGS[@]} -O2 | |
# GPU support (https://www.tensorflow.org/guide/create_op#compiling_the_kernel_for_the_gpu_device) | |
nvcc -std=c++14 -c -o ${OP_NAME}_kernel.cu.o ${OP_NAME}_kernel.cu.cc \ | |
${TF_CFLAGS[@]} -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC --expt-relaxed-constexpr | |
g++ -std=c++14 -shared -o ${OP_NAME}.so ${OP_NAME}.cc ${OP_NAME}_kernel.cc \ | |
${OP_NAME}_kernel.cu.o ${TF_CFLAGS[@]} -fPIC -lcudart ${TF_LFLAGS[@]} | |
``` | |
To test if the compilation is done successfully, you can run: | |
```bash | |
python deeplab2/tensorflow_ops/python/kernel_tests/merge_semantic_and_instance_maps_op_test.py | |
``` | |
Optionally, you could set `merge_semantic_and_instance_with_tf_op` to `false` in | |
the config file to skip provided efficient merging operation and use the slower | |
pure TF functions instead. See | |
`deeplab2/configs/cityscaspes/panoptic_deeplab/resnet50_os32_merge_with_pure_tf_func.textproto` | |
as an example. | |
### Test the Configuration | |
You can test if you have successfully installed and configured DeepLab2 by | |
running the following commands (requires compilation of custom ops): | |
```bash | |
# Model training test (test for custom ops, protobuf) | |
python deeplab2/model/deeplab_test.py | |
# Model evaluator test (test for other packages such as orbit, cocoapi, etc) | |
python deeplab2/trainer/evaluator_test.py | |
``` | |
### Quick All-in-One Script for Compilation (Linux Only) | |
We also provide a shell script to help you quickly compile and test everything | |
mentioned above for Linux users: | |
```bash | |
# CPU | |
deeplab2/compile.sh | |
# GPU | |
deeplab2/compile.sh gpu | |
``` | |
## Troubleshooting | |
**Q1: Can I use [conda](https://anaconda.org/) instead of pip?** | |
**A1:** We experienced several dependency issues with the most recent conda | |
package. We therefore do not provide support for installing deeplab2 via conda | |
at this stage. | |
________________________________________________________________________________ | |
**Q2: How can I specify a specific nvcc to use a specific gcc version?** | |
**A2:** At the moment, tensorflow requires a gcc version < 9. If your default | |
compiler has a higher version, the path to a different gcc needs to be set to | |
compile the custom GPU op. Please check that either gcc-7 or gcc-8 are | |
installed. | |
The compiler can then be set as follows: | |
```bash | |
# Assuming gcc-7 is installed in /usr/bin (can be verified by which gcc-7) | |
nvcc -std=c++14 -c -o ${OP_NAME}_kernel.cu.o ${OP_NAME}_kernel.cu.cc \ | |
${TF_CFLAGS[@]} -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC -ccbin=/usr/bin/g++-7 \ | |
--expt-relaxed-constexpr | |
g++-7 -std=c++14 -shared -o ${OP_NAME}.so ${OP_NAME}.cc ${OP_NAME}_kernel.cc \ | |
${OP_NAME}_kernel.cu.o ${TF_CFLAGS[@]} -fPIC -lcudart ${TF_LFLAGS[@]} | |
``` | |
________________________________________________________________________________ | |
**Q3: I got the following errors while compiling the efficient merging | |
operation:** | |
``` | |
fatal error: third_party/gpus/cuda/include/cuda_fp16.h: No such file or directory | |
``` | |
**A3:** It sounds like that CUDA headers are not linked. To resolve this issue, | |
you need to tell tensorflow where to find the CUDA headers: | |
1. Find the CUDA installation directory ${CUDA_DIR} which contains the | |
`include` folder (For example, `~/CUDA/gpus/cuda_11_0`). | |
2. Go to the directory where tensorflow package is installed. (You can find it | |
via `pip show tensorflow`.) | |
3. Then `cd` to `tensorflow/include/third_party/gpus/`. (If it doesn't exist, | |
create one.) | |
4. Symlink your CUDA include directory here: | |
``` | |
ln -s ${CUDA_DIR} ./cuda | |
``` | |
There have been similar issues and solutions discussed here: | |
https://github.com/tensorflow/tensorflow/issues/31912#issuecomment-547475301 | |