El objetivo de este repositorio es:
Noticias:
pip install pretrainedmodels pretrainedmodels.model_names , pretrainedmodels.pretrained_settingspython setup.py installgit pull es necesario)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 defecto, los modelos se descargarán a su carpeta $HOME/.torch . Puede modificar este comportamiento utilizando la variable $TORCH_HOME de la siguiente manera: 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
Los resultados se obtuvieron utilizando imágenes (centradas en el centro) del mismo tamaño que durante el proceso de entrenamiento.
| Modelo | Versión | Acc@1 | ACC@5 |
|---|---|---|---|
| PNASNET-5-LARGO | Flujo tensor | 82.858 | 96.182 |
| PNASNET-5-LARGO | Nuestro porte | 82.736 | 95.992 |
| Nasnet-a-large | Flujo tensor | 82.693 | 96.163 |
| Nasnet-a-large | Nuestro porte | 82.566 | 96.086 |
| Senet154 | Cafetería | 81.32 | 95.53 |
| Senet154 | Nuestro porte | 81.304 | 95.498 |
| Polinet | Cafetería | 81.29 | 95.75 |
| Polinet | Nuestro porte | 81.002 | 95.624 |
| InceptionResnetv2 | Flujo tensor | 80.4 | 95.3 |
| InceptionV4 | Flujo tensor | 80.2 | 95.3 |
| SE-RESNEXT101_32X4D | Nuestro porte | 80.236 | 95.028 |
| SE-RESNEXT101_32X4D | Cafetería | 80.19 | 95.04 |
| InceptionResnetv2 | Nuestro porte | 80.170 | 95.234 |
| InceptionV4 | Nuestro porte | 80.062 | 94.926 |
| Dualpathnet107_5k | Nuestro porte | 79.746 | 94.684 |
| Resnext101_64x4d | Antorcha7 | 79.6 | 94.7 |
| Dualpathnet131 | Nuestro porte | 79.432 | 94.574 |
| Dualpathnet92_5k | Nuestro porte | 79.400 | 94.620 |
| Dualpathnet98 | Nuestro porte | 79.224 | 94.488 |
| SE-RESNEXT50_32X4D | Nuestro porte | 79.076 | 94.434 |
| SE-RESNEXT50_32X4D | Cafetería | 79.03 | 94.46 |
| Xcepción | Keras | 79.000 | 94.500 |
| Resnext101_64x4d | Nuestro porte | 78.956 | 94.252 |
| Xcepción | Nuestro porte | 78.888 | 94.292 |
| Resnext101_32x4d | Antorcha7 | 78.8 | 94.4 |
| SE-Resnet152 | Cafetería | 78.66 | 94.46 |
| SE-Resnet152 | Nuestro porte | 78.658 | 94.374 |
| Resnet152 | Pytorch | 78.428 | 94.110 |
| SE-Resnet101 | Nuestro porte | 78.396 | 94.258 |
| SE-Resnet101 | Cafetería | 78.25 | 94.28 |
| Resnext101_32x4d | Nuestro porte | 78.188 | 93.886 |
| Fbresnet152 | Antorcha7 | 77.84 | 93.84 |
| SE-Resnet50 | Cafetería | 77.63 | 93.64 |
| SE-Resnet50 | Nuestro porte | 77.636 | 93.752 |
| Densenet161 | Pytorch | 77.560 | 93.798 |
| Resnet101 | Pytorch | 77.438 | 93.672 |
| Fbresnet152 | Nuestro porte | 77.386 | 93.594 |
| Inceptionv3 | Pytorch | 77.294 | 93.454 |
| Densenet201 | Pytorch | 77.152 | 93.548 |
| Dualpathnet68b_5k | Nuestro porte | 77.034 | 93.590 |
| Cafferesnet101 | Cafetería | 76.400 | 92.900 |
| Cafferesnet101 | Nuestro porte | 76.200 | 92.766 |
| Densenet169 | Pytorch | 76.026 | 92.992 |
| Resnet50 | Pytorch | 76.002 | 92.980 |
| Dualpathnet68 | Nuestro porte | 75.868 | 92.774 |
| Densenet121 | Pytorch | 74.646 | 92.136 |
| VGG19_BN | Pytorch | 74.266 | 92.066 |
| Nasnet-a-mobile | Flujo tensor | 74.0 | 91.6 |
| Nasnet-a-mobile | Nuestro porte | 74.080 | 91.740 |
| Resnet34 | Pytorch | 73.554 | 91.456 |
| Bninception | Nuestro porte | 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:
Tenga cuidado, la precisión informada aquí no siempre es representativa de la capacidad transferible de la red en otras tareas y conjuntos de datos. ¡Debes probarlos todos! :PAG
Consulte las métricas de validación de ImageNet de Compute
Fuente: Tensorflow Slim Repo
nasnetalarge(num_classes=1000, pretrained='imagenet')nasnetalarge(num_classes=1001, pretrained='imagenet+background')nasnetamobile(num_classes=1000, pretrained='imagenet') Fuente: Torch7 Repo of Facebook
Hay un poco diferente del resnet* de TorchVision. Resnet152 es actualmente el único disponible.
fbresnet152(num_classes=1000, pretrained='imagenet') Fuente: Repo de Caffe de Kaiminghe
cafferesnet101(num_classes=1000, pretrained='imagenet') Fuente: Tensorflow Slim Repo y 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') Fuente: Entrenado con Caffe por Xiong Yuanjun
bninception(num_classes=1000, pretrained='imagenet') Fuente: Resnext Repo of Facebook
resnext101_32x4d(num_classes=1000, pretrained='imagenet')resnext101_62x4d(num_classes=1000, pretrained='imagenet') Fuente: Repo MXNet de Chen Yunpeng
Ross Wightman ha hecho posible el porte en su repositorio de Pytorch.
Como puede ver aquí, DualPathNetWorks le permite probar diferentes escalas. El predeterminado en este repositorio es 0.875, lo que significa que el tamaño de entrada original es 256 antes de la recorte a 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 la red ha sido enviada en el estado previo en ImageNet5k antes de ser fingido en ImageNet1k.
Fuente: Repo de Keras
T Standley ha hecho posible el porte.
xception(num_classes=1000, pretrained='imagenet') Fuente: Repo de Caffe 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') Fuente: Tensorflow Slim Repo
pnasnet5large(num_classes=1000, pretrained='imagenet')pnasnet5large(num_classes=1001, pretrained='imagenet+background') Fuente: Repo de la cafetería del laboratorio multimedia CUHK
polynet(num_classes=1000, pretrained='imagenet') Fuente: Repo de Pytorch/Vision
( inceptionv3 incluido en el inicio*)
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')Una vez que se ha cargado un modelo previo al estado previo, puede usarlo de esa manera.
Nota importante : Toda la imagen debe cargarse utilizando PIL que escala los valores de píxeles entre 0 y 1.
model.input_size Atributo de list de tipos compuesta de 3 números:
Ejemplo:
[3, 299, 299] para Inception* Reds,[3, 224, 224] para redes resnet*. model.input_space Atribut de tipo str que representa el espacio de color de la imagen. Puede ser RGB o BGR .
model.input_range Atributo de list de tipos compuesta de 2 números:
Ejemplo:
[0, 1] para redes resnet* e inicio*,[0, 255] para la red Bninception. model.mean Atributo de list de tipos compuesta de 3 números que se utilizan para normalizar la imagen de entrada (suscente "en cuanto al canal de color").
Ejemplo:
[0.5, 0.5, 0.5] para las redes de inicio*,[0.485, 0.456, 0.406] para redes resnet*. model.std Atributo de list de tipos compuesta de 3 números que se utilizan para normalizar la imagen de entrada (divide "Color-canal").
Ejemplo:
[0.5, 0.5, 0.5] para las redes de inicio*,[0.229, 0.224, 0.225] para redes resnet*. model.features/! trabajo en progreso (puede que no esté disponible)
Método que se utiliza para extraer las características de la imagen.
Ejemplo Cuando el modelo se carga 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/! trabajo en progreso (puede que no esté disponible)
Método que se utiliza para clasificar las características desde la imagen.
Ejemplo Cuando el modelo se carga 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 utilizado para llamar model.features Features y model.logits . Se puede sobrescribir según lo desee.
Nota : Una buena práctica es usar model.__call__ como su función de elección para reenviar una entrada a su modelo. Vea el ejemplo a continuación.
# 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 Atributo del tipo nn.Linear . Este módulo es el último que se llama durante el pase hacia adelante.
nn.Linear adaptado para un ajuste fino.pretrained.utils.Identity . Ejemplo Cuando el modelo se carga 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
Gracias a la comunidad de aprendizaje profundo y especialmente a los contribuyentes del ecosistema de Pytorch.