GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

Cadene

pretrained-models.pytorch – PytorchのためのPretrained ConvNets:NASNet、ResNeXt、ResNet..

投稿日:

PytorchのためのPretrained ConvNets:NASNet、ResNeXt、ResNet、InceptionV4、InceptionResnetV2、Xception、DPNなど

Pytorchの事前トレーニング済みモデル(作業中)

このレポの目標は次のとおりです。

  • 研究論文の結果を再現するのを助けるために(例えば、学習設定を転送する)
  • torchvisionに触発されたユニークなインターフェイス/ APIを使用して、事前に訓練されたConvNetsにアクセスします。

ニュース:

  • 22/03/2018:CaffeResNet101(FasterRCNNによるローカライゼーションに適しています)
  • 21/03/2018: Veronika YurchukAnastasiiaのおかげでNASNet Mobile
  • 25/01/2018:DualPathNetworks T StandleyのおかげでRoss Wightman 、Xceptionのおかげで改善されたTransformImage API
  • 13/01/2018: pip install pretrainedmodelspretrainedmodels.model_namespretrainedmodels.pretrained_settings pip install pretrainedmodels
  • 12/01/2018: python setup.py install
  • 2011年8月12日:データURLの更新(/!\ git pullが必要です)
  • 20/11/2011:APIの改善( model.features(input)model.logits(features)model.forward(input)model.last_linear
  • 16/11/2017:T. DurandとR. Cadeneが移植したnasnet-a-large事前訓練モデル
  • 22/07/2017:torchvision事前にトレインされたモデル
  • 22/07/2017:inceptionv4とinceptionresnetv2の勢いを0.1に
  • 17/07/2017:model.input_range属性
  • 17/07/2017:Imagenetに事前に配属された

概要

インストール

  1. python3とanaconda
  2. CUDA付き/ピューター付き

pipからインストールする

  1. pip install pretrainedmodels

レポからインストールする

  1. git clone https://github.com/Cadene/pretrained-models.pytorch.git
  2. cd pretrained-models.pytorch
  3. python setup.py install

簡単な例

  • pretrainedmodelsをインポート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']
  • 選択したモデルに使用可能な事前設定を印刷するには:
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}}
  • imagenetから事前に訓練されたモデルをロードするには:
model_name = 'nasnetalarge' # could be fbresnet152 or inceptionresnetv2
model = pretrainedmodels.__dict__[model_name](num_classes=1000, pretrained='imagenet')
model.eval()

注意 :デフォルトでは、モデルは$HOME/.torchフォルダにダウンロードされます。 次のように$TORCH_MODEL_ZOO変数を使用してこの動作を変更できexport TORCH_MODEL_ZOO="/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
  • 機能を抽出するには(このAPIはすべてのネットワークで利用できないことに注意してください):
output_features = model.features(input) # 1x14x14x2048 size may differ
output_logits = model.logits(output_features) # 1x1000

ユースケースはほとんどありません

イマージネットログを計算する

  • imagenetで事前にモデル化されたモデルを使用して、1つの画像にクラス外観のログを計算するには、 examples / imagenet_logits.pyを参照してください。
$ python examples/imagenet_logits.py -h
> nasnetalarge, resnet152, inceptionresnetv2, inceptionv4, ...
$ python examples/imagenet_logits.py -a nasnetalarge --path_img data/cat.png
> 'nasnetalarge': data/cat.png' is a 'tiger cat' 

imagenet評価指標を計算する

$ python examples/imagenet_eval.py /local/common-data/imagenet_2012/images -a nasnetalarge -b 20 -e
> * Acc@1 92.693, Acc@5 96.13

イマジネーションの評価

検証セットの精度(単一モデル)

結果は、トレーニングプロセス中と同じサイズの(中央が切り取られた)画像を用いて得られた。

モデル バージョン Acc @ 1 Acc @ 5
NASNet-A-Large Tensorflow 82.693 96.163
NASNet-A-Large 私たちの移植 82.566 96.086
InceptionResNetV2 Tensorflow 80.4 95.3
開始V4 Tensorflow 80.2 95.3
InceptionResNetV2 私たちの移植 80.170 95.234
開始V4 私たちの移植 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
Xception ケラス 79.000 94.500
ResNeXt101_64x4d 私たちの移植 78.956 94.252
Xception 私たちの移植 78.888 94.292
ResNeXt101_32x4d Torch7 78.8 94.4
ResNet152 Pytorch 78.428 94.110
ResNeXt101_32x4d 私たちの移植 78.188 93.886
FBResNet152 Torch7 77.84 93.84
DenseNet161 Pytorch 77.560 93.798
ResNet101 Pytorch 77.438 93.672
FBResNet152 私たちの移植 77.386 93.594
開始V3 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.522 91.560
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
アレックスネット Pytorch 56.432 79.194

注:ResNet152のPytorchバージョンはTorch7の移植ではありませんが、Facebookに再トレーニングされています。

ここで報告された精度は、他のタスクやデータセット上のネットワークの転送可能な容量を必ずしも代表するものではないことに注意してください。 それらをすべて試してみる必要があります! :P

結果の再現

imagenet検証メトリックの計算を参照してください。

ドキュメンテーション

使用可能なモデル

NASNet *

ソース: TensorFlow Slim repo

  • nasnetalarge(num_classes=1000, pretrained='imagenet')
  • nasnetalarge(num_classes=1001, pretrained='imagenet+background')
  • nasnetamobile(num_classes=1000, pretrained='imagenet')

FaceBook ResNet *

出典: FaceBookのTorch7レポ

torchvisionのResNet *とは少し違いがあります。 現在のところ、ResNet152のみが利用可能です。

  • fbresnet152(num_classes=1000, pretrained='imagenet')

Caffe ResNet *

出典: カイミングのカフェレポ

  • cafferesnet101(num_classes=1000, pretrained='imagenet')

インセプション*

出典: TensorFlowスリムレポPytorch / Visionレポforceptionv3

  • 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')

BNInception

出典: Xiong YuanjunによるCaffeの訓練を受けた

  • bninception(num_classes=1000, pretrained='imagenet')

ResNeXt *

出典: FaceBookのResNeXtレポ

  • resnext101_32x4d(num_classes=1000, pretrained='imagenet')
  • resnext101_62x4d(num_classes=1000, pretrained='imagenet')

DualPathNetworks

出典: Chen YunpengのMXNETレポ

彼のPyTorchレポRoss Wightmanが移植を可能にしました。

DualPathNetworksでは、異なるスケールを試すことができます。 このレポのデフォルトの値は0.875です。これは、元の入力サイズが256に切り捨てられてから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'は、imagenet1kで微調整される前にネットワークがimagenet5kに事前に訓練されていることを意味します。

Xception

出典: Keras repo

移植はT Standleyによって可能になった。

  • xception(num_classes=1000, pretrained='imagenet')

TorchVision

出典: Pytorch / Vision repo

インセプション* 3インセプション*に含まれています

  • 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')

モデルAPI

あらかじめ訓練されたモデルがロードされると、そのように使用できます。

重要な注意 :すべての画像は、ピクセル値を0と1の間でスケーリングするPILを使用してロードする必要があります。

model.input_size

3つの数字で構成されるタイプlist属性:

  • カラーチャネルの数、
  • 入力画像の高さ、
  • 入力画像の幅。

例:

  • [3, 299, 299]の導入*ネットワーク、
  • resnet *ネットワーク用の[3、224、224 [3, 224, 224]

model.input_space

イメージの色空間を表すstr型の属性。 RGBまたはBGRことができます。

model.input_range

2つの数字で構成されるタイプlist属性:

  • 最小画素値、
  • 最大ピクセル値。

例:

  • resnet *とinception * networksの[0, 1]
  • 養子縁組ネットワークの[0, 255] 0、255 [0, 255]

model.mean

入力画像を正規化するために使用される3つの数字で構成されたタイプlist属性(「カラーチャンネルごと」を引く)。

例:

  • 開始時*ネットワークの場合[0.5, 0.5, 0.5]
  • resnet *ネットワークの[0.485, 0.456, 0.406]

model.std

タイプlist属性は、入力画像を正規化するために使用される3つの数字で構成されます(「カラーチャンネル別」で除算します)。

例:

  • 開始時*ネットワークの場合[0.5, 0.5, 0.5]
  • resnet *ネットワークの[0.229, 0.224, 0.225]です。

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.featuresmodel.logitsを呼び出すために使用されるメソッド。 必要に応じて上書きすることができます。

model.__call__への入力を転送するための選択肢としてmodel.__call__を使用することをおmodel.__call__します。 以下の例を参照してください。

# 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 Attribut。 このモジュールは、フォワードパス中に最後に呼び出されるモジュールです。

  • 微調整のために適合した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)

再現性

ResNet152のハンドポーティング

th pretrainedmodels/fbresnet/resnet152_dump.lua
python pretrainedmodels/fbresnet/resnet152_load.py

ResNeXtの自動移植

https://github.com/clcarwin/convert_torch_to_pytorch

NASNet、InceptionV4、InceptionResNetV2のハンドポーティング

https://github.com/Cadene/tensorflow-model-zoo.torch

了承

深い学びのコミュニティ、特に、パイロットの生態系の貢献者に感謝します。







-Cadene
-, , , , ,

執筆者: