kmodels 0.2.0__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kmodels-0.2.0 → kmodels-0.2.2}/PKG-INFO +11 -2
- {kmodels-0.2.0 → kmodels-0.2.2}/README.md +6 -1
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/__init__.py +1 -1
- kmodels-0.2.2/kmodels/_test_runner.py +171 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/__init__.py +3 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/cait/cait_layers.py +1 -1
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/cait/cait_model.py +8 -3
- kmodels-0.2.2/kmodels/models/cait/convert_cait_torch_to_keras.py +205 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convnext/config.py +24 -24
- kmodels-0.2.2/kmodels/models/convnext/convert_convnext_torch_to_keras.py +277 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convnext/convnext_model.py +22 -10
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convnextv2/config.py +18 -18
- kmodels-0.2.2/kmodels/models/convnextv2/convert_convnextv2_torch_to_keras.py +145 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/detr/detr_layers.py +15 -2
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/detr/detr_model.py +12 -18
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientformer/convert_efficientformer_torch_to_keras.py +4 -2
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientformer/efficientformer_layers.py +12 -7
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientformer/efficientformer_model.py +51 -82
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/eomt/eomt_layers.py +9 -3
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/eomt/eomt_model.py +50 -45
- kmodels-0.2.2/kmodels/models/mit/convert_mit_torch_to_keras.py +182 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mit/mit_layers.py +12 -5
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mit/mit_model.py +18 -9
- kmodels-0.2.2/kmodels/models/mlp_mixer/convert_mlpmixer_torch_to_keras.py +147 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mlp_mixer/mlp_mixer_model.py +3 -5
- kmodels-0.2.2/kmodels/models/nextvit/__init__.py +1 -0
- kmodels-0.2.2/kmodels/models/nextvit/config.py +71 -0
- kmodels-0.2.2/kmodels/models/nextvit/convert_nextvit_timm_to_keras.py +198 -0
- kmodels-0.2.2/kmodels/models/nextvit/nextvit_layers.py +120 -0
- kmodels-0.2.2/kmodels/models/nextvit/nextvit_model.py +735 -0
- kmodels-0.2.2/kmodels/models/pit/convert_pit_torch_to_keras.py +246 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/pit/pit_model.py +9 -8
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/rf_detr/convert_rf_detr_torch_to_keras.py +4 -1
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/rf_detr/rf_detr_layers.py +64 -21
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/rf_detr/rf_detr_model.py +94 -52
- kmodels-0.2.2/kmodels/models/rt_detr/__init__.py +11 -0
- kmodels-0.2.2/kmodels/models/rt_detr/config.py +66 -0
- kmodels-0.2.2/kmodels/models/rt_detr/convert_rt_detr_hf_to_keras.py +403 -0
- kmodels-0.2.2/kmodels/models/rt_detr/rt_detr_image_processor.py +289 -0
- kmodels-0.2.2/kmodels/models/rt_detr/rt_detr_layers.py +560 -0
- kmodels-0.2.2/kmodels/models/rt_detr/rt_detr_model.py +1116 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/sam/sam_layers.py +329 -305
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/sam/sam_model.py +63 -43
- kmodels-0.2.2/kmodels/models/sam2/__init__.py +6 -0
- kmodels-0.2.2/kmodels/models/sam2/config.py +62 -0
- kmodels-0.2.2/kmodels/models/sam2/convert_sam2_hf_to_keras.py +374 -0
- kmodels-0.2.2/kmodels/models/sam2/sam2_layers.py +1591 -0
- kmodels-0.2.2/kmodels/models/sam2/sam2_model.py +574 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/segformer/config.py +6 -6
- kmodels-0.2.2/kmodels/models/segformer/convert_segformer_torch_to_keras.py +329 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/segformer/segformer_model.py +40 -10
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/swin/config.py +15 -15
- kmodels-0.2.2/kmodels/models/swin/convert_swin_torch_to_keras.py +196 -0
- kmodels-0.2.2/kmodels/models/swin/swin_layers.py +480 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/swin/swin_model.py +207 -247
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vit/config.py +27 -27
- kmodels-0.2.2/kmodels/models/vit/convert_vit_torch_to_keras.py +184 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vit/vit_model.py +3 -5
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/utils/weight_split_torch_and_keras.py +5 -4
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/version.py +1 -1
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels.egg-info/PKG-INFO +11 -2
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels.egg-info/SOURCES.txt +18 -0
- kmodels-0.2.2/kmodels.egg-info/entry_points.txt +2 -0
- kmodels-0.2.2/kmodels.egg-info/requires.txt +6 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/pyproject.toml +19 -0
- kmodels-0.2.0/kmodels/models/cait/convert_cait_torch_to_keras.py +0 -142
- kmodels-0.2.0/kmodels/models/convnext/convert_convnext_torch_to_keras.py +0 -117
- kmodels-0.2.0/kmodels/models/convnextv2/convert_convnextv2_torch_to_keras.py +0 -117
- kmodels-0.2.0/kmodels/models/mit/convert_mit_torch_to_keras.py +0 -127
- kmodels-0.2.0/kmodels/models/mlp_mixer/convert_mlpmixer_torch_to_keras.py +0 -110
- kmodels-0.2.0/kmodels/models/pit/convert_pit_torch_to_keras.py +0 -170
- kmodels-0.2.0/kmodels/models/segformer/convert_segformer_torch_to_keras.py +0 -166
- kmodels-0.2.0/kmodels/models/swin/convert_swin_torch_to_keras.py +0 -123
- kmodels-0.2.0/kmodels/models/swin/swin_layers.py +0 -498
- kmodels-0.2.0/kmodels/models/vit/convert_vit_torch_to_keras.py +0 -130
- kmodels-0.2.0/kmodels.egg-info/requires.txt +0 -1
- {kmodels-0.2.0 → kmodels-0.2.2}/LICENSE +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/layers/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/layers/image_normalization.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/layers/layer_scale.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/layers/stochastic_depth.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/model_registry.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/cait/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/cait/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/clip_image_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/clip_layers.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/clip_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/clip_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/clip_tokenizer.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/clip/convert_clip_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convmixer/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convmixer/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convmixer/convert_convmixer_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convmixer/convmixer_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convnext/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convnext/convnext_layers.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convnextv2/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/convnextv2/convnextv2_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deeplabv3/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deeplabv3/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deeplabv3/convert_deeplabv3_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deeplabv3/deeplabv3_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deit/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deit/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deit/convert_deit_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/deit/deit_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/densenet/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/densenet/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/densenet/convert_densenet_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/densenet/densenet_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/detr/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/detr/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/detr/convert_detr_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/detr/detr_image_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientformer/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientformer/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet/convert_efficientnet_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet/efficientnet_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet_lite/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet_lite/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet_lite/convert_efficientnet_lite_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnet_lite/efficientnet_lite_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnetv2/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnetv2/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnetv2/convert_efficientnetv2_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/efficientnetv2/efficientnetv2_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/eomt/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/eomt/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/eomt/convert_eomt_hf_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/eomt/eomt_image_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/flexivit/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/flexivit/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/flexivit/convert_flexivit_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/flexivit/flexivit_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_next/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_next/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_next/convert_inception_next_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_next/inception_next_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_resnetv2/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_resnetv2/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_resnetv2/convert_inceptionresnetv2_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inception_resnetv2/inceptionresnetv2_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv3/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv3/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv3/convert_inceptionv3_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv3/inceptionv3_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv4/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv4/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv4/convert_inceptionv4_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/inceptionv4/inceptionv4_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mit/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mit/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mlp_mixer/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mlp_mixer/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv2/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv2/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv2/convert_mobilenetv2_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv2/mobilenetv2_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv3/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv3/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv3/convert_mobilenetv3_keras_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilenetv3/mobilenetv3_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevit/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevit/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevit/convert_mobilevit_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevit/mobilevit_layers.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevit/mobilevit_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevitv2/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevitv2/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevitv2/convert_mobilevitv2_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/mobilevitv2/mobilevitv2_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/pit/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/pit/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/poolformer/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/poolformer/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/poolformer/convert_poolformer_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/poolformer/poolformer_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/res2net/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/res2net/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/res2net/convert_res2net_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/res2net/res2net_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resmlp/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resmlp/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resmlp/convert_resmlp_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resmlp/resmlp_layers.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resmlp/resmlp_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnet/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnet/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnet/convert_resnet_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnet/resnet_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnetv2/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnetv2/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnetv2/convert_resnetv2_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnetv2/resnetv2_layers.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnetv2/resnetv2_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnext/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnext/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnext/convert_resnext_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/resnext/resnext_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/rf_detr/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/rf_detr/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/rf_detr/rf_detr_image_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/sam/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/sam/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/sam/convert_sam_hf_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/sam/sam_image_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/segformer/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/segformer/segformer_image_preprocessor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/senet/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/senet/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/senet/convert_senet_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/senet/senet_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/convert_siglip_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/siglip_image_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/siglip_layers.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/siglip_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/siglip_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip/siglip_tokenizer.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip2/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip2/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip2/convert_siglip2_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip2/siglip2_image_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip2/siglip2_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip2/siglip2_processor.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/siglip2/siglip2_tokenizer.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/swin/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vgg/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vgg/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vgg/convert_vgg_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vgg/vgg_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vit/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/vit/vit_layers.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/xception/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/xception/config.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/xception/convert_xception_org_keras_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/models/xception/xception_model.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/utils/__init__.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/utils/custom_exception.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/utils/file_downloader.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/utils/model_equivalence_tester.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/utils/model_weights_util.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels/utils/weight_transfer_torch_to_keras.py +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels.egg-info/dependency_links.txt +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/kmodels.egg-info/top_level.txt +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/setup.cfg +0 -0
- {kmodels-0.2.0 → kmodels-0.2.2}/tests/test_modelling.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kmodels
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Pretrained keras 3 vision models
|
|
5
5
|
Author-email: Gitesh Chawda <gitesh.ch.0912@gmail.com>
|
|
6
6
|
License: Apache License 2.0
|
|
@@ -25,6 +25,10 @@ Requires-Python: >=3.11
|
|
|
25
25
|
Description-Content-Type: text/markdown
|
|
26
26
|
License-File: LICENSE
|
|
27
27
|
Requires-Dist: keras
|
|
28
|
+
Provides-Extra: test
|
|
29
|
+
Requires-Dist: pytest; extra == "test"
|
|
30
|
+
Requires-Dist: pytest-cov; extra == "test"
|
|
31
|
+
Requires-Dist: requests; extra == "test"
|
|
28
32
|
Dynamic: license-file
|
|
29
33
|
|
|
30
34
|
# Keras Models 🚀
|
|
@@ -35,7 +39,7 @@ Dynamic: license-file
|
|
|
35
39
|
|
|
36
40
|
## 📖 Introduction
|
|
37
41
|
|
|
38
|
-
Keras Models (kmodels) is a collection of models with pretrained weights, built entirely with Keras 3. It supports a range of tasks, including classification, object detection (DETR), segmentation (SAM, SegFormer, DeepLabV3, EoMT), vision-language modeling (CLIP, SigLIP, SigLIP2), and more. kmodels includes custom layers and backbone support, providing flexibility and efficiency across various applications. For backbones, there are various weight variants like `in1k`, `in21k`, `fb_dist_in1k`, `ms_in22k`, `fb_in22k_ft_in1k`, `ns_jft_in1k`, `aa_in1k`, `cvnets_in1k`, `augreg_in21k_ft_in1k`, `augreg_in21k`, and many more.
|
|
42
|
+
Keras Models (kmodels) is a collection of models with pretrained weights, built entirely with Keras 3. It supports a range of tasks, including classification, object detection (DETR, RT-DETR, RF-DETR), segmentation (SAM, SAM2, SegFormer, DeepLabV3, EoMT), vision-language modeling (CLIP, SigLIP, SigLIP2), and more. kmodels includes custom layers and backbone support, providing flexibility and efficiency across various applications. For backbones, there are various weight variants like `in1k`, `in21k`, `fb_dist_in1k`, `ms_in22k`, `fb_in22k_ft_in1k`, `ns_jft_in1k`, `aa_in1k`, `cvnets_in1k`, `augreg_in21k_ft_in1k`, `augreg_in21k`, and many more.
|
|
39
43
|
|
|
40
44
|
## ⚡ Installation
|
|
41
45
|
|
|
@@ -62,6 +66,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
62
66
|
| Model | Description |
|
|
63
67
|
|-------|-------------|
|
|
64
68
|
| [SAM](docs/sam.md) | Segment Anything Model — promptable segmentation with points, boxes, or masks (ViT-B/L/H) |
|
|
69
|
+
| [SAM2](docs/sam2.md) | Segment Anything Model 2 — next generation of promptable visual segmentation (Hiera Tiny/Small/Base+/Large) |
|
|
65
70
|
| [SegFormer](docs/segformer.md) | Transformer-based semantic segmentation with MLP decoder, Cityscapes & ADE20K weights |
|
|
66
71
|
| [DeepLabV3](docs/deeplabv3.md) | Atrous convolution-based semantic segmentation |
|
|
67
72
|
| [EoMT](docs/eomt.md) | Encoder-only Mask Transformer for panoptic segmentation |
|
|
@@ -71,6 +76,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
71
76
|
| Model | Description |
|
|
72
77
|
|-------|-------------|
|
|
73
78
|
| [DETR](docs/detr.md) | End-to-end object detection with Transformers (ResNet-50/101 backbones) |
|
|
79
|
+
| [RT-DETR](docs/rt_detr.md) | Real-time DETR with ResNet-vd backbone and hybrid encoder (ResNet-18/34/50/101 variants) |
|
|
74
80
|
| [RF-DETR](docs/rf_detr.md) | Real-time detection transformer (Nano, Small, Medium, Base, Large variants) |
|
|
75
81
|
|
|
76
82
|
**Vision-Language Models**
|
|
@@ -107,6 +113,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
107
113
|
| MobileNetV3 | [Searching for MobileNetV3](https://arxiv.org/abs/1905.02244) | `keras` |
|
|
108
114
|
| MobileViT | [MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer](https://arxiv.org/abs/2110.02178) | `timm` |
|
|
109
115
|
| MobileViTV2 | [Separable Self-attention for Mobile Vision Transformers](https://arxiv.org/abs/2206.02680) | `timm` |
|
|
116
|
+
| NextViT | [Next-ViT: Next Generation Vision Transformer for Efficient Deployment in Realistic Industrial Scenarios](https://arxiv.org/abs/2207.05501) | `timm` |
|
|
110
117
|
| PiT | [Rethinking Spatial Dimensions of Vision Transformers](https://arxiv.org/abs/2103.16302) | `timm` |
|
|
111
118
|
| PoolFormer | [MetaFormer is Actually What You Need for Vision](https://arxiv.org/abs/2111.11418) | `timm` |
|
|
112
119
|
| Res2Net | [Res2Net: A New Multi-scale Backbone Architecture](https://arxiv.org/abs/1904.01169) | `timm` |
|
|
@@ -127,6 +134,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
127
134
|
| 🏷️ Model Name | 📜 Reference Paper | 📦 Source of Weights |
|
|
128
135
|
|---------------|-------------------|---------------------|
|
|
129
136
|
| DETR | [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) | `transformers`|
|
|
137
|
+
| RT-DETR | [DETRs Beat YOLOs on Real-time Object Detection](https://arxiv.org/abs/2304.08069) | `transformers` |
|
|
130
138
|
| RF-DETR | [RF-DETR: Real-Time Detection Transformer](https://arxiv.org/abs/2502.18860) | `rfdetr` |
|
|
131
139
|
|
|
132
140
|
<br>
|
|
@@ -138,6 +146,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
138
146
|
| DeepLabV3 | [Rethinking Atrous Convolution for Semantic Image Segmentation](https://arxiv.org/abs/1706.05587) | `torchvision` |
|
|
139
147
|
| EoMT | [Encoder-only Mask Transformer for Panoptic Segmentation](https://arxiv.org/abs/2504.07957) | `transformers` |
|
|
140
148
|
| SAM | [Segment Anything](https://arxiv.org/abs/2304.02643) | `transformers` |
|
|
149
|
+
| SAM2 | [SAM 2: Segment Anything in Images and Videos](https://arxiv.org/abs/2408.00714) | `transformers` |
|
|
141
150
|
| SegFormer | [SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers](https://arxiv.org/abs/2105.15203) | `transformers`|
|
|
142
151
|
|
|
143
152
|
<br>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## 📖 Introduction
|
|
8
8
|
|
|
9
|
-
Keras Models (kmodels) is a collection of models with pretrained weights, built entirely with Keras 3. It supports a range of tasks, including classification, object detection (DETR), segmentation (SAM, SegFormer, DeepLabV3, EoMT), vision-language modeling (CLIP, SigLIP, SigLIP2), and more. kmodels includes custom layers and backbone support, providing flexibility and efficiency across various applications. For backbones, there are various weight variants like `in1k`, `in21k`, `fb_dist_in1k`, `ms_in22k`, `fb_in22k_ft_in1k`, `ns_jft_in1k`, `aa_in1k`, `cvnets_in1k`, `augreg_in21k_ft_in1k`, `augreg_in21k`, and many more.
|
|
9
|
+
Keras Models (kmodels) is a collection of models with pretrained weights, built entirely with Keras 3. It supports a range of tasks, including classification, object detection (DETR, RT-DETR, RF-DETR), segmentation (SAM, SAM2, SegFormer, DeepLabV3, EoMT), vision-language modeling (CLIP, SigLIP, SigLIP2), and more. kmodels includes custom layers and backbone support, providing flexibility and efficiency across various applications. For backbones, there are various weight variants like `in1k`, `in21k`, `fb_dist_in1k`, `ms_in22k`, `fb_in22k_ft_in1k`, `ns_jft_in1k`, `aa_in1k`, `cvnets_in1k`, `augreg_in21k_ft_in1k`, `augreg_in21k`, and many more.
|
|
10
10
|
|
|
11
11
|
## ⚡ Installation
|
|
12
12
|
|
|
@@ -33,6 +33,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
33
33
|
| Model | Description |
|
|
34
34
|
|-------|-------------|
|
|
35
35
|
| [SAM](docs/sam.md) | Segment Anything Model — promptable segmentation with points, boxes, or masks (ViT-B/L/H) |
|
|
36
|
+
| [SAM2](docs/sam2.md) | Segment Anything Model 2 — next generation of promptable visual segmentation (Hiera Tiny/Small/Base+/Large) |
|
|
36
37
|
| [SegFormer](docs/segformer.md) | Transformer-based semantic segmentation with MLP decoder, Cityscapes & ADE20K weights |
|
|
37
38
|
| [DeepLabV3](docs/deeplabv3.md) | Atrous convolution-based semantic segmentation |
|
|
38
39
|
| [EoMT](docs/eomt.md) | Encoder-only Mask Transformer for panoptic segmentation |
|
|
@@ -42,6 +43,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
42
43
|
| Model | Description |
|
|
43
44
|
|-------|-------------|
|
|
44
45
|
| [DETR](docs/detr.md) | End-to-end object detection with Transformers (ResNet-50/101 backbones) |
|
|
46
|
+
| [RT-DETR](docs/rt_detr.md) | Real-time DETR with ResNet-vd backbone and hybrid encoder (ResNet-18/34/50/101 variants) |
|
|
45
47
|
| [RF-DETR](docs/rf_detr.md) | Real-time detection transformer (Nano, Small, Medium, Base, Large variants) |
|
|
46
48
|
|
|
47
49
|
**Vision-Language Models**
|
|
@@ -78,6 +80,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
78
80
|
| MobileNetV3 | [Searching for MobileNetV3](https://arxiv.org/abs/1905.02244) | `keras` |
|
|
79
81
|
| MobileViT | [MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer](https://arxiv.org/abs/2110.02178) | `timm` |
|
|
80
82
|
| MobileViTV2 | [Separable Self-attention for Mobile Vision Transformers](https://arxiv.org/abs/2206.02680) | `timm` |
|
|
83
|
+
| NextViT | [Next-ViT: Next Generation Vision Transformer for Efficient Deployment in Realistic Industrial Scenarios](https://arxiv.org/abs/2207.05501) | `timm` |
|
|
81
84
|
| PiT | [Rethinking Spatial Dimensions of Vision Transformers](https://arxiv.org/abs/2103.16302) | `timm` |
|
|
82
85
|
| PoolFormer | [MetaFormer is Actually What You Need for Vision](https://arxiv.org/abs/2111.11418) | `timm` |
|
|
83
86
|
| Res2Net | [Res2Net: A New Multi-scale Backbone Architecture](https://arxiv.org/abs/1904.01169) | `timm` |
|
|
@@ -98,6 +101,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
98
101
|
| 🏷️ Model Name | 📜 Reference Paper | 📦 Source of Weights |
|
|
99
102
|
|---------------|-------------------|---------------------|
|
|
100
103
|
| DETR | [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) | `transformers`|
|
|
104
|
+
| RT-DETR | [DETRs Beat YOLOs on Real-time Object Detection](https://arxiv.org/abs/2304.08069) | `transformers` |
|
|
101
105
|
| RF-DETR | [RF-DETR: Real-Time Detection Transformer](https://arxiv.org/abs/2502.18860) | `rfdetr` |
|
|
102
106
|
|
|
103
107
|
<br>
|
|
@@ -109,6 +113,7 @@ pip install -U git+https://github.com/IMvision12/keras-models
|
|
|
109
113
|
| DeepLabV3 | [Rethinking Atrous Convolution for Semantic Image Segmentation](https://arxiv.org/abs/1706.05587) | `torchvision` |
|
|
110
114
|
| EoMT | [Encoder-only Mask Transformer for Panoptic Segmentation](https://arxiv.org/abs/2504.07957) | `transformers` |
|
|
111
115
|
| SAM | [Segment Anything](https://arxiv.org/abs/2304.02643) | `transformers` |
|
|
116
|
+
| SAM2 | [SAM 2: Segment Anything in Images and Videos](https://arxiv.org/abs/2408.00714) | `transformers` |
|
|
112
117
|
| SegFormer | [SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers](https://arxiv.org/abs/2105.15203) | `transformers`|
|
|
113
118
|
|
|
114
119
|
<br>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"""Cross-platform test runner for keras-models.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
kmodels-test <command>
|
|
5
|
+
|
|
6
|
+
Commands:
|
|
7
|
+
all Full test suite (torch, excludes slow/link tests)
|
|
8
|
+
backend-torch Backend tests on torch
|
|
9
|
+
backend-jax Backend tests on jax
|
|
10
|
+
backend-tf Backend tests on tensorflow
|
|
11
|
+
sas-torch Serialization + saving on torch
|
|
12
|
+
sas-tf Serialization + saving on tensorflow
|
|
13
|
+
sas-jax Serialization + saving on jax
|
|
14
|
+
df-torch Data format tests on torch
|
|
15
|
+
df-tf Data format tests on tensorflow (GPU auto-skip)
|
|
16
|
+
df-jax Data format tests on jax
|
|
17
|
+
gpu GPU-marked tests only
|
|
18
|
+
gpu-all Full test suite on GPU (torch + tf)
|
|
19
|
+
help Show this message
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import os
|
|
23
|
+
import subprocess
|
|
24
|
+
import sys
|
|
25
|
+
|
|
26
|
+
PYTEST = [sys.executable, "-m", "pytest"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _run(backend, *pytest_args):
|
|
30
|
+
"""Run pytest with the given backend and arguments."""
|
|
31
|
+
env = os.environ.copy()
|
|
32
|
+
if backend:
|
|
33
|
+
env["KERAS_BACKEND"] = backend
|
|
34
|
+
cmd = PYTEST + list(pytest_args)
|
|
35
|
+
print(f"\n{'=' * 60}")
|
|
36
|
+
print(f" KERAS_BACKEND={backend or '(default)'} {' '.join(pytest_args)}")
|
|
37
|
+
print(f"{'=' * 60}\n")
|
|
38
|
+
result = subprocess.run(cmd, env=env)
|
|
39
|
+
return result.returncode
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
COMMANDS = {}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def command(name):
|
|
46
|
+
def decorator(fn):
|
|
47
|
+
COMMANDS[name] = fn
|
|
48
|
+
return fn
|
|
49
|
+
|
|
50
|
+
return decorator
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@command("all")
|
|
54
|
+
def test_all():
|
|
55
|
+
return _run(
|
|
56
|
+
"torch",
|
|
57
|
+
"tests/",
|
|
58
|
+
"-v",
|
|
59
|
+
"--durations=20",
|
|
60
|
+
"-m",
|
|
61
|
+
"not slow and not gpu",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@command("backend-torch")
|
|
66
|
+
def test_backend_torch():
|
|
67
|
+
return _run("torch", "tests/integration/test_backend_compatibility.py", "-v")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@command("backend-jax")
|
|
71
|
+
def test_backend_jax():
|
|
72
|
+
return _run("jax", "tests/integration/test_backend_compatibility.py", "-v")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@command("backend-tf")
|
|
76
|
+
def test_backend_tf():
|
|
77
|
+
return _run("tensorflow", "tests/integration/test_backend_compatibility.py", "-v")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
SAS_FILES = [
|
|
81
|
+
"tests/integration/test_serialization.py",
|
|
82
|
+
"tests/integration/test_model_saving.py",
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@command("sas-torch")
|
|
87
|
+
def test_sas_torch():
|
|
88
|
+
return _run("torch", *SAS_FILES, "-v")
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@command("sas-tf")
|
|
92
|
+
def test_sas_tf():
|
|
93
|
+
return _run("tensorflow", *SAS_FILES, "-v")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@command("sas-jax")
|
|
97
|
+
def test_sas_jax():
|
|
98
|
+
return _run("jax", *SAS_FILES, "-v")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
DF_FILE = "tests/integration/test_data_formats.py"
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@command("df-torch")
|
|
105
|
+
def test_df_torch():
|
|
106
|
+
return _run("torch", DF_FILE, "-v")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@command("df-tf")
|
|
110
|
+
def test_df_tf():
|
|
111
|
+
return _run("tensorflow", DF_FILE, "-v")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@command("df-jax")
|
|
115
|
+
def test_df_jax():
|
|
116
|
+
return _run("jax", DF_FILE, "-v")
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@command("gpu")
|
|
120
|
+
def test_gpu():
|
|
121
|
+
rc1 = _run("torch", "tests/", "-v", "-m", "gpu")
|
|
122
|
+
rc2 = _run(
|
|
123
|
+
"tensorflow",
|
|
124
|
+
"tests/integration/test_data_formats.py",
|
|
125
|
+
"-v",
|
|
126
|
+
"-k",
|
|
127
|
+
"channels_first",
|
|
128
|
+
)
|
|
129
|
+
return rc1 or rc2
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@command("gpu-all")
|
|
133
|
+
def test_gpu_all():
|
|
134
|
+
rc1 = _run(
|
|
135
|
+
"torch",
|
|
136
|
+
"tests/",
|
|
137
|
+
"-v",
|
|
138
|
+
"--durations=20",
|
|
139
|
+
"-m",
|
|
140
|
+
"not slow and not link_validation",
|
|
141
|
+
)
|
|
142
|
+
rc2 = _run(
|
|
143
|
+
"tensorflow",
|
|
144
|
+
"tests/",
|
|
145
|
+
"-v",
|
|
146
|
+
"--durations=20",
|
|
147
|
+
"-m",
|
|
148
|
+
"not slow and not link_validation",
|
|
149
|
+
)
|
|
150
|
+
return rc1 or rc2
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@command("help")
|
|
154
|
+
def show_help():
|
|
155
|
+
print(__doc__)
|
|
156
|
+
return 0
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def main():
|
|
160
|
+
if len(sys.argv) < 2 or sys.argv[1] not in COMMANDS:
|
|
161
|
+
show_help()
|
|
162
|
+
if len(sys.argv) >= 2 and sys.argv[1] not in COMMANDS:
|
|
163
|
+
print(f"\nError: Unknown command '{sys.argv[1]}'")
|
|
164
|
+
return 1
|
|
165
|
+
return 0
|
|
166
|
+
|
|
167
|
+
return COMMANDS[sys.argv[1]]()
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
if __name__ == "__main__":
|
|
171
|
+
sys.exit(main())
|
|
@@ -24,6 +24,7 @@ from kmodels.models import (
|
|
|
24
24
|
mobilenetv3,
|
|
25
25
|
mobilevit,
|
|
26
26
|
mobilevitv2,
|
|
27
|
+
nextvit,
|
|
27
28
|
pit,
|
|
28
29
|
poolformer,
|
|
29
30
|
res2net,
|
|
@@ -32,7 +33,9 @@ from kmodels.models import (
|
|
|
32
33
|
resnetv2,
|
|
33
34
|
resnext,
|
|
34
35
|
rf_detr,
|
|
36
|
+
rt_detr,
|
|
35
37
|
sam,
|
|
38
|
+
sam2,
|
|
36
39
|
segformer,
|
|
37
40
|
senet,
|
|
38
41
|
siglip,
|
|
@@ -313,8 +313,12 @@ class CaiT(keras.Model):
|
|
|
313
313
|
name="stem_conv",
|
|
314
314
|
)(x)
|
|
315
315
|
|
|
316
|
-
|
|
317
|
-
|
|
316
|
+
if data_format == "channels_first":
|
|
317
|
+
grid_h = input_shape[1] // patch_size
|
|
318
|
+
grid_w = input_shape[2] // patch_size
|
|
319
|
+
else:
|
|
320
|
+
grid_h = input_shape[0] // patch_size
|
|
321
|
+
grid_w = input_shape[1] // patch_size
|
|
318
322
|
|
|
319
323
|
x = layers.Reshape((-1, embed_dim))(x)
|
|
320
324
|
|
|
@@ -351,7 +355,8 @@ class CaiT(keras.Model):
|
|
|
351
355
|
if i == depth_token_only - 1:
|
|
352
356
|
features.append(cls_token)
|
|
353
357
|
|
|
354
|
-
x = layers.
|
|
358
|
+
x = layers.Concatenate(axis=1, name="cat_cls_patch")([cls_token, x])
|
|
359
|
+
x = layers.LayerNormalization(epsilon=1e-6, name="final_layernorm")(x)
|
|
355
360
|
|
|
356
361
|
if include_top:
|
|
357
362
|
x = layers.Dense(
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Dict, List, Union
|
|
3
|
+
|
|
4
|
+
import keras
|
|
5
|
+
import timm
|
|
6
|
+
import torch
|
|
7
|
+
from tqdm import tqdm
|
|
8
|
+
|
|
9
|
+
from kmodels.models import cait
|
|
10
|
+
from kmodels.utils.custom_exception import WeightMappingError, WeightShapeMismatchError
|
|
11
|
+
from kmodels.utils.model_equivalence_tester import verify_cls_model_equivalence
|
|
12
|
+
from kmodels.utils.weight_split_torch_and_keras import split_model_weights
|
|
13
|
+
from kmodels.utils.weight_transfer_torch_to_keras import (
|
|
14
|
+
compare_keras_torch_names,
|
|
15
|
+
transfer_attention_weights,
|
|
16
|
+
transfer_weights,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
weight_name_mapping = {
|
|
20
|
+
"_": ".",
|
|
21
|
+
"stem.conv": "patch_embed.proj",
|
|
22
|
+
"cls.token.cls.token": "cls_token",
|
|
23
|
+
"pos.embed.pos.embed": "pos_embed",
|
|
24
|
+
"layernorm.": "norm",
|
|
25
|
+
"dense.1": "fc1",
|
|
26
|
+
"dense.2": "fc2",
|
|
27
|
+
"blocks.token.only": "blocks_token_only",
|
|
28
|
+
"kernel": "weight",
|
|
29
|
+
"gamma": "weight",
|
|
30
|
+
"beta": "bias",
|
|
31
|
+
"moving_mean": "running_mean",
|
|
32
|
+
"moving_variance": "running_var",
|
|
33
|
+
"final.norm": "norm.",
|
|
34
|
+
"predictions": "head",
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
attn_weight_replacement: Dict[str, str] = {
|
|
38
|
+
"proj.l": "proj_l",
|
|
39
|
+
"proj.w": "proj_w",
|
|
40
|
+
"blocks.token.only": "blocks_token_only",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
model_configs: List[Dict[str, Union[str, type]]] = [
|
|
44
|
+
{
|
|
45
|
+
"keras_cls": cait.CaiTXXS24,
|
|
46
|
+
"torch_name": "cait_xxs24_224.fb_dist_in1k",
|
|
47
|
+
"input_shape": [224, 224, 3],
|
|
48
|
+
"num_classes": 1000,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"keras_cls": cait.CaiTXXS24,
|
|
52
|
+
"torch_name": "cait_xxs24_384.fb_dist_in1k",
|
|
53
|
+
"input_shape": [384, 384, 3],
|
|
54
|
+
"num_classes": 1000,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"keras_cls": cait.CaiTXXS36,
|
|
58
|
+
"torch_name": "cait_xxs36_224.fb_dist_in1k",
|
|
59
|
+
"input_shape": [224, 224, 3],
|
|
60
|
+
"num_classes": 1000,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"keras_cls": cait.CaiTXXS36,
|
|
64
|
+
"torch_name": "cait_xxs36_384.fb_dist_in1k",
|
|
65
|
+
"input_shape": [384, 384, 3],
|
|
66
|
+
"num_classes": 1000,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"keras_cls": cait.CaiTXS24,
|
|
70
|
+
"torch_name": "cait_xs24_384.fb_dist_in1k",
|
|
71
|
+
"input_shape": [384, 384, 3],
|
|
72
|
+
"num_classes": 1000,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"keras_cls": cait.CaiTS24,
|
|
76
|
+
"torch_name": "cait_s24_224.fb_dist_in1k",
|
|
77
|
+
"input_shape": [224, 224, 3],
|
|
78
|
+
"num_classes": 1000,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"keras_cls": cait.CaiTS24,
|
|
82
|
+
"torch_name": "cait_s24_384.fb_dist_in1k",
|
|
83
|
+
"input_shape": [384, 384, 3],
|
|
84
|
+
"num_classes": 1000,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"keras_cls": cait.CaiTS36,
|
|
88
|
+
"torch_name": "cait_s36_384.fb_dist_in1k",
|
|
89
|
+
"input_shape": [384, 384, 3],
|
|
90
|
+
"num_classes": 1000,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"keras_cls": cait.CaiTM36,
|
|
94
|
+
"torch_name": "cait_m36_384.fb_dist_in1k",
|
|
95
|
+
"input_shape": [384, 384, 3],
|
|
96
|
+
"num_classes": 1000,
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"keras_cls": cait.CaiTM48,
|
|
100
|
+
"torch_name": "cait_m48_448.fb_dist_in1k",
|
|
101
|
+
"input_shape": [448, 448, 3],
|
|
102
|
+
"num_classes": 1000,
|
|
103
|
+
},
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
for model_config in model_configs:
|
|
107
|
+
torch_model_name: str = model_config["torch_name"]
|
|
108
|
+
print(f"\n{'=' * 60}")
|
|
109
|
+
print(f"Converting {torch_model_name}...")
|
|
110
|
+
print(f"{'=' * 60}")
|
|
111
|
+
|
|
112
|
+
keras_model: keras.Model = model_config["keras_cls"](
|
|
113
|
+
include_top=True,
|
|
114
|
+
input_shape=model_config["input_shape"],
|
|
115
|
+
classifier_activation="linear",
|
|
116
|
+
num_classes=model_config["num_classes"],
|
|
117
|
+
include_normalization=False,
|
|
118
|
+
weights=None,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
torch_model: torch.nn.Module = timm.create_model(
|
|
122
|
+
torch_model_name, pretrained=True
|
|
123
|
+
).eval()
|
|
124
|
+
|
|
125
|
+
trainable_torch_weights, non_trainable_torch_weights, _ = split_model_weights(
|
|
126
|
+
torch_model
|
|
127
|
+
)
|
|
128
|
+
trainable_keras_weights, non_trainable_keras_weights = split_model_weights(
|
|
129
|
+
keras_model
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
torch_weights_dict: Dict[str, torch.Tensor] = {
|
|
133
|
+
**trainable_torch_weights,
|
|
134
|
+
**non_trainable_torch_weights,
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
for keras_weight, keras_weight_name in tqdm(
|
|
138
|
+
trainable_keras_weights + non_trainable_keras_weights,
|
|
139
|
+
total=len(trainable_keras_weights + non_trainable_keras_weights),
|
|
140
|
+
desc="Transferring weights",
|
|
141
|
+
):
|
|
142
|
+
torch_weight_name: str = keras_weight_name
|
|
143
|
+
for keras_name_part, torch_name_part in weight_name_mapping.items():
|
|
144
|
+
torch_weight_name = torch_weight_name.replace(
|
|
145
|
+
keras_name_part, torch_name_part
|
|
146
|
+
)
|
|
147
|
+
torch_weight_name = re.sub(
|
|
148
|
+
r"layerscale\.(\d+)\.variable(?:\.\d+)?", r"gamma_\1", torch_weight_name
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
if "attention" in torch_weight_name:
|
|
152
|
+
transfer_attention_weights(
|
|
153
|
+
keras_weight_name,
|
|
154
|
+
keras_weight,
|
|
155
|
+
torch_weights_dict,
|
|
156
|
+
attn_weight_replacement,
|
|
157
|
+
)
|
|
158
|
+
continue
|
|
159
|
+
|
|
160
|
+
if torch_weight_name not in torch_weights_dict:
|
|
161
|
+
raise WeightMappingError(keras_weight_name, torch_weight_name)
|
|
162
|
+
|
|
163
|
+
torch_weight: torch.Tensor = torch_weights_dict[torch_weight_name]
|
|
164
|
+
|
|
165
|
+
if torch_weight_name == "cls_token":
|
|
166
|
+
keras_weight.assign(torch_weight)
|
|
167
|
+
continue
|
|
168
|
+
|
|
169
|
+
if torch_weight_name == "pos_embed":
|
|
170
|
+
keras_weight.assign(torch_weight)
|
|
171
|
+
continue
|
|
172
|
+
|
|
173
|
+
if not compare_keras_torch_names(
|
|
174
|
+
keras_weight_name, keras_weight, torch_weight_name, torch_weight
|
|
175
|
+
):
|
|
176
|
+
raise WeightShapeMismatchError(
|
|
177
|
+
keras_weight_name,
|
|
178
|
+
keras_weight.shape,
|
|
179
|
+
torch_weight_name,
|
|
180
|
+
torch_weight.shape,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
transfer_weights(keras_weight_name, keras_weight, torch_weight)
|
|
184
|
+
|
|
185
|
+
results = verify_cls_model_equivalence(
|
|
186
|
+
model_a=torch_model,
|
|
187
|
+
model_b=keras_model,
|
|
188
|
+
input_shape=tuple(model_config["input_shape"]),
|
|
189
|
+
output_specs={"num_classes": model_config["num_classes"]},
|
|
190
|
+
run_performance=False,
|
|
191
|
+
atol=1e-4,
|
|
192
|
+
rtol=1e-4,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
if not results["standard_input"]:
|
|
196
|
+
raise ValueError(
|
|
197
|
+
"Model equivalence test failed - model outputs do not match for standard input"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
model_filename: str = f"{torch_model_name.replace('.', '_')}.weights.h5"
|
|
201
|
+
keras_model.save_weights(model_filename)
|
|
202
|
+
print(f"Model saved successfully as {model_filename}")
|
|
203
|
+
|
|
204
|
+
del keras_model, torch_model
|
|
205
|
+
torch.cuda.empty_cache() if torch.cuda.is_available() else None
|