2017-09-01 13 views
2

pytorchモデルの場合、画像を分類する方法を説明するthis tutorialが見つかりました。私は、開始モデルに同じ手順を適用しようとしました。pytorchの開始モデルは、入力画像ごとに間違ったラベルを出力します

:私はこれを取得、出力として

# some people need these three lines to make it work 
#from torchvision.models.inception import model_urls 
#name = 'inception_v3_google' 
#model_urls[name] = model_urls[name].replace('https://', 'http://') 

from torch.autograd import Variable 
import torchvision 
import requests 
from torchvision import models, transforms 
from PIL import Image 
import io 
from PIL import Image 

LABELS_URL = 'https://s3.amazonaws.com/outcome-blog/imagenet/labels.json' 

# cat 
IMG_URL1 = 'http://farm2.static.flickr.com/1029/762542019_4f197a0de5.jpg' 

# dog 
IMG_URL2 = 'http://farm3.static.flickr.com/2314/2518519714_98b01968ee.jpg' 

# lion 
IMG_URL3 = 'http://farm1.static.flickr.com/62/218998565_62930f10fc.jpg' 


labels = {int(key):value for (key, value) 
      in requests.get(LABELS_URL).json().items()} 


model = torchvision.models.inception_v3(pretrained=True) 
model.training = False 
model.transform_input = False 



def predict_url_img(url): 
    response = requests.get(url) 
    img_pil = Image.open(io.BytesIO(response.content)) 

    normalize = transforms.Normalize(
     mean=[0.485, 0.456, 0.406], 
     std=[0.229, 0.224, 0.225] 
    ) 
    preprocess = transforms.Compose([ 
     transforms.Scale(256), 
     transforms.CenterCrop(299), 
     transforms.ToTensor(), 
     normalize 
    ]) 

    img_tensor = preprocess(img_pil) 
    img_tensor.unsqueeze_(0) 
    img_variable = Variable(img_tensor) 
    fc_out = model(img_variable) 
    print("prediction:", labels[fc_out.data.numpy().argmax()]) 

predict_url_img(IMG_URL1) 
predict_url_img(IMG_URL2) 
predict_url_img(IMG_URL3) 

:しかし、このモデルは、私が

コードで読み込むすべての画像に対して失敗( '予測:'、U "プランジャー、配管工のヘルパーを")

( '予測:'、u'plasticバッグ ')

(' 予測:」、U "プランジャー、配管工のヘルパー")

答えて

1

モデルを適用する前にmodel.eval()に電話する必要があることが分かりました。バッチの正規化とドロップアウト層のために、モデルは訓練とテストのために異なっています。

+0

ドロップアウト層もそうですが、これらの2つの層はトレーニングとテストのフェーズでは異なる動作をします。[here](http://pytorch.org/docs/master/nn.html#torch.nn.Module.eval) – jdhao

0

私はmodel.eval()行を追加してコードを実行して得た:結果は

('prediction:', u'Egyptian cat') 
('prediction:', u'groenendael') 
('prediction:', u'lion, king of beasts, Panthera leo') 

をしかし、私は前処理を変更した場合(ちょうどあなたのnormalize操作を削除し、PyTorchでインセプションV3のデフォルトの前処理を使用するmodel.transform_input = Trueを設定)わずかに異なる:

('prediction:', u'tiger cat') 
('prediction:', u'Border collie') 
('prediction:', u'lion, king of beasts, Panthera leo') 

私は猫と犬の専門家ではないんだけど、迅速なGoogle検索は、これらの結果は、あなたの入力画像中の猫がに近いと思われる(より正確であることを示唆していますエジプトの猫よりトラ猫、およびボーダーコリー犬はベルジアン・シェパード・ドッグ・グローネンダールだけでなく)より入力にもっと似ています。

古典的な正規化の代わりにinception_v3の既定の前処理(デフォルトの動作はmodel.transform_input = Falseに変更しない限り)を使用する必要がありますが、これに関して明確な回答は見つかりませんでした。

This threadがそれについて議論します。

これは誰かを助けることを望みます。

関連する問題