DINOv2 Garbage Classification

A fine-tuned DINOv2 ViT-L/14 model for garbage image classification.

This repository is prepared as a workshop baseline model, allowing participants to quickly start experimenting with transfer learning techniques without training a Vision Transformer from scratch.

The checkpoint can be used directly for inference or as an initialization for further fine-tuning on custom datasets.


Overview

This project fine-tunes Meta AI's DINOv2 ViT-L/14 backbone for a three-class garbage classification task.

Unlike conventional CNN-based approaches, DINOv2 learns powerful visual representations through self-supervised learning, making it an excellent backbone for downstream computer vision tasks with limited labeled data.

Participants are encouraged to extend this model with techniques such as:

  • Hard Example Mining
  • Active Learning
  • Semi-supervised Learning
  • Domain Adaptation
  • Knowledge Distillation
  • Custom Classification Heads
  • Full Backbone Fine-tuning
  • Test-Time Augmentation (TTA)

Model Architecture

Input Image (518 Γ— 518)
        β”‚
        β–Ό
DINOv2 ViT-L/14 Backbone
        β”‚
        β–Ό
1024-D Feature Vector
        β”‚
        β–Ό
LayerNorm
        β”‚
        β–Ό
Linear (1024 β†’ 512)
        β”‚
        β–Ό
GELU
        β”‚
        β–Ό
Dropout (0.3)
        β”‚
        β–Ό
Linear (512 β†’ 3)
        β”‚
        β–Ό
Prediction

Backbone

  • Base Model: facebookresearch/dinov2
  • Variant: dinov2_vitl14
  • Feature Dimension: 1024
  • Framework: PyTorch

Training strategy:

  • Freeze entire backbone
  • Unfreeze last 4 transformer blocks
  • Train custom classification head

Dataset

The model classifies garbage into three categories.

Label Class
0 Recyclable
1 Electronic
2 Organic

Sample Images

Recyclable

Electronic

Organic


Dataset Statistics

Split Images
Training 23,873
Validation 2,653
Test 1,458

Class Distribution

Class Images
Recyclable 12,567
Electronic 9,999
Organic 3,960

Data Augmentation

Training images are augmented using:

  • Random Resized Crop
  • Horizontal Flip
  • Color Jitter
  • Gaussian Blur
  • RandAugment
  • ImageNet Normalization

Input resolution:

518 Γ— 518

Repository Structure

.
β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ 0_Recyclable/
β”‚   β”œβ”€β”€ 1_Electronic/
β”‚   └── 2_Organic/
β”‚
β”œβ”€β”€ best_dinov2.pth
└── README.md

Load the Model

import torch
import torch.nn as nn
from huggingface_hub import hf_hub_download

pth_path = hf_hub_download(
    repo_id="galihkjaya/DINOv2-Garbage-Classification",
    filename="best_dinov2.pth"
)

class DINOv2Classifier(nn.Module):
    def __init__(self, num_classes=3, unfreeze_blocks=4):
        super().__init__()

        self.backbone = torch.hub.load(
            "facebookresearch/dinov2",
            "dinov2_vitl14"
        )

        for p in self.backbone.parameters():
            p.requires_grad = False

        for block in self.backbone.blocks[-unfreeze_blocks:]:
            for p in block.parameters():
                p.requires_grad = True

        self.head = nn.Sequential(
            nn.LayerNorm(1024),
            nn.Linear(1024, 512),
            nn.GELU(),
            nn.Dropout(0.3),
            nn.Linear(512, num_classes)
        )

    def forward(self, x):
        features = self.backbone(x)
        return self.head(features)

model = DINOv2Classifier()

model.load_state_dict(torch.load(pth_path, map_location="cpu"))
model.eval()

Inference Example

from PIL import Image
from torchvision import transforms

transform = transforms.Compose([
    transforms.Resize((518, 518)),
    transforms.ToTensor(),
    transforms.Normalize(
        mean=(0.485,0.456,0.406),
        std=(0.229,0.224,0.225)
    )
])

labels = {
    0: "Recyclable",
    1: "Electronic",
    2: "Organic"
}

image = Image.open("sample.jpg").convert("RGB")
image = transform(image).unsqueeze(0)

with torch.no_grad():
    logits = model(image)
    pred = logits.argmax(1).item()

print(labels[pred])

Future Improvement

This checkpoint serves as the baseline model. Suggested follow-up experiments include:

  • Fine-tune all transformer blocks
  • Hard Example Mining
  • Replace the classification head
  • Add new waste categories
  • Train with Focal Loss
  • Label Smoothing
  • Test-Time Augmentation
  • MixUp / CutMix
  • Semi-supervised Learning
  • Domain Adaptation
  • Feature Extraction using DINOv2 embeddings

The objective is to demonstrate how a strong pretrained visual backbone can be adapted efficiently for downstream classification tasks.


Limitations

  • Only supports three waste categories.
  • Performance depends on image quality and lighting conditions.
  • Mixed-material waste may be difficult to classify.
  • Intended for educational and research purposes.

Acknowledgements

This project builds upon:

  • Meta AI β€” DINOv2
  • PyTorch
  • Hugging Face Hub
  • Kaggle

Citation

@misc{galih2026,
  title={DINOv2 Garbage Classification},
  author={Galih Kusuma Wijaya},
  year={2026},
  publisher={Hugging Face},
  howpublished={https://huggingface.co/galihkjaya/DINOv2-Garbage-Classification}
}
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support