From c39de0cdc9638e2200435e52e9dd84469835081a Mon Sep 17 00:00:00 2001 From: Pavel Iakubovskii Date: Sat, 7 Jan 2023 11:15:21 +0100 Subject: [PATCH] Release update 0.3.2 (#705) * Update timm encoders list * Update flake8 config * Update author name * Bump version --- .flake8 | 2 +- HALLOFFAME.md | 6 +- LICENSE | 2 +- README.md | 8 +- docs/conf.py | 4 +- docs/encoders_timm.rst | 233 ++++++++++++++++++--- misc/generate_table_timm.py | 2 + segmentation_models_pytorch/__version__.py | 2 +- 8 files changed, 213 insertions(+), 46 deletions(-) diff --git a/.flake8 b/.flake8 index db716399..0ed4813c 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ [flake8] max-line-length = 119 -exclude =.git,__pycache__,docs/conf.py,build,dist,setup.py,tests +exclude =.git,__pycache__,docs/conf.py,build,dist,setup.py,tests,.venv ignore = I101,I201,F401,F403,S001,D100,D101,D102,D103,D104,D105,D106,D107,D200,D205,D400,W504,D202,E203,W503,B006,D412 inline-quotes = " diff --git a/HALLOFFAME.md b/HALLOFFAME.md index 9181dae8..95821b33 100644 --- a/HALLOFFAME.md +++ b/HALLOFFAME.md @@ -32,7 +32,7 @@ Please, follow these rules, when adding a solution to the "Hall of Fame": [[description](https://www.kaggle.com/c/severstal-steel-defect-detection/discussion/114465#latest-659615)] - 12th place. -[Pavel Yakubovskiy](https://www.linkedin.com/in/pavel-yakubovskiy/), +[Pavel Iakubovskii](https://www.linkedin.com/in/pavel-iakubovskii/), [Ilya Dobrynin](https://www.linkedin.com/in/ilya-dobrynin-79a89b106/), [Denis Kolpakov](https://www.linkedin.com/in/denis-kolpakov-ab3137197/) [[description](https://www.kaggle.com/c/severstal-steel-defect-detection/discussion/114309#latest-661404)] @@ -72,7 +72,7 @@ Please, follow these rules, when adding a solution to the "Hall of Fame": [[code](https://github.com/khornlund/understanding-cloud-organization)] - 55th place. -[Pavel Yakubovskiy](https://www.linkedin.com/in/pavel-yakubovskiy/) +[Pavel Iakubovskii](https://www.linkedin.com/in/pavel-iakubovskii/) [[description](https://www.kaggle.com/c/understanding_cloud_organization/discussion/118019#latest-678626)] ## Other platforms @@ -85,7 +85,7 @@ Please, follow these rules, when adding a solution to the "Hall of Fame": ### [Open Cities AI Challenge: Segmenting Buildings for Disaster Resilience](https://www.drivendata.org/competitions/60/building-segmentation-disaster-resilience/) - 1st place. -[Pavel Yakubovskiy](https://www.linkedin.com/in/pavel-yakubovskiy/). +[Pavel Iakubovskii](https://www.linkedin.com/in/pavel-iakubovskii/). [[code and description](https://github.com/qubvel/open-cities-challenge)] ### [Machine Learning based feature extraction of Electrical Substations from Satellite Data ](https://competitions.codalab.org/competitions/32132#learn_the_details) diff --git a/LICENSE b/LICENSE index fca801c3..0f186bfe 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2019, Pavel Yakubovskiy +Copyright (c) 2019, Pavel Iakubovskii Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index b748f0f0..d07f6750 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ The main features of this library are: - High level API (just two lines to create a neural network) - 9 models architectures for binary and multi class segmentation (including legendary Unet) - - 119 available encoders (and 400+ encoders from [timm](https://github.com/rwightman/pytorch-image-models)) + - 124 available encoders (and 500+ encoders from [timm](https://github.com/rwightman/pytorch-image-models)) - All encoders have pre-trained weights for faster and better convergence - Popular metrics and losses for training routines @@ -403,10 +403,10 @@ Note: In the official github repo the s0 variant has additional num_conv_branche Pytorch Image Models (a.k.a. timm) has a lot of pretrained models and interface which allows using these models as encoders in smp, however, not all models are supported - - transformer models do not have ``features_only`` functionality implemented - - some models do not have appropriate strides + - not all transformer models have ``features_only`` functionality implemented that is required for encoder + - some models have inappropriate strides -Total number of supported encoders: 467 +Total number of supported encoders: 549 - [table with available encoders](https://smp.readthedocs.io/en/latest/encoders_timm.html) ### 🔁 Models API diff --git a/docs/conf.py b/docs/conf.py index b781dedc..588c0f21 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,8 +23,8 @@ # -- Project information ----------------------------------------------------- project = 'Segmentation Models' -copyright = '{}, Pavel Yakubovskiy'.format(datetime.datetime.now().year) -author = 'Pavel Yakubovskiy' +copyright = '{}, Pavel Iakubovskii'.format(datetime.datetime.now().year) +author = 'Pavel Iakubovskii' def get_version(): sys.path.append('../segmentation_models_pytorch') diff --git a/docs/encoders_timm.rst b/docs/encoders_timm.rst index a2737751..35595565 100644 --- a/docs/encoders_timm.rst +++ b/docs/encoders_timm.rst @@ -4,12 +4,12 @@ Pytorch Image Models (a.k.a. timm) has a lot of pretrained models and interface which allows using these models as encoders in smp, however, not all models are supported - - transformer models do not have ``features_only`` functionality implemented - - some models do not have appropriate strides + - not all transformer models have ``features_only`` functionality implemented that is required for encoder + - some models have inappropriate strides Below is a table of suitable encoders (for DeepLabV3, DeepLabV3+, and PAN dilation support is needed also) -Total number of encoders: 467 +Total number of encoders: 549 .. note:: @@ -27,6 +27,32 @@ Total number of encoders: 467 +----------------------------------+------------------+ | botnet50ts_256 | ✅ | +----------------------------------+------------------+ +| cs3darknet_focus_l | ✅ | ++----------------------------------+------------------+ +| cs3darknet_focus_m | ✅ | ++----------------------------------+------------------+ +| cs3darknet_focus_s | ✅ | ++----------------------------------+------------------+ +| cs3darknet_focus_x | ✅ | ++----------------------------------+------------------+ +| cs3darknet_l | ✅ | ++----------------------------------+------------------+ +| cs3darknet_m | ✅ | ++----------------------------------+------------------+ +| cs3darknet_s | ✅ | ++----------------------------------+------------------+ +| cs3darknet_x | ✅ | ++----------------------------------+------------------+ +| cs3edgenet_x | ✅ | ++----------------------------------+------------------+ +| cs3se_edgenet_x | ✅ | ++----------------------------------+------------------+ +| cs3sedarknet_l | ✅ | ++----------------------------------+------------------+ +| cs3sedarknet_x | ✅ | ++----------------------------------+------------------+ +| cs3sedarknet_xdw | ✅ | ++----------------------------------+------------------+ | cspresnet50 | ✅ | +----------------------------------+------------------+ | cspresnet50d | ✅ | @@ -103,12 +129,8 @@ Total number of encoders: 467 +----------------------------------+------------------+ | eca_botnext26ts_256 | ✅ | +----------------------------------+------------------+ -| eca_efficientnet_b0 | ✅ | -+----------------------------------+------------------+ | eca_halonext26ts | ✅ | +----------------------------------+------------------+ -| eca_lambda_resnext26ts | ✅ | -+----------------------------------+------------------+ | eca_nfnet_l0 | ✅ | +----------------------------------+------------------+ | eca_nfnet_l1 | ✅ | @@ -117,7 +139,9 @@ Total number of encoders: 467 +----------------------------------+------------------+ | eca_nfnet_l3 | ✅ | +----------------------------------+------------------+ -| eca_swinnext26ts_256 | ✅ | +| eca_resnet33ts | ✅ | ++----------------------------------+------------------+ +| eca_resnext26ts | ✅ | +----------------------------------+------------------+ | eca_vovnet39b | | +----------------------------------+------------------+ @@ -145,6 +169,12 @@ Total number of encoders: 467 +----------------------------------+------------------+ | efficientnet_b0 | ✅ | +----------------------------------+------------------+ +| efficientnet_b0_g16_evos | ✅ | ++----------------------------------+------------------+ +| efficientnet_b0_g8_gn | ✅ | ++----------------------------------+------------------+ +| efficientnet_b0_gn | ✅ | ++----------------------------------+------------------+ | efficientnet_b1 | ✅ | +----------------------------------+------------------+ | efficientnet_b1_pruned | ✅ | @@ -157,6 +187,10 @@ Total number of encoders: 467 +----------------------------------+------------------+ | efficientnet_b3 | ✅ | +----------------------------------+------------------+ +| efficientnet_b3_g8_gn | ✅ | ++----------------------------------+------------------+ +| efficientnet_b3_gn | ✅ | ++----------------------------------+------------------+ | efficientnet_b3_pruned | ✅ | +----------------------------------+------------------+ | efficientnet_b3a | ✅ | @@ -207,8 +241,12 @@ Total number of encoders: 467 +----------------------------------+------------------+ | efficientnetv2_rw_s | ✅ | +----------------------------------+------------------+ +| efficientnetv2_rw_t | ✅ | ++----------------------------------+------------------+ | efficientnetv2_s | ✅ | +----------------------------------+------------------+ +| efficientnetv2_xl | ✅ | ++----------------------------------+------------------+ | ens_adv_inception_resnet_v2 | | +----------------------------------+------------------+ | ese_vovnet19b_dw | | @@ -235,13 +273,15 @@ Total number of encoders: 467 +----------------------------------+------------------+ | fbnetv3_g | ✅ | +----------------------------------+------------------+ -| gc_efficientnet_b0 | ✅ | +| gc_efficientnetv2_rw_t | ✅ | ++----------------------------------+------------------+ +| gcresnet33ts | ✅ | +----------------------------------+------------------+ | gcresnet50t | ✅ | +----------------------------------+------------------+ | gcresnext26ts | ✅ | +----------------------------------+------------------+ -| geresnet50t | ✅ | +| gcresnext50ts | ✅ | +----------------------------------+------------------+ | gernet_l | ✅ | +----------------------------------+------------------+ @@ -301,13 +341,15 @@ Total number of encoders: 467 +----------------------------------+------------------+ | gluon_xception65 | ✅ | +----------------------------------+------------------+ +| halo2botnet50ts_256 | ✅ | ++----------------------------------+------------------+ | halonet26t | ✅ | +----------------------------------+------------------+ | halonet50ts | ✅ | +----------------------------------+------------------+ | halonet_h1 | ✅ | +----------------------------------+------------------+ -| halonet_h1_c4c5 | ✅ | +| haloregnetz_b | ✅ | +----------------------------------+------------------+ | hardcorenas_a | ✅ | +----------------------------------+------------------+ @@ -353,9 +395,23 @@ Total number of encoders: 467 +----------------------------------+------------------+ | inception_v4 | | +----------------------------------+------------------+ +| lambda_resnet26rpt_256 | ✅ | ++----------------------------------+------------------+ | lambda_resnet26t | ✅ | +----------------------------------+------------------+ -| lambda_resnet50t | ✅ | +| lambda_resnet50ts | ✅ | ++----------------------------------+------------------+ +| lamhalobotnet50ts_256 | ✅ | ++----------------------------------+------------------+ +| lcnet_035 | ✅ | ++----------------------------------+------------------+ +| lcnet_050 | ✅ | ++----------------------------------+------------------+ +| lcnet_075 | ✅ | ++----------------------------------+------------------+ +| lcnet_100 | ✅ | ++----------------------------------+------------------+ +| lcnet_150 | ✅ | +----------------------------------+------------------+ | legacy_senet154 | | +----------------------------------+------------------+ @@ -399,6 +455,12 @@ Total number of encoders: 467 +----------------------------------+------------------+ | mnasnet_small | ✅ | +----------------------------------+------------------+ +| mobilenetv2_035 | ✅ | ++----------------------------------+------------------+ +| mobilenetv2_050 | ✅ | ++----------------------------------+------------------+ +| mobilenetv2_075 | ✅ | ++----------------------------------+------------------+ | mobilenetv2_100 | ✅ | +----------------------------------+------------------+ | mobilenetv2_110d | ✅ | @@ -417,10 +479,44 @@ Total number of encoders: 467 +----------------------------------+------------------+ | mobilenetv3_rw | ✅ | +----------------------------------+------------------+ +| mobilenetv3_small_050 | ✅ | ++----------------------------------+------------------+ | mobilenetv3_small_075 | ✅ | +----------------------------------+------------------+ | mobilenetv3_small_100 | ✅ | +----------------------------------+------------------+ +| mobilevit_s | ✅ | ++----------------------------------+------------------+ +| mobilevit_xs | ✅ | ++----------------------------------+------------------+ +| mobilevit_xxs | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_050 | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_075 | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_100 | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_125 | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_150 | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_150_384_in22ft1k | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_150_in22ft1k | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_175 | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_175_384_in22ft1k | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_175_in22ft1k | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_200 | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_200_384_in22ft1k | ✅ | ++----------------------------------+------------------+ +| mobilevitv2_200_in22ft1k | ✅ | ++----------------------------------+------------------+ | nasnetalarge | | +----------------------------------+------------------+ | nf_ecaresnet101 | ✅ | @@ -455,43 +551,27 @@ Total number of encoders: 467 +----------------------------------+------------------+ | nfnet_f0 | ✅ | +----------------------------------+------------------+ -| nfnet_f0s | ✅ | -+----------------------------------+------------------+ | nfnet_f1 | ✅ | +----------------------------------+------------------+ -| nfnet_f1s | ✅ | -+----------------------------------+------------------+ | nfnet_f2 | ✅ | +----------------------------------+------------------+ -| nfnet_f2s | ✅ | -+----------------------------------+------------------+ | nfnet_f3 | ✅ | +----------------------------------+------------------+ -| nfnet_f3s | ✅ | -+----------------------------------+------------------+ | nfnet_f4 | ✅ | +----------------------------------+------------------+ -| nfnet_f4s | ✅ | -+----------------------------------+------------------+ | nfnet_f5 | ✅ | +----------------------------------+------------------+ -| nfnet_f5s | ✅ | -+----------------------------------+------------------+ | nfnet_f6 | ✅ | +----------------------------------+------------------+ -| nfnet_f6s | ✅ | -+----------------------------------+------------------+ | nfnet_f7 | ✅ | +----------------------------------+------------------+ -| nfnet_f7s | ✅ | -+----------------------------------+------------------+ | nfnet_l0 | ✅ | +----------------------------------+------------------+ | pnasnet5large | | +----------------------------------+------------------+ -| rednet26t | ✅ | +| regnetv_040 | ✅ | +----------------------------------+------------------+ -| rednet50ts | ✅ | +| regnetv_064 | ✅ | +----------------------------------+------------------+ | regnetx_002 | ✅ | +----------------------------------+------------------+ @@ -531,6 +611,8 @@ Total number of encoders: 467 +----------------------------------+------------------+ | regnety_040 | ✅ | +----------------------------------+------------------+ +| regnety_040s_gn | ✅ | ++----------------------------------+------------------+ | regnety_064 | ✅ | +----------------------------------+------------------+ | regnety_080 | ✅ | @@ -541,6 +623,28 @@ Total number of encoders: 467 +----------------------------------+------------------+ | regnety_320 | ✅ | +----------------------------------+------------------+ +| regnetz_005 | ✅ | ++----------------------------------+------------------+ +| regnetz_040 | ✅ | ++----------------------------------+------------------+ +| regnetz_040h | ✅ | ++----------------------------------+------------------+ +| regnetz_b16 | ✅ | ++----------------------------------+------------------+ +| regnetz_b16_evos | ✅ | ++----------------------------------+------------------+ +| regnetz_c16 | ✅ | ++----------------------------------+------------------+ +| regnetz_c16_evos | ✅ | ++----------------------------------+------------------+ +| regnetz_d32 | ✅ | ++----------------------------------+------------------+ +| regnetz_d8 | ✅ | ++----------------------------------+------------------+ +| regnetz_d8_evos | ✅ | ++----------------------------------+------------------+ +| regnetz_e8 | ✅ | ++----------------------------------+------------------+ | repvgg_a2 | ✅ | +----------------------------------+------------------+ | repvgg_b0 | ✅ | @@ -591,6 +695,10 @@ Total number of encoders: 467 +----------------------------------+------------------+ | resnet101d | ✅ | +----------------------------------+------------------+ +| resnet10t | ✅ | ++----------------------------------+------------------+ +| resnet14t | ✅ | ++----------------------------------+------------------+ | resnet152 | ✅ | +----------------------------------+------------------+ | resnet152d | ✅ | @@ -609,12 +717,18 @@ Total number of encoders: 467 +----------------------------------+------------------+ | resnet26t | ✅ | +----------------------------------+------------------+ +| resnet32ts | ✅ | ++----------------------------------+------------------+ +| resnet33ts | ✅ | ++----------------------------------+------------------+ | resnet34 | ✅ | +----------------------------------+------------------+ | resnet34d | ✅ | +----------------------------------+------------------+ | resnet50 | ✅ | +----------------------------------+------------------+ +| resnet50_gn | ✅ | ++----------------------------------+------------------+ | resnet50d | ✅ | +----------------------------------+------------------+ | resnet50t | ✅ | @@ -623,10 +737,20 @@ Total number of encoders: 467 +----------------------------------+------------------+ | resnet61q | ✅ | +----------------------------------+------------------+ +| resnetaa101d | ✅ | ++----------------------------------+------------------+ +| resnetaa50 | ✅ | ++----------------------------------+------------------+ +| resnetaa50d | ✅ | ++----------------------------------+------------------+ +| resnetblur101d | ✅ | ++----------------------------------+------------------+ | resnetblur18 | ✅ | +----------------------------------+------------------+ | resnetblur50 | ✅ | +----------------------------------+------------------+ +| resnetblur50d | ✅ | ++----------------------------------+------------------+ | resnetrs101 | ✅ | +----------------------------------+------------------+ | resnetrs152 | ✅ | @@ -673,6 +797,14 @@ Total number of encoders: 467 +----------------------------------+------------------+ | resnetv2_50d | ✅ | +----------------------------------+------------------+ +| resnetv2_50d_evob | ✅ | ++----------------------------------+------------------+ +| resnetv2_50d_evos | ✅ | ++----------------------------------+------------------+ +| resnetv2_50d_frn | ✅ | ++----------------------------------+------------------+ +| resnetv2_50d_gn | ✅ | ++----------------------------------+------------------+ | resnetv2_50t | ✅ | +----------------------------------+------------------+ | resnetv2_50x1_bit_distilled | ✅ | @@ -691,6 +823,8 @@ Total number of encoders: 467 +----------------------------------+------------------+ | resnext101_64x4d | ✅ | +----------------------------------+------------------+ +| resnext26ts | ✅ | ++----------------------------------+------------------+ | resnext50_32x4d | ✅ | +----------------------------------+------------------+ | resnext50d_32x4d | ✅ | @@ -711,6 +845,10 @@ Total number of encoders: 467 +----------------------------------+------------------+ | rexnetr_200 | | +----------------------------------+------------------+ +| sebotnet33ts_256 | ✅ | ++----------------------------------+------------------+ +| sehalonet33ts | ✅ | ++----------------------------------+------------------+ | selecsls42 | | +----------------------------------+------------------+ | selecsls42b | | @@ -729,6 +867,8 @@ Total number of encoders: 467 +----------------------------------+------------------+ | semnasnet_140 | ✅ | +----------------------------------+------------------+ +| semobilevit_s | ✅ | ++----------------------------------+------------------+ | senet154 | ✅ | +----------------------------------+------------------+ | seresnet101 | ✅ | @@ -743,24 +883,34 @@ Total number of encoders: 467 +----------------------------------+------------------+ | seresnet269d | ✅ | +----------------------------------+------------------+ +| seresnet33ts | ✅ | ++----------------------------------+------------------+ | seresnet34 | ✅ | +----------------------------------+------------------+ | seresnet50 | ✅ | +----------------------------------+------------------+ | seresnet50t | ✅ | +----------------------------------+------------------+ +| seresnetaa50d | ✅ | ++----------------------------------+------------------+ | seresnext101_32x4d | ✅ | +----------------------------------+------------------+ | seresnext101_32x8d | ✅ | +----------------------------------+------------------+ +| seresnext101d_32x8d | ✅ | ++----------------------------------+------------------+ | seresnext26d_32x4d | ✅ | +----------------------------------+------------------+ | seresnext26t_32x4d | ✅ | +----------------------------------+------------------+ | seresnext26tn_32x4d | ✅ | +----------------------------------+------------------+ +| seresnext26ts | ✅ | ++----------------------------------+------------------+ | seresnext50_32x4d | ✅ | +----------------------------------+------------------+ +| seresnextaa101d_32x8d | ✅ | ++----------------------------------+------------------+ | skresnet18 | ✅ | +----------------------------------+------------------+ | skresnet34 | ✅ | @@ -785,10 +935,6 @@ Total number of encoders: 467 +----------------------------------+------------------+ | ssl_resnext50_32x4d | ✅ | +----------------------------------+------------------+ -| swinnet26t_256 | ✅ | -+----------------------------------+------------------+ -| swinnet50ts_256 | ✅ | -+----------------------------------+------------------+ | swsl_resnet18 | ✅ | +----------------------------------+------------------+ | swsl_resnet50 | ✅ | @@ -905,6 +1051,10 @@ Total number of encoders: 467 +----------------------------------+------------------+ | tf_efficientnetv2_s_in21k | ✅ | +----------------------------------+------------------+ +| tf_efficientnetv2_xl_in21ft1k | ✅ | ++----------------------------------+------------------+ +| tf_efficientnetv2_xl_in21k | ✅ | ++----------------------------------+------------------+ | tf_inception_v3 | | +----------------------------------+------------------+ | tf_mixnet_l | ✅ | @@ -925,6 +1075,16 @@ Total number of encoders: 467 +----------------------------------+------------------+ | tf_mobilenetv3_small_minimal_100 | ✅ | +----------------------------------+------------------+ +| tinynet_a | ✅ | ++----------------------------------+------------------+ +| tinynet_b | ✅ | ++----------------------------------+------------------+ +| tinynet_c | ✅ | ++----------------------------------+------------------+ +| tinynet_d | ✅ | ++----------------------------------+------------------+ +| tinynet_e | ✅ | ++----------------------------------+------------------+ | tv_densenet121 | | +----------------------------------+------------------+ | tv_resnet101 | ✅ | @@ -949,7 +1109,12 @@ Total number of encoders: 467 +----------------------------------+------------------+ | xception41 | ✅ | +----------------------------------+------------------+ +| xception41p | ✅ | ++----------------------------------+------------------+ | xception65 | ✅ | +----------------------------------+------------------+ +| xception65p | ✅ | ++----------------------------------+------------------+ | xception71 | ✅ | +----------------------------------+------------------+ + diff --git a/misc/generate_table_timm.py b/misc/generate_table_timm.py index a13ae645..0da0127e 100644 --- a/misc/generate_table_timm.py +++ b/misc/generate_table_timm.py @@ -51,4 +51,6 @@ def make_table(data): table = make_table(supported_models) print(table) + with open("timm_encoders.txt", "w") as f: + print(table, file=f) print(f"Total encoders: {len(supported_models.keys())}") diff --git a/segmentation_models_pytorch/__version__.py b/segmentation_models_pytorch/__version__.py index 58114fa8..e9768f57 100644 --- a/segmentation_models_pytorch/__version__.py +++ b/segmentation_models_pytorch/__version__.py @@ -1,3 +1,3 @@ -VERSION = (0, 3, 1) +VERSION = (0, 3, 2) __version__ = ".".join(map(str, VERSION))