このレポの目標は次のとおりです。
ニュース:
pip install pretrainedmodels 、 pretrainedmodels.model_names 、 pretrainedmodels.pretrained_settingspython setup.py installgit pullが必要です)の更新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 ()注:デフォルトでは、モデルは$HOME/.torchフォルダーにダウンロードされます。次のように、 $TORCH_HOME変数を使用してこの動作を変更できます。TORCH_HOME 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
結果は、トレーニングプロセス中よりも同じサイズの(中央クロップド)画像を使用して得られました。
| モデル | バージョン | ACC@1 | ACC@5 |
|---|---|---|---|
| pnasnet-5-large | Tensorflow | 82.858 | 96.182 |
| pnasnet-5-large | 私たちの移植 | 82.736 | 95.992 |
| nasnet-a-large | Tensorflow | 82.693 | 96.163 |
| nasnet-a-large | 私たちの移植 | 82.566 | 96.086 |
| senet154 | カフェ | 81.32 | 95.53 |
| senet154 | 私たちの移植 | 81.304 | 95.498 |
| ポリネット | カフェ | 81.29 | 95.75 |
| ポリネット | 私たちの移植 | 81.002 | 95.624 |
| InceptionResnetv2 | Tensorflow | 80.4 | 95.3 |
| inceptionv4 | Tensorflow | 80.2 | 95.3 |
| se-resnext101_32x4d | 私たちの移植 | 80.236 | 95.028 |
| se-resnext101_32x4d | カフェ | 80.19 | 95.04 |
| InceptionResnetv2 | 私たちの移植 | 80.170 | 95.234 |
| inceptionv4 | 私たちの移植 | 80.062 | 94.926 |
| dualpathnet107_5k | 私たちの移植 | 79.746 | 94.684 |
| resnext101_64x4d | TORCH7 | 79.6 | 94.7 |
| dualpathnet131 | 私たちの移植 | 79.432 | 94.574 |
| dualpathnet92_5k | 私たちの移植 | 79.400 | 94.620 |
| dualpathnet98 | 私たちの移植 | 79.224 | 94.488 |
| se-resnext50_32x4d | 私たちの移植 | 79.076 | 94.434 |
| se-resnext50_32x4d | カフェ | 79.03 | 94.46 |
| Xception | ケラス | 79.000 | 94.500 |
| resnext101_64x4d | 私たちの移植 | 78.956 | 94.252 |
| Xception | 私たちの移植 | 78.888 | 94.292 |
| resnext101_32x4d | TORCH7 | 78.8 | 94.4 |
| Se-Resnet152 | カフェ | 78.66 | 94.46 |
| Se-Resnet152 | 私たちの移植 | 78.658 | 94.374 |
| ResNet152 | Pytorch | 78.428 | 94.110 |
| Se-Resnet101 | 私たちの移植 | 78.396 | 94.258 |
| Se-Resnet101 | カフェ | 78.25 | 94.28 |
| resnext101_32x4d | 私たちの移植 | 78.188 | 93.886 |
| fbresnet152 | TORCH7 | 77.84 | 93.84 |
| Se-Resnet50 | カフェ | 77.63 | 93.64 |
| Se-Resnet50 | 私たちの移植 | 77.636 | 93.752 |
| densenet161 | Pytorch | 77.560 | 93.798 |
| resnet101 | Pytorch | 77.438 | 93.672 |
| fbresnet152 | 私たちの移植 | 77.386 | 93.594 |
| inceptionv3 | Pytorch | 77.294 | 93.454 |
| densenet201 | Pytorch | 77.152 | 93.548 |
| dualpathnet68b_5k | 私たちの移植 | 77.034 | 93.590 |
| cafferesnet101 | カフェ | 76.400 | 92.900 |
| cafferesnet101 | 私たちの移植 | 76.200 | 92.766 |
| densenet169 | Pytorch | 76.026 | 92.992 |
| Resnet50 | Pytorch | 76.002 | 92.980 |
| dualpathnet68 | 私たちの移植 | 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 | 私たちの移植 | 74.080 | 91.740 |
| ResNet34 | Pytorch | 73.554 | 91.456 |
| bninception | 私たちの移植 | 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 |
注:
注意してください、ここで報告される精度は、他のタスクやデータセットでネットワークの転送可能な容量を常に表しているわけではありません。あなたはそれらすべてを試さなければなりません! :p
Imagenet検証メトリックの計算を参照してください
出典:Tensorflow Slim Repo
nasnetalarge(num_classes=1000, pretrained='imagenet')nasnetalarge(num_classes=1001, pretrained='imagenet+background')nasnetamobile(num_classes=1000, pretrained='imagenet') 出典:FacebookのTORCH7リポジトリ
TorchvisionのResnet*とは少し異なります。 ResNet152は現在、利用可能な唯一のものです。
fbresnet152(num_classes=1000, pretrained='imagenet') 出典:KaimingheのCaffe Repo
cafferesnet101(num_classes=1000, pretrained='imagenet') 出典: inceptionv3のTensorflow Slim RepoおよびPytorch/Vision Repo
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') 出典:Xiong YuanjunによるCaffeでトレーニング
bninception(num_classes=1000, pretrained='imagenet') 出典:FacebookのResNext Repo
resnext101_32x4d(num_classes=1000, pretrained='imagenet')resnext101_62x4d(num_classes=1000, pretrained='imagenet') 出典:Chen YunpengのMXNETリポジトリ
この移植は、ロス・ワイトマンがPytorch Repoで可能にしました。
ここで見ることができるように、DualPathnetWorksを使用すると、さまざまなスケールを試すことができます。このリポジトリのデフォルトのものは0.875です。つまり、元の入力サイズは224に収穫される前に256です。
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'とは、Imagenet1kで微調整される前に、ネットワークがImagenet5kで前提とされていることを意味します。
出典:Keras Repo
ポーティングはTスタンドリーによって可能になりました。
xception(num_classes=1000, pretrained='imagenet') 出典:Jie HuのCaffe Repo
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') 出典:Tensorflow Slim Repo
pnasnet5large(num_classes=1000, pretrained='imagenet')pnasnet5large(num_classes=1001, pretrained='imagenet+background') 出典:Cuhk Multimedia LabのCaffe Repo
polynet(num_classes=1000, pretrained='imagenet') 出典:Pytorch/Vision Repo
( inceptionv3が開始に含まれる*)
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')前処理されたモデルがロードされたら、そのように使用できます。
重要な注意:すべての画像は、0〜1の間のピクセル値をスケーリングするPILを使用してロードする必要があります。
model.input_size 3つの数値で構成されるタイプlistの帰属:
例:
[3, 299, 299]インセプション*ネットワークのために、[3, 224, 224] resnet*ネットワークの場合。 model.input_space画像の色空間を表すタイプstrの帰属。 RGBまたはBGRにすることができます。
model.input_range 2つの数値で構成されるタイプlistの帰属:
例:
[0, 1] resnet*およびInception*ネットワークの場合、[0, 255] bninceptionネットワークの場合。 model.mean入力画像を正規化するために使用される3つの数値で構成されるタイプlistの属性(「カラーチャネルごとに」を覆します)。
例:
[0.5, 0.5, 0.5]インセプション*ネットワークの場合、[0.485, 0.456, 0.406] resnet*ネットワークの場合。 model.std入力画像を正規化するために使用される3つの数値で構成されるタイプlistの属性(「カラーチャネルごとに」を分割します)。
例:
[0.5, 0.5, 0.5]インセプション*ネットワークの場合、[0.229, 0.224, 0.225] resnet*ネットワークの場合。 model.features/!進行中の作業(利用できない場合があります)
画像から機能を抽出するために使用される方法。
例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/!進行中の作業(利用できない場合があります)
画像から機能を分類するために使用される方法。
例fbresnet152を使用してモデルをロードした場合:
output = model . features ( input_224 )
print ( output . size ()) # (1,2048, 1, 1)
output = model . logits ( output )
print ( output . size ()) # (1,1000) model.forward model.features and model.logitsを呼び出すために使用される方法。必要に応じて上書きすることができます。
注:良い習慣は、モデルの機能としてmodel.__call__を使用して、モデルに入力を転送することです。 Bellowの例を参照してください。
# 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タイプnn.Linearの属性。このモジュールは、フォワードパス中に呼び出される最後のモジュールです。
nn.Linearに置き換えることができます。pretrained.utils.Identityで置き換えることができます。例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
深い学習コミュニティ、特にPytorchエコシステムの貢献者に感謝します。