| --- |
| license: cc-by-nc-4.0 |
| pipeline_tag: image-classification |
| library_name: hailo |
| tags: |
| - image-classification |
| - birds |
| - efficientnet |
| - onnx |
| - hailo |
| - wildlife |
| datasets: |
| - inaturalist |
| language: [] |
| --- |
| |
| # BirdVision — EfficientNet-V2-S Bird Species Classifier |
|
|
| Fine-tuned [EfficientNet-V2-S](https://arxiv.org/abs/2104.00298) for bird species |
| classification across 237 North American species (Northeast / Long Island focus). |
|
|
| Part of the [BirdVision](https://github.com/evanwtf/birdvision) project — |
| real-time bird species identification from video using a Raspberry Pi 5 + Hailo-8 |
| AI accelerator. |
|
|
| ## Model details |
|
|
| | | | |
| |---|---| |
| | Base model | EfficientNet-V2-S (ImageNet-1K pretrained) | |
| | Input | 224×224 RGB, ImageNet normalization | |
| | Output | 237-class softmax logits | |
| | Training data | iNaturalist research-grade observations, New York state | |
| | Training images | ~94,800 photos across 237 species | |
| | Val top-1 accuracy | 80.7% | |
| | Val top-5 accuracy | 94.0% | |
|
|
| ## Training |
|
|
| Two-phase fine-tune on an NVIDIA RTX 3080 Ti: |
| - **Phase 1** (5 epochs, head only): frozen backbone, LR=1e-3 |
| - **Phase 2** (15 epochs, full): all layers unfrozen, LR=5e-5, cosine annealing |
|
|
| Augmentation: random resized crop, horizontal flip, rotation ±20°, color jitter. |
|
|
| ## Usage |
|
|
| ```python |
| import json |
| import numpy as np |
| import onnxruntime as ort |
| from PIL import Image |
| from huggingface_hub import hf_hub_download |
| |
| # Load model and labels |
| onnx_path = hf_hub_download("k10z/birdvision-efficientnet-s", "efficientnet_s_birds.onnx") |
| labels_path = hf_hub_download("k10z/birdvision-efficientnet-s", "species_labels.json") |
| |
| session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"]) |
| species = json.loads(open(labels_path).read()) |
| |
| # Preprocess image (224×224, ImageNet normalization) |
| def preprocess(image_path): |
| img = Image.open(image_path).convert("RGB").resize((224, 224)) |
| arr = np.array(img, dtype=np.float32) / 255.0 |
| mean = np.array([0.485, 0.456, 0.406]) |
| std = np.array([0.229, 0.224, 0.225]) |
| arr = (arr - mean) / std |
| return arr.transpose(2, 0, 1)[None] # NCHW |
| |
| # Run inference |
| logits = session.run(None, {"input": preprocess("bird.jpg")})[0][0] |
| top5 = np.argsort(logits)[::-1][:5] |
| for i in top5: |
| print(f"{species[i]:40s} {logits[i]:.3f}") |
| ``` |
|
|
| ## Species list |
|
|
| 237 species — Northeast North America focus (Long Island / NY area). |
| See `species_labels.json` for the full list. |
|
|
| ## Hailo-8 HEF (Raspberry Pi 5) |
|
|
| A compiled `efficientnet_s_birds.hef` for the [Hailo-8](https://hailo.ai/products/hailo-8/) |
| AI accelerator is included in this repo. |
|
|
| Benchmark on Raspberry Pi 5 (HailoRT 4.23.0): |
| - **22.3 FPS** hardware throughput |
| - **43.7 ms** hardware latency |
| - 4 contexts, 8 clusters |
|
|
| ## License |
|
|
| Model weights derived from iNaturalist training data licensed |
| [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) — |
| **non-commercial use only**. |
|
|