Model Overview

Model Summary

HGNetV2 (Hierarchical Grid Network Version 2) is a modern convolutional neural network (CNN) architecture optimized for GPU efficiency and designed for computer vision tasks. Trained by the model authors on mined ImageNet-22k and ImageNet-1k using SSLD distillation, it excels in edge-focused classification tasks. HGNetV2 delivers strong top-1 accuracy while maintaining a small model footprint, making it ideal for real-time inference on resource-constrained devices.

Key Features:

  • GPU-optimized architecture for efficient inference
  • Lightweight design with strong performance-to-parameter ratio
  • Flexible downsampling strategies (early, late, or no downsampling)
  • Modular design with configurable stages and blocks
  • Learnable affine transformations for enhanced training stability

Training Strategies:

  • SSLD (Semi-Supervised Learning with Distillation): Uses knowledge distillation for improved performance
  • Stage 1: Single-stage training approach
  • Stage 2: Two-stage training with additional fine-tuning
  • ImageNet-22K → ImageNet-1K: Pre-trained on larger dataset, fine-tuned on ImageNet-1K

Weights are released under the Apache 2 License . Keras model code is released under the Apache 2 License.

Links

Installation

Keras and KerasHub can be installed with:

pip install -U -q keras-hub
pip install -U -q keras

Jax, TensorFlow, and Torch come preinstalled in Kaggle Notebooks. For instructions on installing them in another environment see the Keras Getting Started page.

Available HGNetV2 Presets

The following model checkpoints are provided by the Keras team. Full code examples for each are available below.

Preset Parameters Description
hgnetv2_b4_ssld_stage2_ft_in1k 13.6M HGNetV2-B4 model with 2-stage SSLD training, fine-tuned on ImageNet-1K.
hgnetv2_b5_ssld_stage1_in22k_in1k 33.4M HGNetV2-B5 model with 1-stage SSLD training, pre-trained on ImageNet-22K and fine-tuned on ImageNet-1K.
hgnetv2_b5_ssld_stage2_ft_in1k 33.4M HGNetV2-B5 model with 2-stage SSLD training, fine-tuned on ImageNet-1K.
hgnetv2_b6_ssld_stage1_in22k_in1k 69.2M HGNetV2-B6 model with 1-stage SSLD training, pre-trained on ImageNet-22K and fine-tuned on ImageNet-1K.
hgnetv2_b6_ssld_stage2_ft_in1k 69.2M HGNetV2-B6 model with 2-stage SSLD training, fine-tuned on ImageNet-1K.

Example Usage

# Make necessary imports.
import keras
import keras_hub
import numpy as np

# Load backbone for feature extraction.
backbone = keras_hub.models.HGNetV2Backbone.from_preset(
    "hgnetv2_b4_ssld_stage2_ft_in1k",
)

# Load pre-trained classifier.
classifier = keras_hub.models.HGNetV2ImageClassifier.from_preset(
    "hgnetv2_b4_ssld_stage2_ft_in1k",
)

# Setup parameters.
num_samples = 100
num_classes = 10
image_size = 224

# Use for inference.

# Generate random images - make sure batch size matches.
images = np.random.randint(0, 256, size=(num_samples, image_size, image_size, 3), dtype=np.uint8)

# Generate random labels - same batch size as images.
labels = np.random.randint(0, num_classes, size=(num_samples,), dtype=np.int32)
features = backbone(images)  # Multi-scale features
print(f"Features shape: {features.shape}")
predictions = classifier.predict(images)  # Classification output
print(f"Predictions shape: {predictions.shape}")

# Create custom HGNetV2 backbone.
backbone = keras_hub.models.HGNetV2Backbone(
    depths=[1, 2, 4],
    embedding_size=32,
    hidden_sizes=[64, 128, 256],
    stem_channels=[3, 16, 32],
    hidden_act="relu",
    use_learnable_affine_block=False,
    stackwise_stage_filters=[
    # Stage 0: (in_channels=32, mid_channels=16, out_channels=64, num_blocks=1, num_layers=1, kernel_size=3).
    (32, 16, 64, 1, 1, 3),
    # Stage 1: (in_channels=64, mid_channels=32, out_channels=128, num_blocks=2, num_layers=1, kernel_size=3).
    (64, 32, 128, 2, 1, 3),
    # Stage 2: (in_channels=128, mid_channels=64, out_channels=256, num_blocks=4, num_layers=1, kernel_size=3).
    (128, 64, 256, 4, 1, 3),
    ],
    apply_downsample=[False, True, True],
    use_lightweight_conv_block=[False, False, False],
    image_shape=(224, 224, 3),
)

# Freeze backbone for transfer learning.
classifier.backbone.trainable = False
print("Backbone frozen for transfer learning.")

# Compile for training.
classifier.compile(
    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer=keras.optimizers.Adam(5e-5),
    metrics=["accuracy"]
)
print("Classifier compiled.")

# Train on custom dataset.
history = classifier.fit(x=images, y=labels, batch_size=32)
print(f"Training completed. Training history: {history.history}")

Example Usage with Hugging Face URI

# Make necessary imports.
import keras
import keras_hub
import numpy as np

# Load backbone for feature extraction.
backbone = keras_hub.models.HGNetV2Backbone.from_preset(
    "hf://keras/hgnetv2_b4_ssld_stage2_ft_in1k",
)

# Load pre-trained classifier.
classifier = keras_hub.models.HGNetV2ImageClassifier.from_preset(
    "hf://keras/hgnetv2_b4_ssld_stage2_ft_in1k",
)

# Setup parameters.
num_samples = 100
num_classes = 10
image_size = 224

# Use for inference.

# Generate random images - make sure batch size matches.
images = np.random.randint(0, 256, size=(num_samples, image_size, image_size, 3), dtype=np.uint8)

# Generate random labels - same batch size as images.
labels = np.random.randint(0, num_classes, size=(num_samples,), dtype=np.int32)
features = backbone(images)  # Multi-scale features
print(f"Features shape: {features.shape}")
predictions = classifier.predict(images)  # Classification output
print(f"Predictions shape: {predictions.shape}")

# Create custom HGNetV2 backbone.
backbone = keras_hub.models.HGNetV2Backbone(
    depths=[1, 2, 4],
    embedding_size=32,
    hidden_sizes=[64, 128, 256],
    stem_channels=[3, 16, 32],
    hidden_act="relu",
    use_learnable_affine_block=False,
    stackwise_stage_filters=[
    # Stage 0: (in_channels=32, mid_channels=16, out_channels=64, num_blocks=1, num_layers=1, kernel_size=3).
    (32, 16, 64, 1, 1, 3),
    # Stage 1: (in_channels=64, mid_channels=32, out_channels=128, num_blocks=2, num_layers=1, kernel_size=3).
    (64, 32, 128, 2, 1, 3),
    # Stage 2: (in_channels=128, mid_channels=64, out_channels=256, num_blocks=4, num_layers=1, kernel_size=3).
    (128, 64, 256, 4, 1, 3),
    ],
    apply_downsample=[False, True, True],
    use_lightweight_conv_block=[False, False, False],
    image_shape=(224, 224, 3),
)

# Freeze backbone for transfer learning.
classifier.backbone.trainable = False
print("Backbone frozen for transfer learning.")

# Compile for training.
classifier.compile(
    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer=keras.optimizers.Adam(5e-5),
    metrics=["accuracy"]
)
print("Classifier compiled.")

# Train on custom dataset.
history = classifier.fit(x=images, y=labels, batch_size=32)
print(f"Training completed. Training history: {history.history}")
Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Collection including keras/hgnetv2_b4_ssld_stage2_ft_in1k

Paper for keras/hgnetv2_b4_ssld_stage2_ft_in1k