From 52ed17d839a7f54c1bdd59a79ad868d8ce29ad12 Mon Sep 17 00:00:00 2001 From: Sachin Prasad Date: Thu, 17 Oct 2024 17:57:21 -0700 Subject: [PATCH 1/4] register vgg preset --- keras_hub/api/layers/__init__.py | 2 +- keras_hub/api/models/__init__.py | 2 +- keras_hub/src/models/vgg/__init__.py | 4 ++++ .../src/models/vgg/vgg_image_classifier.py | 19 ++++----------- .../vgg/vgg_image_classifier_preprocessor.py | 12 ++++++++++ .../models/vgg/vgg_image_classifier_test.py | 24 ++++++++++++++++--- .../src/models/vgg/vgg_image_converter.py | 8 +++++++ 7 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 keras_hub/src/models/vgg/vgg_image_classifier_preprocessor.py create mode 100644 keras_hub/src/models/vgg/vgg_image_converter.py diff --git a/keras_hub/api/layers/__init__.py b/keras_hub/api/layers/__init__.py index a32da3a42a..f200fb9bd4 100644 --- a/keras_hub/api/layers/__init__.py +++ b/keras_hub/api/layers/__init__.py @@ -52,7 +52,7 @@ from keras_hub.src.models.sam.sam_image_converter import SAMImageConverter from keras_hub.src.models.sam.sam_mask_decoder import SAMMaskDecoder from keras_hub.src.models.sam.sam_prompt_encoder import SAMPromptEncoder -from keras_hub.src.models.vgg.vgg_image_classifier import VGGImageConverter +from keras_hub.src.models.vgg.vgg_image_converter import VGGImageConverter from keras_hub.src.models.whisper.whisper_audio_converter import ( WhisperAudioConverter, ) diff --git a/keras_hub/api/models/__init__.py b/keras_hub/api/models/__init__.py index 4f16fcc3eb..f96de8a856 100644 --- a/keras_hub/api/models/__init__.py +++ b/keras_hub/api/models/__init__.py @@ -299,7 +299,7 @@ from keras_hub.src.models.text_to_image import TextToImage from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone from keras_hub.src.models.vgg.vgg_image_classifier import VGGImageClassifier -from keras_hub.src.models.vgg.vgg_image_classifier import ( +from keras_hub.src.models.vgg.vgg_image_classifier_preprocessor import ( VGGImageClassifierPreprocessor, ) from keras_hub.src.models.vit_det.vit_det_backbone import ViTDetBackbone diff --git a/keras_hub/src/models/vgg/__init__.py b/keras_hub/src/models/vgg/__init__.py index 076cf83025..cff1069eb3 100644 --- a/keras_hub/src/models/vgg/__init__.py +++ b/keras_hub/src/models/vgg/__init__.py @@ -1 +1,5 @@ +from keras_hub.src.models.vgg.vgg_presets import backbone_presets from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone +from keras_hub.src.utils.preset_utils import register_presets + +register_presets(backbone_presets, VGGBackbone) diff --git a/keras_hub/src/models/vgg/vgg_image_classifier.py b/keras_hub/src/models/vgg/vgg_image_classifier.py index f570d05b94..a72b256288 100644 --- a/keras_hub/src/models/vgg/vgg_image_classifier.py +++ b/keras_hub/src/models/vgg/vgg_image_classifier.py @@ -1,24 +1,12 @@ import keras from keras_hub.src.api_export import keras_hub_export -from keras_hub.src.layers.preprocessing.image_converter import ImageConverter from keras_hub.src.models.image_classifier import ImageClassifier -from keras_hub.src.models.image_classifier_preprocessor import ( - ImageClassifierPreprocessor, -) from keras_hub.src.models.task import Task from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone - - -@keras_hub_export("keras_hub.layers.VGGImageConverter") -class VGGImageConverter(ImageConverter): - backbone_cls = VGGBackbone - - -@keras_hub_export("keras_hub.models.VGGImageClassifierPreprocessor") -class VGGImageClassifierPreprocessor(ImageClassifierPreprocessor): - backbone_cls = VGGBackbone - image_converter_cls = VGGImageConverter +from keras_hub.src.models.vgg.vgg_image_classifier_preprocessor import ( + VGGImageClassifierPreprocessor, +) @keras_hub_export("keras_hub.models.VGGImageClassifier") @@ -211,6 +199,7 @@ def __init__( self.pooling = pooling self.pooling_hidden_dim = pooling_hidden_dim self.dropout = dropout + self.preprocessor = preprocessor def get_config(self): # Backbone serialized in `super` diff --git a/keras_hub/src/models/vgg/vgg_image_classifier_preprocessor.py b/keras_hub/src/models/vgg/vgg_image_classifier_preprocessor.py new file mode 100644 index 0000000000..f32f965095 --- /dev/null +++ b/keras_hub/src/models/vgg/vgg_image_classifier_preprocessor.py @@ -0,0 +1,12 @@ +from keras_hub.src.api_export import keras_hub_export +from keras_hub.src.models.image_classifier_preprocessor import ( + ImageClassifierPreprocessor, +) +from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone +from keras_hub.src.models.vgg.vgg_image_converter import VGGImageConverter + + +@keras_hub_export("keras_hub.models.VGGImageClassifierPreprocessor") +class VGGImageClassifierPreprocessor(ImageClassifierPreprocessor): + backbone_cls = VGGBackbone + image_converter_cls = VGGImageConverter diff --git a/keras_hub/src/models/vgg/vgg_image_classifier_test.py b/keras_hub/src/models/vgg/vgg_image_classifier_test.py index f2cc90ce6e..15d127c782 100644 --- a/keras_hub/src/models/vgg/vgg_image_classifier_test.py +++ b/keras_hub/src/models/vgg/vgg_image_classifier_test.py @@ -3,6 +3,10 @@ from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone from keras_hub.src.models.vgg.vgg_image_classifier import VGGImageClassifier +from keras_hub.src.models.vgg.vgg_image_converter import VGGImageConverter +from keras_hub.src.models.vgg.vgg_image_classifier_preprocessor import ( + VGGImageClassifierPreprocessor, +) from keras_hub.src.tests.test_case import TestCase @@ -16,11 +20,16 @@ def setUp(self): stackwise_num_filters=[2, 16, 16], image_shape=(8, 8, 3), ) + image_converter = VGGImageConverter(image_size=(8, 8)) + self.preprocessor = VGGImageClassifierPreprocessor( + image_converter=image_converter, + ) self.init_kwargs = { "backbone": self.backbone, "num_classes": 2, "activation": "softmax", "pooling": "flatten", + "preprocessor": self.preprocessor, } self.train_data = ( self.images, @@ -28,9 +37,6 @@ def setUp(self): ) def test_classifier_basics(self): - pytest.skip( - reason="TODO: enable after preprocessor flow is figured out" - ) self.run_task_test( cls=VGGImageClassifier, init_kwargs=self.init_kwargs, @@ -45,3 +51,15 @@ def test_saved_model(self): init_kwargs=self.init_kwargs, input_data=self.images, ) + + # @pytest.mark.large + def test_smallest_preset(self): + # Test that our forward pass is stable! + image_batch = self.load_test_image()[None, ...] / 255.0 + self.run_preset_test( + cls=VGGImageClassifier, + preset="vgg_11_imagenet", + input_data=image_batch, + expected_output_shape=(1, 1000), + expected_labels=[85], + ) \ No newline at end of file diff --git a/keras_hub/src/models/vgg/vgg_image_converter.py b/keras_hub/src/models/vgg/vgg_image_converter.py new file mode 100644 index 0000000000..69ccacbd1d --- /dev/null +++ b/keras_hub/src/models/vgg/vgg_image_converter.py @@ -0,0 +1,8 @@ +from keras_hub.src.api_export import keras_hub_export +from keras_hub.src.layers.preprocessing.image_converter import ImageConverter +from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone + + +@keras_hub_export("keras_hub.layers.VGGImageConverter") +class VGGImageConverter(ImageConverter): + backbone_cls = VGGBackbone From bdd18a0251f0ea4d4afa6697f5f5c21277bce737 Mon Sep 17 00:00:00 2001 From: Sachin Prasad Date: Thu, 17 Oct 2024 20:21:09 -0700 Subject: [PATCH 2/4] nit --- keras_hub/src/models/vgg/__init__.py | 2 +- .../src/models/vgg/vgg_image_classifier_test.py | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/keras_hub/src/models/vgg/__init__.py b/keras_hub/src/models/vgg/__init__.py index cff1069eb3..4850d0eab4 100644 --- a/keras_hub/src/models/vgg/__init__.py +++ b/keras_hub/src/models/vgg/__init__.py @@ -1,5 +1,5 @@ -from keras_hub.src.models.vgg.vgg_presets import backbone_presets from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone +from keras_hub.src.models.vgg.vgg_presets import backbone_presets from keras_hub.src.utils.preset_utils import register_presets register_presets(backbone_presets, VGGBackbone) diff --git a/keras_hub/src/models/vgg/vgg_image_classifier_test.py b/keras_hub/src/models/vgg/vgg_image_classifier_test.py index 15d127c782..74b6430b2e 100644 --- a/keras_hub/src/models/vgg/vgg_image_classifier_test.py +++ b/keras_hub/src/models/vgg/vgg_image_classifier_test.py @@ -3,10 +3,10 @@ from keras_hub.src.models.vgg.vgg_backbone import VGGBackbone from keras_hub.src.models.vgg.vgg_image_classifier import VGGImageClassifier -from keras_hub.src.models.vgg.vgg_image_converter import VGGImageConverter from keras_hub.src.models.vgg.vgg_image_classifier_preprocessor import ( VGGImageClassifierPreprocessor, ) +from keras_hub.src.models.vgg.vgg_image_converter import VGGImageConverter from keras_hub.src.tests.test_case import TestCase @@ -51,15 +51,3 @@ def test_saved_model(self): init_kwargs=self.init_kwargs, input_data=self.images, ) - - # @pytest.mark.large - def test_smallest_preset(self): - # Test that our forward pass is stable! - image_batch = self.load_test_image()[None, ...] / 255.0 - self.run_preset_test( - cls=VGGImageClassifier, - preset="vgg_11_imagenet", - input_data=image_batch, - expected_output_shape=(1, 1000), - expected_labels=[85], - ) \ No newline at end of file From 54893a8d62d000b0d4a0838cfa94edd965e0cc9b Mon Sep 17 00:00:00 2001 From: Sachin Prasad Date: Thu, 17 Oct 2024 22:17:47 -0700 Subject: [PATCH 3/4] nit --- keras_hub/src/models/vgg/vgg_image_classifier_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_hub/src/models/vgg/vgg_image_classifier_test.py b/keras_hub/src/models/vgg/vgg_image_classifier_test.py index 74b6430b2e..b288019a30 100644 --- a/keras_hub/src/models/vgg/vgg_image_classifier_test.py +++ b/keras_hub/src/models/vgg/vgg_image_classifier_test.py @@ -14,7 +14,7 @@ class VGGImageClassifierTest(TestCase): def setUp(self): # Setup model. self.images = np.ones((2, 8, 8, 3), dtype="float32") - self.labels = [0, 3] + self.labels = [0, 2] self.backbone = VGGBackbone( stackwise_num_repeats=[2, 4, 4], stackwise_num_filters=[2, 16, 16], From 0a591c2ad027154be67e1d00d1217a478314dd88 Mon Sep 17 00:00:00 2001 From: Sachin Prasad Date: Fri, 18 Oct 2024 09:48:45 -0700 Subject: [PATCH 4/4] nit --- keras_hub/src/models/vgg/vgg_image_classifier_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_hub/src/models/vgg/vgg_image_classifier_test.py b/keras_hub/src/models/vgg/vgg_image_classifier_test.py index b288019a30..34bb7e3db8 100644 --- a/keras_hub/src/models/vgg/vgg_image_classifier_test.py +++ b/keras_hub/src/models/vgg/vgg_image_classifier_test.py @@ -14,7 +14,7 @@ class VGGImageClassifierTest(TestCase): def setUp(self): # Setup model. self.images = np.ones((2, 8, 8, 3), dtype="float32") - self.labels = [0, 2] + self.labels = [0, 1] self.backbone = VGGBackbone( stackwise_num_repeats=[2, 4, 4], stackwise_num_filters=[2, 16, 16],