15/08/2024
: :sparkles: Have a look!!! We release the pre-training code and log on O365 dataset. You could try to reproduce our results.
06/08/2024
: :sparkler: Awesome!!! OV-SAM = OV-DINO + SAM2. We update OV-SAM marrying OV-DINO with SAM2 on the online demo.
16/07/2024
: We provide the online demo, click and enjoy !!! NOTE: You uploaded image will be stored for failure analysis.
16/07/2024
: We release the web inference demo, try to deploy it by yourself.
15/07/2024
: We release the fine-tuning code, try to fine-tune on your custom dataset. Feel free to raise issue if you encounter some problem.
15/07/2024
: We release the local inference demo, try to deploy OV-DINO on you local machine and run inference on images.
14/07/2024
: We release the pre-trained models and the evaluation code.
11/07/2024
: We release OV-DINO paper on arxiv. Code and pre-trained model are coming soon.
This project contains the official PyTorch implementation, pre-trained models, fine-tuning code, and inference demo for OV-DINO.
OV-DINO is a novel unified open vocabulary detection approach that offers superior performance and effectiveness for practical real-world application.
OV-DINO entails a Unified Data Integration pipeline that integrates diverse data sources for end-to-end pre-training, and a Language-Aware Selective Fusion module to improve the vision-language understanding of the model.
OV-DINO shows significant performance improvement on COCO and LVIS benchmarks compared to previous methods, achieving relative improvements of +2.5\% AP on COCO and +12.7\% AP on LVIS compared to G-DINO in zero-shot evaluation.
Model | Pre-Train Data | APmv | APr | APc | APf | APval | APr | APc | APf | APcoco | Weights |
---|---|---|---|---|---|---|---|---|---|---|---|
OV-DINO1 | O365 | 24.4 | 15.5 | 20.3 | 29.7 | 18.7 | 9.3 | 14.5 | 27.4 | 49.5 / 57.5 | CKPT / LOG π€ |
OV-DINO2 | O365,GoldG | 39.4 | 32.0 | 38.7 | 41.3 | 32.2 | 26.2 | 30.1 | 37.3 | 50.6 / 58.4 | CKPT π€ |
OV-DINO3 | O365,GoldG,CC1M‡ | 40.1 | 34.5 | 39.5 | 41.5 | 32.9 | 29.1 | 30.4 | 37.4 | 50.2 / 58.2 | CKPT π€ |
NOTE: APmv denotes the zero-shot evaluation results on LVIS MiniVal, APval denotes the zero-shot evaluation results on LVIS Val, APcoco denotes (zero-shot / fine-tune) evaluation results on COCO, respectively.
OV-DINO
βββ datas
βΒ Β βββ o365
β β βββ annotations
β β βββ train
β β βββ val
β β βββ test
βΒ Β βββ coco
β β βββ annotations
β β βββ train2017
β β βββ val2017
β βββ lvis
β β βββ annotations
β β βββ train2017
β β βββ val2017
β βββ custom
β βββ annotations
β βββ train
β βββ val
βββ docs
βββ inits
βΒ Β βββ huggingface
βΒ Β βββ ovdino
βΒ Β βββ sam2
βΒ Β βββ swin
βββ ovdino
βΒ Β βββ configs
βΒ Β βββ demo
βΒ Β βββ detectron2-717ab9
βΒ Β βββ detrex
βΒ Β βββ projects
βΒ Β βββ scripts
βΒ Β βββ tools
βββ wkdrs
β βββ ...
β
# clone this project
git clone https://github.com/wanghao9610/OV-DINO.git
cd OV-DINO
export root_dir=$(realpath ./)
cd $root_dir/ovdino
# Optional: set CUDA_HOME for cuda11.6.
# OV-DINO utilizes the cuda11.6 default, if your cuda is not cuda11.6, you need first export CUDA_HOME env manually.
export CUDA_HOME="your_cuda11.6_path"
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
echo -e "$log_format cuda version:\n$(nvcc -V)"
# create conda env for ov-dino
conda create -n ovdino -y
conda activate ovdino
conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia -y
conda install gcc=9 gxx=9 -c conda-forge -y # Optional: install gcc9
python -m pip install -e detectron2-717ab9
pip install -e ./
# Optional: create conda env for ov-sam, it may not compatible with ov-dino, so we create a new env.
# ov-sam = ov-dino + sam2
conda create -n ovsam -y
conda activate ovsam
conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 pytorch-cuda=12.1 -c pytorch -c nvidia -y
# install the sam2 following the sam2 project.
# please refer to https://github.com/facebookresearch/segment-anything-2.git
# download sam2 checkpoints and put them to inits/sam2
python -m pip install -e detectron2-717ab9
pip install -e ./
cd $root_dir
mkdir -p datas/coco
wget http://images.cocodataset.org/zips/train2017.zip -O datas/coco/train2017.zip
wget http://images.cocodataset.org/zips/val2017.zip -O datas/coco/val2017.zip
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip -O datas/coco/annotations_trainval2017.zip
cd $root_dir
unzip datas/coco/train2017.zip -d datas/coco
unzip datas/coco/val2017.zip -d datas/coco
unzip datas/coco/annotations_trainval2017.zip -d datas/coco
rm datas/coco/train2017.zip datas/coco/val2017.zip datas/coco/annotations_trainval2017.zip
cd $root_dir
mkdir -p datas/lvis
wget https://huggingface.co/hao9610/OV-DINO/resolve/main/lvis_v1_minival_inserted_image_name.json -O datas/lvis/annotations/lvis_v1_minival_inserted_image_name.json
wget https://huggingface.co/hao9610/OV-DINO/resolve/main/lvis_v1_val_inserted_image_name.json -O datas/lvis/annotations/lvis_v1_val_inserted_image_name.json
cd $root_dir
ln -s $(realpath datas/coco/train2017) datas/lvis
ln -s $(realpath datas/coco/val2017) datas/lvis
cd $root_dir
mkdir -p datas/o365/annotations
# Suppose you download the Objects365 raw file and put them on datas/o365/raw, extract the tared files and reorder them.
cd datas/o365/raw
tar -xvf Objects365_v1.tar.gz
cd 2019-08-02
for file in *.zip; do unzip -o "$file"; done
mv *.json $root_dir/datas/o365/annotations
mv train val test $root_dir/datas/o365
Download the pre-trained model from Model Zoo, and put them on inits/ovdino directory.
cd $root_dir/ovdino
bash scripts/eval.sh path_to_eval_config_file path_to_pretrained_model output_directory
cd $root_dir/ovdino
# Evaluation mean ap on COCO dataset.
bash scripts/eval.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_eval_coco.py \
../inits/ovdino/ovdino_swint_og-coco50.6_lvismv39.4_lvis32.2.pth \
../wkdrs/eval_ovdino
cd $root_dir/ovdino
# Evaluation of fixed_ap on LVIS MiniVal dataset.
bash scripts/eval.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_eval_lvismv.py \
../inits/ovdino/ovdino_swint_ogc-coco50.2_lvismv40.1_lvis32.9.pth \
../wkdrs/eval_ovdino
# Evaluation of fixed_ap on the LVIS Val dataset.
# It will require about 250GB of memory due to the large number of samples in the LVIS Val dataset, so please ensure that your machine has enough memory.
bash scripts/eval.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_eval_lvis.py \
../inits/ovdino/ovdino_swint_ogc-coco50.2_lvismv40.1_lvis32.9.pth \
../wkdrs/eval_ovdino
cd $root_dir/ovdino
bash scripts/finetune.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_ft_coco_24ep.py \
../inits/ovdino/ovdino_swint_og-coco50.6_lvismv39.4_lvis32.2.pth
Prepare your custom dataset as the COCO annotation format, following the instructions on custom_ovd.py.
Refer the following command to run fine-tuning.
cd $root_dir/ovdino
bash scripts/finetune.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_ft_custom_24ep.py \
../inits/ovdino/ovdino_swint_ogc-coco50.2_lvismv40.1_lvis32.9.pth
Download dataset following Objects365 Data Preparing.
Refer the following command to run pre-training.
On the first machine:
cd $root_dir/ovdino
# Replace $MASTER_PORT and $MASTER_ADDR with your actual machine settings.
NNODES=2 NODE_RANK=0 MASTER_PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR \
bash scripts/pretrain.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_pretrain_o365_24ep.py
On the second machine:
cd $root_dir/ovdino
# Replace $MASTER_PORT and $MASTER_ADDR with your actual machine settings.
NNODES=2 NODE_RANK=1 MASTER_PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR \
bash scripts/pretrain.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_pretrain_o365_24ep.py
NOTE: The default batch size for O365 pre-training is 64 in our experiments, and running on 2 nodes with 8 A100 GPUs per-node. If you encounter Out-of-Memory error, you can adjust the batch size and learning rate, total steps by linearly.
Coming soon ...
Coming soon ...
NOTE: We will release the all pre-training code after our paper is accepted.
Local inference on a image or folder give the category names.
# for ovdino: conda activate ovdino
# for ovsam: conda activate ovsam
cd $root_dir/ovdino
bash scripts/demo.sh demo_config.py pretrained_model category_names input_images_or_directory output_directory
Examples:
cd $root_dir/ovdino
# single image inference
bash scripts/demo.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_infer_demo.py \
../inits/ovdino/ovdino_swint_ogc-coco50.2_lvismv40.1_lvis32.9.pth \
"class0 class1 class2 ..." img0.jpg output_dir/img0_vis.jpg
# multi images inference
bash scripts/demo.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_infer_demo.py \
../inits/ovdino/ovdino_swint_ogc-coco50.2_lvismv40.1_lvis32.9.pth \
"class0 long_class1 long_class2 ..." "img0.jpg img1.jpg" output_dir
# image folder inference
bash scripts/demo.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_infer_demo.py \
../inits/ovdino/ovdino_swint_ogc-coco50.2_lvismv40.1_lvis32.9.pth \
"class0 long_class1 long_class2 ..." image_dir output_dir
NOTE: The input categorynames are separated by spaces, and the words of single class are connected by underline ().
Web inference demo.
cd $root_dir/ovdino
bash scripts/app.sh \
projects/ovdino/configs/ovdino_swin_tiny224_bert_base_infer_demo.py \
../inits/ovdino/ovdino_swint_ogc-coco50.2_lvismv40.1_lvis32.9.pth
After the web demo deployment, you can open the demo on your browser.
We also provide the online demo, click and enjoy.
This project has referenced some excellent open-sourced repos (Detectron2, detrex, GLIP, G-DINO, YOLO-World). Thanks for their wonderful works and contributions to the community.
If you find OV-DINO is helpful for your research or applications, please consider giving us a star π and citing it by the following BibTex entry.
@article{wang2024ovdino,
title={OV-DINO: Unified Open-Vocabulary Detection with Language-Aware Selective Fusion},
author={Hao Wang and Pengzhen Ren and Zequn Jie and Xiao Dong and Chengjian Feng and Yinlong Qian and Lin Ma and Dongmei Jiang and Yaowei Wang and Xiangyuan Lan and Xiaodan Liang},
journal={arXiv preprint arXiv:2407.07844},
year={2024}
}