The goal of this repo is:
News:
- 27/10/2018: Fix compatibility issues, Add tests, Add travis
- 04/06/2018: PolyNet and PNASNet-5-Large thanks to Alex Parinov
- 16/04/2018: SE-ResNet and SE-ResNeXt thanks to Alex Parinov
- 09/04/2018: SENet154 thanks to Alex Parinov
- 22/03/2018: CaffeResNet101 (good for localization with FasterRCNN)
- 21/03/2018: NASNet Mobile thanks to Veronika Yurchuk and Anastasiia
- 25/01/2018: DualPathNetworks thanks to Ross Wightman, Xception thanks to T Standley, improved TransformImage API
- 13/01/2018: pip install pretrainedmodels, pretrainedmodels.model_names, pretrainedmodels.pretrained_settings
- 12/01/2018: python setup.py install
- 08/12/2017: update data url (/!\ git pull is needed)
- 30/11/2017: improve API (model.features(input), model.logits(features), model.forward(input), model.last_linear)
- 16/11/2017: nasnet-a-large pretrained model ported by T. Durand and R. Cadene
- 22/07/2017: torchvision pretrained models
- 22/07/2017: momentum in inceptionv4 and inceptionresnetv2 to 0.1
- 17/07/2017: model.input_range attribut
- 17/07/2017: BNInception pretrained on Imagenet
pip install pretrainedmodelsgit clone https://github.com/Cadene/pretrained-models.pytorch.gitcd pretrained-models.pytorchpython setup.py installpretrainedmodels:import pretrainedmodels
print(pretrainedmodels.model_names)
> ['fbresnet152', 'bninception', 'resnext101_32x4d', 'resnext101_64x4d', 'inceptionv4', 'inceptionresnetv2', 'alexnet', 'densenet121', 'densenet169', 'densenet201', 'densenet161', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152', 'inceptionv3', 'squeezenet1_0', 'squeezenet1_1', 'vgg11', 'vgg11_bn', 'vgg13', 'vgg13_bn', 'vgg16', 'vgg16_bn', 'vgg19_bn', 'vgg19', 'nasnetalarge', 'nasnetamobile', 'cafferesnet101', 'senet154', 'se_resnet50', 'se_resnet101', 'se_resnet152', 'se_resnext50_32x4d', 'se_resnext101_32x4d', 'cafferesnet101', 'polynet', 'pnasnet5large']
print(pretrainedmodels.pretrained_settings['nasnetalarge'])
> {'imagenet': {'url': 'http://data.lip6.fr/cadene/pretrainedmodels/nasnetalarge-a1897284.pth', 'input_space': 'RGB', 'input_size': [3, 331, 331], 'input_range': [0, 1], 'mean': [0.5, 0.5, 0.5], 'std': [0.5, 0.5, 0.5], 'num_classes': 1000}, 'imagenet+background': {'url': 'http://data.lip6.fr/cadene/pretrainedmodels/nasnetalarge-a1897284.pth', 'input_space': 'RGB', 'input_size': [3, 331, 331], 'input_range': [0, 1], 'mean': [0.5, 0.5, 0.5], 'std': [0.5, 0.5, 0.5], 'num_classes': 1001}}
model_name = 'nasnetalarge' # could be fbresnet152 or inceptionresnetv2
model = pretrainedmodels.__dict__[model_name](num_classes=1000, pretrained='imagenet')
model.eval()
Note: By default, models will be downloaded to your $HOME/.torch folder. You can modify this behavior using the $TORCH_HOME variable as follow: export TORCH_HOME="/local/pretrainedmodels"
import torch
import pretrainedmodels.utils as utils
load_img = utils.LoadImage()
# transformations depending on the model
# rescale, center crop, normalize, and others (ex: ToBGR, ToRange255)
tf_img = utils.TransformImage(model)
path_img = 'data/cat.jpg'
input_img = load_img(path_img)
input_tensor = tf_img(input_img) # 3x400x225 -> 3x299x299 size may differ
input_tensor = input_tensor.unsqueeze(0) # 3x299x299 -> 1x3x299x299
input = torch.autograd.Variable(input_tensor,
requires_grad=False)
output_logits = model(input) # 1x1000
output_features = model.features(input) # 1x14x14x2048 size may differ
output_logits = model.logits(output_features) # 1x1000
$ python examples/imagenet_logits.py -h
> nasnetalarge, resnet152, inceptionresnetv2, inceptionv4, ...
$ python examples/imagenet_logits.py -a nasnetalarge --path_img data/cat.jpg
> 'nasnetalarge': data/cat.jpg' is a 'tiger cat'
$ python examples/imagenet_eval.py /local/common-data/imagenet_2012/images -a nasnetalarge -b 20 -e
> * Acc@1 82.693, Acc@5 96.13
Results were obtained using (center cropped) images of the same size than during the training process.
| Model | Version | Acc@1 | Acc@5 |
|---|---|---|---|
| PNASNet-5-Large | Tensorflow | 82.858 | 96.182 |
| PNASNet-5-Large | Our porting | 82.736 | 95.992 |
| NASNet-A-Large | Tensorflow | 82.693 | 96.163 |
| NASNet-A-Large | Our porting | 82.566 | 96.086 |
| SENet154 | Caffe | 81.32 | 95.53 |
| SENet154 | Our porting | 81.304 | 95.498 |
| PolyNet | Caffe | 81.29 | 95.75 |
| PolyNet | Our porting | 81.002 | 95.624 |
| InceptionResNetV2 | Tensorflow | 80.4 | 95.3 |
| InceptionV4 | Tensorflow | 80.2 | 95.3 |
| SE-ResNeXt101_32x4d | Our porting | 80.236 | 95.028 |
| SE-ResNeXt101_32x4d | Caffe | 80.19 | 95.04 |
| InceptionResNetV2 | Our porting | 80.170 | 95.234 |
| InceptionV4 | Our porting | 80.062 | 94.926 |
| DualPathNet107_5k | Our porting | 79.746 | 94.684 |
| ResNeXt101_64x4d | Torch7 | 79.6 | 94.7 |
| DualPathNet131 | Our porting | 79.432 | 94.574 |
$ claude mcp add pretrained-models.pytorch \
-- python -m otcore.mcp_server <graph>