Das Ziel dieses Repo ist:
Nachricht:
pretrainedmodels.model_names pretrainedmodels.pretrained_settings pip install pretrainedmodelspython setup.py installgit pull wird benötigt)model.features(input) , model.logits(features) , model.forward(input) , model.last_linear ) verbessern.pip install pretrainedmodelsgit clone https://github.com/Cadene/pretrained-models.pytorch.gitcd pretrained-models.pytorchpython setup.py install pretrainedmodels zu importieren: 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 () Hinweis : Standardmäßig werden Modelle in Ihren $HOME/.torch -Ordner heruntergeladen. Sie können dieses Verhalten mithilfe der Variablen $TORCH_HOME wie folgt ändern: 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
Die Ergebnisse wurden unter Verwendung von (zentrumgeschnittenen) Bildern derselben Größe erhalten als während des Trainingsprozesses.
| Modell | Version | ACC@1 | ACC@5 |
|---|---|---|---|
| Pnasnet-5-large | Tensorflow | 82.858 | 96.182 |
| Pnasnet-5-large | Unser Porting | 82.736 | 95.992 |
| Nasnet-a-Large | Tensorflow | 82.693 | 96.163 |
| Nasnet-a-Large | Unser Porting | 82.566 | 96.086 |
| Senet154 | Kaffe | 81.32 | 95,53 |
| Senet154 | Unser Porting | 81.304 | 95.498 |
| Polynet | Kaffe | 81.29 | 95.75 |
| Polynet | Unser Porting | 81.002 | 95.624 |
| InceptionResnetv2 | Tensorflow | 80.4 | 95.3 |
| Inceptionv4 | Tensorflow | 80.2 | 95.3 |
| Se-resnext101_32x4d | Unser Porting | 80.236 | 95.028 |
| Se-resnext101_32x4d | Kaffe | 80.19 | 95.04 |
| InceptionResnetv2 | Unser Porting | 80.170 | 95.234 |
| Inceptionv4 | Unser Porting | 80.062 | 94.926 |
| DualPathNet107_5k | Unser Porting | 79,746 | 94.684 |
| Resnext101_64x4d | Torch7 | 79,6 | 94.7 |
| DualPathNet131 | Unser Porting | 79,432 | 94.574 |
| DualPathNet92_5k | Unser Porting | 79,400 | 94.620 |
| DualPathNet98 | Unser Porting | 79,224 | 94.488 |
| Se-resnext50_32x4d | Unser Porting | 79.076 | 94.434 |
| Se-resnext50_32x4d | Kaffe | 79.03 | 94.46 |
| Xception | Keras | 79.000 | 94.500 |
| Resnext101_64x4d | Unser Porting | 78.956 | 94.252 |
| Xception | Unser Porting | 78.888 | 94.292 |
| Resnext101_32x4d | Torch7 | 78,8 | 94.4 |
| SE-RESNET152 | Kaffe | 78,66 | 94.46 |
| SE-RESNET152 | Unser Porting | 78.658 | 94.374 |
| Resnet152 | Pytorch | 78.428 | 94.110 |
| SE-RESNET101 | Unser Porting | 78.396 | 94.258 |
| SE-RESNET101 | Kaffe | 78,25 | 94.28 |
| Resnext101_32x4d | Unser Porting | 78.188 | 93.886 |
| Fbresnet152 | Torch7 | 77,84 | 93.84 |
| SE-RESNET50 | Kaffe | 77,63 | 93.64 |
| SE-RESNET50 | Unser Porting | 77.636 | 93.752 |
| Densenet161 | Pytorch | 77.560 | 93.798 |
| Resnet101 | Pytorch | 77.438 | 93.672 |
| Fbresnet152 | Unser Porting | 77.386 | 93.594 |
| Inceptionv3 | Pytorch | 77.294 | 93.454 |
| Densenet201 | Pytorch | 77.152 | 93.548 |
| DualPathNet68B_5K | Unser Porting | 77.034 | 93.590 |
| Cafferesnet101 | Kaffe | 76.400 | 92.900 |
| Cafferesnet101 | Unser Porting | 76.200 | 92.766 |
| Densenet169 | Pytorch | 76.026 | 92.992 |
| Resnet50 | Pytorch | 76.002 | 92.980 |
| DualPathNet68 | Unser Porting | 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 | Unser Porting | 74.080 | 91.740 |
| Resnet34 | Pytorch | 73,554 | 91.456 |
| BnInception | Unser Porting | 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 |
Anmerkungen:
Vorsicht, die hier gemeldete Genauigkeit ist nicht immer repräsentativ für die übertragbare Kapazität des Netzwerks bei anderen Aufgaben und Datensätzen. Sie müssen sie alle ausprobieren! :P
Bitte beachten Sie die Kennzahlen zur Berechnung imagnet -Validierungsmetriken
Quelle: Tensorflow Slim Repo
nasnetalarge(num_classes=1000, pretrained='imagenet')nasnetalarge(num_classes=1001, pretrained='imagenet+background')nasnetamobile(num_classes=1000, pretrained='imagenet') Quelle: Torch7 Repo von Facebook
Es gibt etwas anders als das resnet* von Torchvision. Resnet152 ist derzeit die einzige verfügbar.
fbresnet152(num_classes=1000, pretrained='imagenet') Quelle: Caffe Repo von Kaiminghe
cafferesnet101(num_classes=1000, pretrained='imagenet') Quelle: Tensorflow Slim Repo und Pytorch/Vision Repo für 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') Quelle: Mit Kaffe trainiert von Xiong Yuanjun
bninception(num_classes=1000, pretrained='imagenet') Quelle: Resnext Repo von Facebook
resnext101_32x4d(num_classes=1000, pretrained='imagenet')resnext101_62x4d(num_classes=1000, pretrained='imagenet') Quelle: MXNET Repo von Chen Yunpeng
Das Porting wurde von Ross Wightman in seinem Pytorch Repo ermöglicht.
Wie Sie hier sehen können, können Sie mit DualPathNetworks verschiedene Skalen ausprobieren. Die Standardeinstellung in diesem Repo beträgt 0,875, was bedeutet, dass die ursprüngliche Eingangsgröße 256 beträgt, bevor er auf 224 geschnitten wird.
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' bedeutet, dass das Netzwerk auf ImageNet5k vorbereitet wurde, bevor er auf ImageNeT1k finationiert wurde.
Quelle: Keras Repo
Das Porting wurde von T Standley ermöglicht.
xception(num_classes=1000, pretrained='imagenet') Quelle: Caffe Repo von 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') Quelle: Tensorflow Slim Repo
pnasnet5large(num_classes=1000, pretrained='imagenet')pnasnet5large(num_classes=1001, pretrained='imagenet+background') Quelle: Caffe Repo des CUHK -Multimedia -Labors
polynet(num_classes=1000, pretrained='imagenet') Quelle: Pytorch/Vision Repo
( inceptionv3 in Inception enthalten*)
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')Sobald ein vorgezogenes Modell geladen wurde, können Sie es so verwenden.
Wichtiger Hinweis : Das gesamte Bild muss mit PIL geladen werden, der die Pixelwerte zwischen 0 und 1 skaliert.
model.input_size Attribut der list , die aus 3 Zahlen besteht:
Beispiel:
[3, 299, 299] für Inception* -Netzwerke,[3, 224, 224] Für Resnet* -Netzwerke. model.input_space Attribut des Typs str der den Farbraum des Bildes darstellt. Kann RGB oder BGR sein.
model.input_range Attribut der list , die aus 2 Zahlen besteht:
Beispiel:
[0, 1] für Resnet* und Inception* -Netzwerke,,[0, 255] Für das BnInception -Netzwerk. model.mean Attribut der list , die aus 3 Zahlen besteht, die zum Normalisieren des Eingabebildes verwendet werden (Substract "Color-Channel-Weise").
Beispiel:
[0.5, 0.5, 0.5] für Inception* -Netzwerke,[0.485, 0.456, 0.406] für Resnet* -Netzwerke. model.std Attribut der list , die aus 3 Zahlen besteht, die zum Normalisieren des Eingabebildes verwendet werden ("Farbkanal").
Beispiel:
[0.5, 0.5, 0.5] für Inception* -Netzwerke,[0.229, 0.224, 0.225] für Resnet* -Netzwerke. model.features/! Arbeit in Arbeit (ist möglicherweise nicht verfügbar)
Methode, mit der die Merkmale aus dem Bild extrahiert werden.
Beispiel Wenn das Modell mit fbresnet152 geladen wird:
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/! Arbeit in Arbeit (ist möglicherweise nicht verfügbar)
Methode, mit der die Merkmale aus dem Bild klassifiziert werden.
Beispiel Wenn das Modell mit fbresnet152 geladen wird:
output = model . features ( input_224 )
print ( output . size ()) # (1,2048, 1, 1)
output = model . logits ( output )
print ( output . size ()) # (1,1000) model.forward Methode zum Aufruf von model.features und model.logits . Es kann wie gewünscht überschrieben werden.
Hinweis : Eine gute Praxis besteht darin, model.__call__ als Funktion der Wahl, um eine Eingabe an Ihr Modell weiterzuleiten. Siehe das Beispiel unten.
# 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 Attribut des Typs nn.Linear . Dieses Modul ist das letzte, das während des Vorwärtspasses aufgerufen wird.
nn.Linear für die Feinabstimmung ersetzt werden.pretrained.utils.Identity . Beispiel Wenn das Modell mit fbresnet152 geladen wird:
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
Dank der Deep -Learning -Community und insbesondere an die Mitwirkenden des Pytorch -Ökosystems.