O objetivo deste repo é:
Notícias:
pip install pretrainedmodels pretrainedmodels.model_names pretrainedmodels.pretrained_settingspython setup.py installgit pull é necessário)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 () Nota : Por padrão, os modelos serão baixados para sua pasta $HOME/.torch . Você pode modificar esse comportamento usando a variável $TORCH_HOME da 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
Os resultados foram obtidos usando imagens (cultivadas centrais) do mesmo tamanho do que durante o processo de treinamento.
| Modelo | Versão | ACC@1 | ACC@5 |
|---|---|---|---|
| PnasNet-5-Large | Tensorflow | 82.858 | 96.182 |
| PnasNet-5-Large | Nossa porta | 82.736 | 95.992 |
| NASNET-A-LARGE | Tensorflow | 82.693 | 96.163 |
| NASNET-A-LARGE | Nossa porta | 82.566 | 96.086 |
| SENET154 | Caffe | 81.32 | 95.53 |
| SENET154 | Nossa porta | 81.304 | 95.498 |
| Polynet | Caffe | 81.29 | 95.75 |
| Polynet | Nossa porta | 81.002 | 95.624 |
| INCMECCENTESRESNETV2 | Tensorflow | 80.4 | 95.3 |
| EMCCOMPENDV4 | Tensorflow | 80.2 | 95.3 |
| SE-RESNEXT101_32X4D | Nossa porta | 80.236 | 95.028 |
| SE-RESNEXT101_32X4D | Caffe | 80.19 | 95.04 |
| INCMECCENTESRESNETV2 | Nossa porta | 80.170 | 95.234 |
| EMCCOMPENDV4 | Nossa porta | 80.062 | 94.926 |
| Dualpathnet107_5k | Nossa porta | 79.746 | 94.684 |
| Resnext101_64x4d | Torch7 | 79.6 | 94.7 |
| DualPathnet131 | Nossa porta | 79.432 | 94.574 |
| DualpathNet92_5k | Nossa porta | 79.400 | 94.620 |
| Dualpathnet98 | Nossa porta | 79.224 | 94.488 |
| SE-RESNEXT50_32X4D | Nossa porta | 79.076 | 94.434 |
| SE-RESNEXT50_32X4D | Caffe | 79.03 | 94.46 |
| Xception | Keras | 79.000 | 94.500 |
| Resnext101_64x4d | Nossa porta | 78.956 | 94.252 |
| Xception | Nossa porta | 78.888 | 94.292 |
| Resnext101_32x4d | Torch7 | 78.8 | 94.4 |
| SE-RESNET152 | Caffe | 78.66 | 94.46 |
| SE-RESNET152 | Nossa porta | 78.658 | 94.374 |
| Resnet152 | Pytorch | 78.428 | 94.110 |
| SE-RESNET101 | Nossa porta | 78.396 | 94.258 |
| SE-RESNET101 | Caffe | 78.25 | 94.28 |
| Resnext101_32x4d | Nossa porta | 78.188 | 93.886 |
| FBRESNET152 | Torch7 | 77.84 | 93.84 |
| SE-RESNET50 | Caffe | 77.63 | 93.64 |
| SE-RESNET50 | Nossa porta | 77.636 | 93.752 |
| Densenet161 | Pytorch | 77.560 | 93.798 |
| Resnet101 | Pytorch | 77.438 | 93.672 |
| FBRESNET152 | Nossa porta | 77.386 | 93.594 |
| EMCCONTROV3 | Pytorch | 77.294 | 93.454 |
| Densenet201 | Pytorch | 77.152 | 93.548 |
| DualpathNet68b_5k | Nossa porta | 77.034 | 93.590 |
| CaffeResnet101 | Caffe | 76.400 | 92.900 |
| CaffeResnet101 | Nossa porta | 76.200 | 92.766 |
| Densenet169 | Pytorch | 76.026 | 92.992 |
| Resnet50 | Pytorch | 76.002 | 92.980 |
| DualPathnet68 | Nossa porta | 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 | Nossa porta | 74.080 | 91.740 |
| Resnet34 | Pytorch | 73.554 | 91.456 |
| Bninception | Nossa porta | 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 |
Notas:
Cuidado, a precisão relatada aqui nem sempre é representativa da capacidade transferível da rede em outras tarefas e conjuntos de dados. Você deve experimentar todos eles! : P
Por favor, consulte as métricas de validação do Compute ImageNet
Fonte: Tensorflow Slim Repo
nasnetalarge(num_classes=1000, pretrained='imagenet')nasnetalarge(num_classes=1001, pretrained='imagenet+background')nasnetamobile(num_classes=1000, pretrained='imagenet') Fonte: Torch7 repo do Facebook
Há um pouco diferente da resnet* da Torchvision. Resnet152 é atualmente o único disponível.
fbresnet152(num_classes=1000, pretrained='imagenet') Fonte: Caffe Repo de Kaiminghe
cafferesnet101(num_classes=1000, pretrained='imagenet') Fonte: Tensorflow Slim Repo e Pytorch/Vision Repo para 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') Fonte: treinado com Caffe por Xiong Yuanjun
bninception(num_classes=1000, pretrained='imagenet') Fonte: REPO RESNEXT do Facebook
resnext101_32x4d(num_classes=1000, pretrained='imagenet')resnext101_62x4d(num_classes=1000, pretrained='imagenet') Fonte: MXNET Repo de Chen Yunpeng
A porte foi possível por Ross Wightman em seu repo Pytorch.
Como você pode ver aqui, o DualPathNetworks permite que você experimente diferentes escalas. O padrão nesse repo é 0,875, o que significa que o tamanho da entrada original é 256 antes de cortar para 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' significa que a rede foi pré -criada no ImageNet5K antes de ser finetUned no imagenet1K.
Fonte: Keras Repo
A porte foi possível por T Standley.
xception(num_classes=1000, pretrained='imagenet') Fonte: 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') Fonte: Tensorflow Slim Repo
pnasnet5large(num_classes=1000, pretrained='imagenet')pnasnet5large(num_classes=1001, pretrained='imagenet+background') Fonte: Caffe Repo do CuHK Multimedia Lab
polynet(num_classes=1000, pretrained='imagenet') Fonte: Pytorch/Vision Repo
( inceptionv3 INCLUÍDO NA INCPEIO*)
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')Uma vez que um modelo pré -treinado for carregado, você pode usá -lo dessa maneira.
NOTA IMPORTANTE : Toda a imagem deve ser carregada usando PIL , que escala os valores de pixel entre 0 e 1.
model.input_size Atribuição da list de tipos composta por 3 números:
Exemplo:
[3, 299, 299] Para Inception* Redes,[3, 224, 224] para redes Resnet*. model.input_space Atribuição do tipo str representando o espaço de cores da imagem. Pode ser RGB ou BGR .
model.input_range Atribuição da list de tipos composta por 2 números:
Exemplo:
[0, 1] para resnet* e Infception* redes,[0, 255] para a rede Bninception. model.mean Atribuição da list de tipos composta por 3 números que são usados para normalizar a imagem de entrada (sub-descrace "em termos de cores em cores").
Exemplo:
[0.5, 0.5, 0.5] para as redes Inception*,[0.485, 0.456, 0.406] para redes Resnet*. model.std Atribuição da list de tipos composta por 3 números que são usados para normalizar a imagem de entrada (divida "channel de cor").
Exemplo:
[0.5, 0.5, 0.5] para as redes Inception*,[0.229, 0.224, 0.225] para redes Resnet*. model.features/! trabalho em andamento (pode não estar disponível)
Método usado para extrair os recursos da imagem.
Exemplo quando o modelo é carregado usando 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/! trabalho em andamento (pode não estar disponível)
Método usado para classificar os recursos da imagem.
Exemplo quando o modelo é carregado usando 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étodo usado para chamar model.features e model.logits . Pode ser substituído conforme desejado.
Nota : Uma boa prática é usar model.__call__ como sua função de escolha para encaminhar uma entrada para o seu modelo. Veja o exemplo abaixo.
# 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 Atribuição do tipo nn.Linear . Este módulo é o último a ser chamado durante o passe para a frente.
nn.Linear adaptado para ajuste fino.pretrained.utils.Identity para extração de recursos. Exemplo quando o modelo é carregado usando 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
Graças à comunidade de aprendizagem profunda e especialmente aos colaboradores do ecossistema de Pytorch.