mirror of
https://github.com/IDEA-Research/GroundingDINO.git
synced 2025-06-03 14:50:05 +08:00
v0.1.0 release
This commit is contained in:
parent
08bd3c2e9b
commit
5a826116c8
142
.gitignore
vendored
Normal file
142
.gitignore
vendored
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
pip-wheel-metadata/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
db.sqlite3-journal
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# pipenv
|
||||||
|
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||||
|
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||||
|
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||||
|
# install all needed dependencies.
|
||||||
|
#Pipfile.lock
|
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# vscode
|
||||||
|
.vscode/
|
||||||
|
output/
|
||||||
|
outputs/
|
||||||
|
subs/
|
||||||
|
logs/
|
||||||
|
|
||||||
|
grounding/config/configs
|
||||||
|
grounding/version.py
|
||||||
|
|
||||||
|
vis/
|
||||||
|
tmp/
|
63
README.md
63
README.md
@ -22,6 +22,65 @@ Description
|
|||||||
<img src=".asset/hero_figure.png" alt="ODinW" width="100%">
|
<img src=".asset/hero_figure.png" alt="ODinW" width="100%">
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## TODO List
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<input type="checkbox" name="uchk" checked>
|
||||||
|
<label for="uchk">Release inference code and demo.</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input type="checkbox" name="uchk" checked>
|
||||||
|
<label for="uchk">Release checkpoints.</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input type="checkbox" name="uchk">
|
||||||
|
<label for="uchk">Grounding DINO with Stable Diffusion and GLIGEN demos.</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
### 1. Install
|
||||||
|
If you have a CUDA environment, please make sure the environment variable `CUDA_HOME` is set.
|
||||||
|
```bash
|
||||||
|
pip install -e .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Run an inference demo
|
||||||
|
See the `demo/inference_on_a_image.py` for more details.
|
||||||
|
```bash
|
||||||
|
CUDA_VISIBLE_DEVICES=6 python demo/inference_on_a_image.py \
|
||||||
|
-c /path/to/config \
|
||||||
|
-p /path/to/checkpoint \
|
||||||
|
-i .asset/cats.png \
|
||||||
|
-o "outputs/0" \
|
||||||
|
-t "cat ear."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Checkpoints
|
||||||
|
<!-- insert a table -->
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr style="text-align: right;">
|
||||||
|
<th></th>
|
||||||
|
<th>name</th>
|
||||||
|
<th>backbone</th>
|
||||||
|
<th>Data</th>
|
||||||
|
<th>box AP on COCO</th>
|
||||||
|
<th>Checkpoint</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th>1</th>
|
||||||
|
<td>GroundingDINO-T</td>
|
||||||
|
<td>Swin-T</td>
|
||||||
|
<td>O365,GoldG,Cap4M</td>
|
||||||
|
<td>48.4 (zero-shot) / 57.2 (fine-tune)</td>
|
||||||
|
<td><a href="https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth">link</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Results
|
## Results
|
||||||
<details open>
|
<details open>
|
||||||
<summary><font size="4">
|
<summary><font size="4">
|
||||||
@ -52,6 +111,10 @@ Marrying Grounding DINO with <a href="https://github.com/gligen/GLIGEN">GLIGEN</
|
|||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Model
|
## Model
|
||||||
|
|
||||||
Includes: a text backbone, an image backbone, a feature enhancer, a language-guided query selection, and a cross-modality decoder.
|
Includes: a text backbone, an image backbone, a feature enhancer, a language-guided query selection, and a cross-modality decoder.
|
||||||
|
@ -12,8 +12,6 @@ from groundingdino.util import box_ops
|
|||||||
from groundingdino.util.slconfig import SLConfig
|
from groundingdino.util.slconfig import SLConfig
|
||||||
from groundingdino.util.utils import clean_state_dict, get_phrases_from_posmap
|
from groundingdino.util.utils import clean_state_dict, get_phrases_from_posmap
|
||||||
|
|
||||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
|
||||||
|
|
||||||
|
|
||||||
def plot_boxes_to_image(image_pil, tgt):
|
def plot_boxes_to_image(image_pil, tgt):
|
||||||
H, W = tgt["size"]
|
H, W = tgt["size"]
|
||||||
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
transformers==4.5.1
|
208
setup.py
Normal file
208
setup.py
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
# Copyright 2022 The IDEA Authors. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
# ------------------------------------------------------------------------------------------------
|
||||||
|
# Modified from
|
||||||
|
# https://github.com/fundamentalvision/Deformable-DETR/blob/main/models/ops/setup.py
|
||||||
|
# https://github.com/facebookresearch/detectron2/blob/main/setup.py
|
||||||
|
# https://github.com/open-mmlab/mmdetection/blob/master/setup.py
|
||||||
|
# https://github.com/Oneflow-Inc/libai/blob/main/setup.py
|
||||||
|
# ------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
import torch
|
||||||
|
from setuptools import find_packages, setup
|
||||||
|
from torch.utils.cpp_extension import CUDA_HOME, CppExtension, CUDAExtension
|
||||||
|
|
||||||
|
# groundingdino version info
|
||||||
|
version = "0.1.0"
|
||||||
|
package_name = "groundingdino"
|
||||||
|
cwd = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
|
||||||
|
sha = "Unknown"
|
||||||
|
try:
|
||||||
|
sha = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=cwd).decode("ascii").strip()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def write_version_file():
|
||||||
|
version_path = os.path.join(cwd, "groundingdino", "version.py")
|
||||||
|
with open(version_path, "w") as f:
|
||||||
|
f.write(f"__version__ = '{version}'\n")
|
||||||
|
# f.write(f"git_version = {repr(sha)}\n")
|
||||||
|
|
||||||
|
|
||||||
|
requirements = ["torch", "torchvision"]
|
||||||
|
|
||||||
|
torch_ver = [int(x) for x in torch.__version__.split(".")[:2]]
|
||||||
|
|
||||||
|
|
||||||
|
def get_extensions():
|
||||||
|
this_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
extensions_dir = os.path.join(this_dir, "groundingdino", "models", "GroundingDINO", "csrc")
|
||||||
|
|
||||||
|
main_source = os.path.join(extensions_dir, "vision.cpp")
|
||||||
|
sources = glob.glob(os.path.join(extensions_dir, "**", "*.cpp"))
|
||||||
|
source_cuda = glob.glob(os.path.join(extensions_dir, "**", "*.cu")) + glob.glob(
|
||||||
|
os.path.join(extensions_dir, "*.cu")
|
||||||
|
)
|
||||||
|
|
||||||
|
sources = [main_source] + sources
|
||||||
|
|
||||||
|
extension = CppExtension
|
||||||
|
|
||||||
|
extra_compile_args = {"cxx": []}
|
||||||
|
define_macros = []
|
||||||
|
|
||||||
|
if torch.cuda.is_available() and CUDA_HOME is not None:
|
||||||
|
print("Compiling with CUDA")
|
||||||
|
extension = CUDAExtension
|
||||||
|
sources += source_cuda
|
||||||
|
define_macros += [("WITH_CUDA", None)]
|
||||||
|
extra_compile_args["nvcc"] = [
|
||||||
|
"-DCUDA_HAS_FP16=1",
|
||||||
|
"-D__CUDA_NO_HALF_OPERATORS__",
|
||||||
|
"-D__CUDA_NO_HALF_CONVERSIONS__",
|
||||||
|
"-D__CUDA_NO_HALF2_OPERATORS__",
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
print("Compiling without CUDA")
|
||||||
|
define_macros += [("WITH_HIP", None)]
|
||||||
|
extra_compile_args["nvcc"] = []
|
||||||
|
return None
|
||||||
|
|
||||||
|
sources = [os.path.join(extensions_dir, s) for s in sources]
|
||||||
|
include_dirs = [extensions_dir]
|
||||||
|
|
||||||
|
ext_modules = [
|
||||||
|
extension(
|
||||||
|
"groundingdino._C",
|
||||||
|
sources,
|
||||||
|
include_dirs=include_dirs,
|
||||||
|
define_macros=define_macros,
|
||||||
|
extra_compile_args=extra_compile_args,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
return ext_modules
|
||||||
|
|
||||||
|
|
||||||
|
def parse_requirements(fname="requirements.txt", with_version=True):
|
||||||
|
"""Parse the package dependencies listed in a requirements file but strips
|
||||||
|
specific versioning information.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
fname (str): path to requirements file
|
||||||
|
with_version (bool, default=False): if True include version specs
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[str]: list of requirements items
|
||||||
|
|
||||||
|
CommandLine:
|
||||||
|
python -c "import setup; print(setup.parse_requirements())"
|
||||||
|
"""
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from os.path import exists
|
||||||
|
|
||||||
|
require_fpath = fname
|
||||||
|
|
||||||
|
def parse_line(line):
|
||||||
|
"""Parse information from a line in a requirements text file."""
|
||||||
|
if line.startswith("-r "):
|
||||||
|
# Allow specifying requirements in other files
|
||||||
|
target = line.split(" ")[1]
|
||||||
|
for info in parse_require_file(target):
|
||||||
|
yield info
|
||||||
|
else:
|
||||||
|
info = {"line": line}
|
||||||
|
if line.startswith("-e "):
|
||||||
|
info["package"] = line.split("#egg=")[1]
|
||||||
|
elif "@git+" in line:
|
||||||
|
info["package"] = line
|
||||||
|
else:
|
||||||
|
# Remove versioning from the package
|
||||||
|
pat = "(" + "|".join([">=", "==", ">"]) + ")"
|
||||||
|
parts = re.split(pat, line, maxsplit=1)
|
||||||
|
parts = [p.strip() for p in parts]
|
||||||
|
|
||||||
|
info["package"] = parts[0]
|
||||||
|
if len(parts) > 1:
|
||||||
|
op, rest = parts[1:]
|
||||||
|
if ";" in rest:
|
||||||
|
# Handle platform specific dependencies
|
||||||
|
# http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies
|
||||||
|
version, platform_deps = map(str.strip, rest.split(";"))
|
||||||
|
info["platform_deps"] = platform_deps
|
||||||
|
else:
|
||||||
|
version = rest # NOQA
|
||||||
|
info["version"] = (op, version)
|
||||||
|
yield info
|
||||||
|
|
||||||
|
def parse_require_file(fpath):
|
||||||
|
with open(fpath, "r") as f:
|
||||||
|
for line in f.readlines():
|
||||||
|
line = line.strip()
|
||||||
|
if line and not line.startswith("#"):
|
||||||
|
for info in parse_line(line):
|
||||||
|
yield info
|
||||||
|
|
||||||
|
def gen_packages_items():
|
||||||
|
if exists(require_fpath):
|
||||||
|
for info in parse_require_file(require_fpath):
|
||||||
|
parts = [info["package"]]
|
||||||
|
if with_version and "version" in info:
|
||||||
|
parts.extend(info["version"])
|
||||||
|
if not sys.version.startswith("3.4"):
|
||||||
|
# apparently package_deps are broken in 3.4
|
||||||
|
platform_deps = info.get("platform_deps")
|
||||||
|
if platform_deps is not None:
|
||||||
|
parts.append(";" + platform_deps)
|
||||||
|
item = "".join(parts)
|
||||||
|
yield item
|
||||||
|
|
||||||
|
packages = list(gen_packages_items())
|
||||||
|
return packages
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(f"Building wheel {package_name}-{version}")
|
||||||
|
|
||||||
|
with open("LICENSE", "r", encoding="utf-8") as f:
|
||||||
|
license = f.read()
|
||||||
|
|
||||||
|
write_version_file()
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name="groundingdino",
|
||||||
|
version="0.1.0",
|
||||||
|
author="International Digital Economy Academy, Shilong Liu",
|
||||||
|
url="https://github.com/IDEA-Research/GroundingDINO",
|
||||||
|
description="open-set object detector",
|
||||||
|
license=license,
|
||||||
|
install_requires=parse_requirements("requirements.txt"),
|
||||||
|
packages=find_packages(
|
||||||
|
exclude=(
|
||||||
|
"configs",
|
||||||
|
"tests",
|
||||||
|
)
|
||||||
|
),
|
||||||
|
ext_modules=get_extensions(),
|
||||||
|
cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension},
|
||||||
|
)
|
Loading…
x
Reference in New Issue
Block a user