Le but de ce dépôt est:
Nouvelles:
pip install pretrainedmodels pretrainedmodels.pretrained_settings pretrainedmodels.model_namespython setup.py installgit pull est nécessaire)model.features(input) , model.logits(features) , model.forward(input) , model.last_linear )pip install pretrainedmodelsgit clone https://github.com/Cadene/pretrained-models.pytorch.gitcd pretrained-models.pytorchpython setup.py install pretrainedmodels : 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 () Remarque : Par défaut, les modèles seront téléchargés dans votre dossier $HOME/.torch . Vous pouvez modifier ce comportement en utilisant la variable $TORCH_HOME comme suit: 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
Les résultats ont été obtenus en utilisant des images (centres recadrées) de la même taille que pendant le processus de formation.
| Modèle | Version | Acc @ 1 | Acc @ 5 |
|---|---|---|---|
| PNASNET-5-GARD | Tensorflow | 82.858 | 96.182 |
| PNASNET-5-GARD | Notre portage | 82.736 | 95.992 |
| Nasnet-a-grand | Tensorflow | 82.693 | 96.163 |
| Nasnet-a-grand | Notre portage | 82.566 | 96.086 |
| Senet154 | Caffe | 81.32 | 95,53 |
| Senet154 | Notre portage | 81.304 | 95.498 |
| Polynet | Caffe | 81.29 | 95,75 |
| Polynet | Notre portage | 81.002 | 95.624 |
| INCECK RESRESNETV2 | Tensorflow | 80.4 | 95.3 |
| Inceptionv4 | Tensorflow | 80.2 | 95.3 |
| SE-RESNEXT101_32X4D | Notre portage | 80.236 | 95.028 |
| SE-RESNEXT101_32X4D | Caffe | 80.19 | 95.04 |
| INCECK RESRESNETV2 | Notre portage | 80.170 | 95.234 |
| Inceptionv4 | Notre portage | 80.062 | 94.926 |
| Dualpathnet107_5k | Notre portage | 79.746 | 94.684 |
| Resnext101_64x4d | Torch7 | 79.6 | 94.7 |
| Dualpathnet131 | Notre portage | 79.432 | 94.574 |
| Dualpathnet92_5k | Notre portage | 79.400 | 94.620 |
| Dualpathnet98 | Notre portage | 79.224 | 94.488 |
| SE-RESNEXT50_32X4D | Notre portage | 79.076 | 94.434 |
| SE-RESNEXT50_32X4D | Caffe | 79.03 | 94.46 |
| Xception | Kéras | 79.000 | 94.500 |
| Resnext101_64x4d | Notre portage | 78,956 | 94.252 |
| Xception | Notre portage | 78.888 | 94.292 |
| Resnext101_32x4d | Torch7 | 78.8 | 94.4 |
| SE-RESNET152 | Caffe | 78,66 | 94.46 |
| SE-RESNET152 | Notre portage | 78,658 | 94.374 |
| Resnet152 | Pytorch | 78.428 | 94.110 |
| SE-RESNET101 | Notre portage | 78.396 | 94.258 |
| SE-RESNET101 | Caffe | 78.25 | 94.28 |
| Resnext101_32x4d | Notre portage | 78.188 | 93.886 |
| FBRESNET152 | Torch7 | 77.84 | 93.84 |
| SE-RESNET50 | Caffe | 77,63 | 93.64 |
| SE-RESNET50 | Notre portage | 77.636 | 93.752 |
| Densenet161 | Pytorch | 77.560 | 93.798 |
| Resnet101 | Pytorch | 77.438 | 93.672 |
| FBRESNET152 | Notre portage | 77.386 | 93.594 |
| Inceptionv3 | Pytorch | 77.294 | 93.454 |
| Densenet201 | Pytorch | 77.152 | 93.548 |
| Dualpathnet68b_5k | Notre portage | 77.034 | 93.590 |
| Cafferesnet101 | Caffe | 76.400 | 92.900 |
| Cafferesnet101 | Notre portage | 76.200 | 92.766 |
| Densenet169 | Pytorch | 76.026 | 92.992 |
| Resnet50 | Pytorch | 76.002 | 92.980 |
| Dualpathnet68 | Notre portage | 75.868 | 92.774 |
| Densenet121 | Pytorch | 74.646 | 92.136 |
| VGG19_BN | Pytorch | 74.266 | 92.066 |
| Nasnet-a-mobile | Tensorflow | 74.0 | 91.6 |
| Nasnet-a-mobile | Notre portage | 74.080 | 91.740 |
| Resnet34 | Pytorch | 73.554 | 91.456 |
| Bninception | Notre portage | 73.524 | 91.562 |
| VGG16_BN | Pytorch | 73.518 | 91.608 |
| VGG19 | Pytorch | 72.080 | 90.822 |
| VGG16 | Pytorch | 71.636 | 90.354 |
| VGG13_BN | Pytorch | 71.508 | 90.494 |
| VGG11_BN | Pytorch | 70.452 | 89.818 |
| Resnet18 | Pytorch | 70.142 | 89.274 |
| VGG13 | Pytorch | 69.662 | 89.264 |
| VGG11 | Pytorch | 68.970 | 88.746 |
| Squeezenet1_1 | Pytorch | 58.250 | 80.800 |
| Squeezenet1_0 | Pytorch | 58.108 | 80.428 |
| Alexnet | Pytorch | 56.432 | 79.194 |
Notes:
Méfiez-vous, la précision rapportée ici n'est pas toujours représentative de la capacité transférable du réseau sur d'autres tâches et ensembles de données. Vous devez tous les essayer! : P
Veuillez consulter les mesures de validation de calcul de calcul
Source: Tensorflow Slim Repo
nasnetalarge(num_classes=1000, pretrained='imagenet')nasnetalarge(num_classes=1001, pretrained='imagenet+background')nasnetamobile(num_classes=1000, pretrained='imagenet') Source: Torch7 Repo de Facebook
Il y a un peu différent de la resnet * de TorchVision. Resnet152 est actuellement le seul disponible.
fbresnet152(num_classes=1000, pretrained='imagenet') Source: Caffe Repo de Kaiminghe
cafferesnet101(num_classes=1000, pretrained='imagenet') Source: TensorFlow Slim Repo et Pytorch / Vision Repo pour inceptionv3
inceptionresnetv2(num_classes=1000, pretrained='imagenet')inceptionresnetv2(num_classes=1001, pretrained='imagenet+background')inceptionv4(num_classes=1000, pretrained='imagenet')inceptionv4(num_classes=1001, pretrained='imagenet+background')inceptionv3(num_classes=1000, pretrained='imagenet') Source: Formé avec Caffe par Xiong Yuanjun
bninception(num_classes=1000, pretrained='imagenet') Source: Resnext Repo de Facebook
resnext101_32x4d(num_classes=1000, pretrained='imagenet')resnext101_62x4d(num_classes=1000, pretrained='imagenet') Source: Mxnet Repo de Chen Yunpeng
Le portage a été rendu possible par Ross Wightman dans son dépôt de pytorch.
Comme vous pouvez le voir ici, DualPathNetworks vous permet d'essayer différentes échelles. Le par défaut dans ce dépôt est de 0,875, ce qui signifie que la taille d'entrée d'origine est de 256 avant la culture à 224.
dpn68(num_classes=1000, pretrained='imagenet')dpn98(num_classes=1000, pretrained='imagenet')dpn131(num_classes=1000, pretrained='imagenet')dpn68b(num_classes=1000, pretrained='imagenet+5k')dpn92(num_classes=1000, pretrained='imagenet+5k')dpn107(num_classes=1000, pretrained='imagenet+5k') 'imagenet+5k' signifie que le réseau a été pré-étiré sur ImageNet5k avant d'être finetumé sur ImageNet1k.
Source: Repo Keras
Le portage a été rendu possible par T Standley.
xception(num_classes=1000, pretrained='imagenet') Source: Caffe Repo de Jie Hu
senet154(num_classes=1000, pretrained='imagenet')se_resnet50(num_classes=1000, pretrained='imagenet')se_resnet101(num_classes=1000, pretrained='imagenet')se_resnet152(num_classes=1000, pretrained='imagenet')se_resnext50_32x4d(num_classes=1000, pretrained='imagenet')se_resnext101_32x4d(num_classes=1000, pretrained='imagenet') Source: Tensorflow Slim Repo
pnasnet5large(num_classes=1000, pretrained='imagenet')pnasnet5large(num_classes=1001, pretrained='imagenet+background') Source: Caffe Repo du laboratoire multimédia CUHK
polynet(num_classes=1000, pretrained='imagenet') Source: Pytorch / Vision Repo
( inceptionv3 inclus dans Inception *)
resnet18(num_classes=1000, pretrained='imagenet')resnet34(num_classes=1000, pretrained='imagenet')resnet50(num_classes=1000, pretrained='imagenet')resnet101(num_classes=1000, pretrained='imagenet')resnet152(num_classes=1000, pretrained='imagenet')densenet121(num_classes=1000, pretrained='imagenet')densenet161(num_classes=1000, pretrained='imagenet')densenet169(num_classes=1000, pretrained='imagenet')densenet201(num_classes=1000, pretrained='imagenet')squeezenet1_0(num_classes=1000, pretrained='imagenet')squeezenet1_1(num_classes=1000, pretrained='imagenet')alexnet(num_classes=1000, pretrained='imagenet')vgg11(num_classes=1000, pretrained='imagenet')vgg13(num_classes=1000, pretrained='imagenet')vgg16(num_classes=1000, pretrained='imagenet')vgg19(num_classes=1000, pretrained='imagenet')vgg11_bn(num_classes=1000, pretrained='imagenet')vgg13_bn(num_classes=1000, pretrained='imagenet')vgg16_bn(num_classes=1000, pretrained='imagenet')vgg19_bn(num_classes=1000, pretrained='imagenet')Une fois qu'un modèle pré-entraîné a été chargé, vous pouvez l'utiliser de cette façon.
Remarque importante : Toute l'image doit être chargée à l'aide PIL qui échelle les valeurs de pixels entre 0 et 1.
model.input_size Attribute de list de types composée de 3 nombres:
Exemple:
[3, 299, 299] pour les réseaux de création *,[3, 224, 224] pour les réseaux Resnet *. model.input_space Attribute de type str représentant l'espace colorimétrique de l'image. Peut être RGB ou BGR .
model.input_range Attribute de list de types composée de 2 nombres:
Exemple:
[0, 1] pour les réseaux Resnet * et Inception *,[0, 255] pour le réseau de bninception. model.mean Attribute de list de types composée de 3 nombres qui sont utilisés pour normaliser l'image d'entrée (soustraire "couleurs-canal").
Exemple:
[0.5, 0.5, 0.5] pour les réseaux de création *,[0.485, 0.456, 0.406] pour les réseaux Resnet *. model.std Attribute de list de types composée de 3 nombres qui sont utilisés pour normaliser l'image d'entrée (diviser le "canal de couleur").
Exemple:
[0.5, 0.5, 0.5] pour les réseaux de création *,[0.229, 0.224, 0.225] pour les réseaux Resnet *. model.features/! travail en cours (peut ne pas être disponible)
Méthode qui est utilisée pour extraire les fonctionnalités de l'image.
Exemple lorsque le modèle est chargé à l'aide de fbresnet152 :
print ( input_224 . size ()) # (1,3,224,224)
output = model . features ( input_224 )
print ( output . size ()) # (1,2048,1,1)
# print(input_448.size()) # (1,3,448,448)
output = model . features ( input_448 )
# print(output.size()) # (1,2048,7,7) model.logits/! travail en cours (peut ne pas être disponible)
Méthode qui est utilisée pour classer les fonctionnalités de l'image.
Exemple lorsque le modèle est chargé à l'aide de fbresnet152 :
output = model . features ( input_224 )
print ( output . size ()) # (1,2048, 1, 1)
output = model . logits ( output )
print ( output . size ()) # (1,1000) model.forward Méthode utilisée pour appeler model.features et model.logits . Il peut être écrasé comme vous le souhaitez.
Remarque : Une bonne pratique consiste à utiliser model.__call__ comme fonction de votre choix pour transmettre une entrée à votre modèle. Voir l'exemple ci-dessous.
# Without model.__call__
output = model . forward ( input_224 )
print ( output . size ()) # (1,1000)
# With model.__call__
output = model ( input_224 )
print ( output . size ()) # (1,1000) model.last_linear Attribue de type nn.Linear . Ce module est le dernier à être appelé pendant la passe avant.
nn.Linear adapté pour un réglage fin.pretrained.utils.Identity pour l'extraction des caractéristiques. Exemple lorsque le modèle est chargé à l'aide de fbresnet152 :
print ( input_224 . size ()) # (1,3,224,224)
output = model . features ( input_224 )
print ( output . size ()) # (1,2048,1,1)
output = model . logits ( output )
print ( output . size ()) # (1,1000)
# fine tuning
dim_feats = model . last_linear . in_features # =2048
nb_classes = 4
model . last_linear = nn . Linear ( dim_feats , nb_classes )
output = model ( input_224 )
print ( output . size ()) # (1,4)
# features extraction
model . last_linear = pretrained . utils . Identity ()
output = model ( input_224 )
print ( output . size ()) # (1,2048) th pretrainedmodels/fbresnet/resnet152_dump.lua
python pretrainedmodels/fbresnet/resnet152_load.py
https://github.com/clcarwin/convert_torch_to_pytorch
https://github.com/cadene/tensorflow-model-zoo.torch
Grâce à la communauté d'apprentissage en profondeur et surtout aux contributeurs de l'écosystème Pytorch.