File size: 5,151 Bytes
63f03b9
 
 
cee9983
7af1e0d
63f03b9
 
7af1e0d
63f03b9
cee9983
 
 
 
63f03b9
cee9983
 
63f03b9
 
c1a25b8
cee9983
 
 
c1a25b8
cee9983
7af1e0d
cee9983
 
 
 
 
 
 
7af1e0d
63f03b9
cee9983
 
 
63f03b9
 
cee9983
 
 
 
7af1e0d
cee9983
 
 
 
 
7af1e0d
 
 
cee9983
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63f03b9
cee9983
7af1e0d
cee9983
 
 
7af1e0d
 
 
 
 
 
 
 
 
cee9983
 
 
7af1e0d
cee9983
 
 
7af1e0d
cee9983
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
---
pipeline_tag: zero-shot-object-detection
license: apache-2.0
base_model: google/owlv2-large-patch14-ensemble
library_name: zeromodels
tags:
- keras
- zeromodels
- owlv2
- open-vocabulary
- zero-shot-object-detection
- object-detection
- arxiv:2306.09683
- pytorch
- jax
- tf
---

## ***See [our collection](https://huggingface.co/collections/zeromodels/owlv2-6a8eaf81d6249f084e688a81) for all versions of OWLv2.***

# Run OWLv2 with Keras 3: JAX, PyTorch, or TensorFlow

[![GitHub](https://img.shields.io/badge/GitHub-ZeroModels-black?logo=github)](https://github.com/IMvision12/ZeroModels) [![Docs](https://img.shields.io/badge/Docs-OWLv2-blue)](https://imvision12.github.io/ZeroModels/owlv2/) [![Collection](https://img.shields.io/badge/HF-OWLv2%20collection-yellow)](https://huggingface.co/collections/zeromodels/owlv2-6a8eaf81d6249f084e688a81)

# zeromodels/owlv2-large-patch14-ensemble

Paper: [Scaling Open-Vocabulary Object Detection (arXiv:2306.09683)](https://arxiv.org/abs/2306.09683) · [HF Papers](https://huggingface.co/papers/2306.09683)

OWLv2 keeps OWL-ViT's dual-tower skeleton and per-patch detection head, and scales it with self-training on web image-text pairs. It adds an objectness head (a learned is-this-patch-an-object score) and pads images to a square before resizing, which matters for post-processing target sizes.

For more details on the model, please go to Google's original [model card](https://huggingface.co/google/owlv2-large-patch14-ensemble).

Pure-**Keras 3** conversion of [`google/owlv2-large-patch14-ensemble`](https://huggingface.co/google/owlv2-large-patch14-ensemble) for [zeromodels](https://github.com/IMvision12/ZeroModels). One implementation runs unmodified on **TensorFlow / Torch / JAX**.

This is an **open-vocabulary object detection** checkpoint (`Owlv2Detect`): pass free-text prompts at inference time.

## ✨ Quick start

```python
import os
os.environ["KERAS_BACKEND"] = "torch"  # or "jax" / "tensorflow"

from PIL import Image
from zeromodels.models.owlv2 import (
    Owlv2Detect,
    Owlv2Processor,
    Owlv2ImageProcessor,
)

model = Owlv2Detect.from_weights("zeromodels/owlv2-large-patch14-ensemble")
processor = Owlv2Processor.from_weights("zeromodels/owlv2-large-patch14-ensemble")
image_processor = Owlv2ImageProcessor.from_weights("zeromodels/owlv2-large-patch14-ensemble")

image = Image.open("your_image.jpg").convert("RGB")
prompts = ["a photo of a mug", "a photo of a knife"]
inputs = processor(text=[prompts], images=image)
output = model(
    {
        "input_ids": inputs["input_ids"],
        "pixel_values": inputs["pixel_values"],
    }
)
results = image_processor.post_process_object_detection(
    output,
    threshold=0.1,
    target_sizes=[(image.height, image.width)],
    text_labels=[prompts],
)[0]
for score, name, box in zip(
    results["scores"], results["text_labels"], results["boxes"]
):
    print(f"{name}: {float(score):.3f} {box}")
```

Load any OWL-ViT / OWLv2 variant the same way with `from_weights("zeromodels/<variant>")` (use `Owlv2Detect` for this repo):

| Variant | Hub | Family |
|---|---|---|
| `owlvit-base-patch32` | [`zeromodels/owlvit-base-patch32`](https://huggingface.co/zeromodels/owlvit-base-patch32) | OWL-ViT |
| `owlvit-base-patch16` | [`zeromodels/owlvit-base-patch16`](https://huggingface.co/zeromodels/owlvit-base-patch16) | OWL-ViT |
| `owlvit-large-patch14` | [`zeromodels/owlvit-large-patch14`](https://huggingface.co/zeromodels/owlvit-large-patch14) | OWL-ViT |
| `owlv2-base-patch16` | [`zeromodels/owlv2-base-patch16`](https://huggingface.co/zeromodels/owlv2-base-patch16) | OWLv2 |
| `owlv2-base-patch16-ensemble` | [`zeromodels/owlv2-base-patch16-ensemble`](https://huggingface.co/zeromodels/owlv2-base-patch16-ensemble) | OWLv2 |
| `owlv2-base-patch16-finetuned` | [`zeromodels/owlv2-base-patch16-finetuned`](https://huggingface.co/zeromodels/owlv2-base-patch16-finetuned) | OWLv2 |
| `owlv2-large-patch14` | [`zeromodels/owlv2-large-patch14`](https://huggingface.co/zeromodels/owlv2-large-patch14) | OWLv2 |
| `owlv2-large-patch14-ensemble` | [`zeromodels/owlv2-large-patch14-ensemble`](https://huggingface.co/zeromodels/owlv2-large-patch14-ensemble) | OWLv2 |
| `owlv2-large-patch14-finetuned` | [`zeromodels/owlv2-large-patch14-finetuned`](https://huggingface.co/zeromodels/owlv2-large-patch14-finetuned) | OWLv2 |

## Tips

- Set `KERAS_BACKEND` **before** importing Keras / zeromodels.
- Prefer `Processor.from_weights(...)` so image size matches the variant.
- Open-vocab thresholds are often much lower than closed-set detectors (try `0.1`).
- OWLv2 pads to square before resize; pass the original `(height, width)` as `target_sizes` carefully (see the OWLv2 docs for the padding trap).
- See [OWLv2 docs](https://imvision12.github.io/ZeroModels/owlv2/) and [Loading Weights](https://imvision12.github.io/ZeroModels/loading_weights/).
- Community / upstream safetensors still work via the `hf:` prefix, e.g. `Owlv2Detect.from_weights("hf:google/owlv2-large-patch14-ensemble")`.

## Special Thanks

A huge thank you to the Google OWLv2 authors for creating and releasing these models.

License: Apache 2.0.