2017-06-02 21 views
-3

私はちょうどpythonについて学び始めます。以下のコードを実行すると、エラーが発生します。これは、その トレースバック(最新の呼び出しの最後)伝えます: ファイル "predict_1.py"、ライン87、 の主は、(sys.argvの[1]) はIndexError:範囲sys.argv [1])IndexError:範囲外のリストインデックス

のうちリストインデックスすべてのヘルプは大であります感謝。読んでいただきありがとうございます!

#import modules 
import sys 
import tensorflow as tf 
from PIL import Image,ImageFilter 

def predictint(imvalue): 
    """ 
    This function returns the predicted integer. 
    The imput is the pixel values from the imageprepare() function. 
    """ 

    # Define the model (same as when creating the model file) 
    x = tf.placeholder(tf.float32, [None, 784]) 
    W = tf.Variable(tf.zeros([784, 10])) 
    b = tf.Variable(tf.zeros([10])) 
    y = tf.nn.softmax(tf.matmul(x, W) + b) 

    init_op = tf.initialize_all_variables() 
    saver = tf.train.Saver() 

    """ 
    Load the model.ckpt file 
    file is stored in the same directory as this python script is started 
    Use the model to predict the integer. Integer is returend as list. 

    Based on the documentatoin at 
    https://www.tensorflow.org/versions/master/how_tos/variables/index.html 
    """ 
    with tf.Session() as sess: 
     sess.run(init_op) 
     new_saver = tf.train.import_meta_graph('model.ckpt.meta') 
    new_saver.restore(sess, "model.ckpt") 
     #print ("Model restored.") 

     prediction=tf.argmax(y,1) 
     return prediction.eval(feed_dict={x: [imvalue]}, session=sess) 


def imageprepare(argv): 
    """ 
    This function returns the pixel values. 
    The imput is a png file location. 
    """ 
    im = Image.open(argv).convert('L') 
    width = float(im.size[0]) 
    height = float(im.size[1]) 
    newImage = Image.new('L', (28, 28), (255)) #creates white canvas of 28x28 pixels 

    if width > height: #check which dimension is bigger 
     #Width is bigger. Width becomes 20 pixels. 
     nheight = int(round((20.0/width*height),0)) #resize height according to ratio width 
     if (nheigth == 0): #rare case but minimum is 1 pixel 
      nheigth = 1 
     # resize and sharpen 
     img = im.resize((20,nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN) 
     wtop = int(round(((28 - nheight)/2),0)) #caculate horizontal pozition 
     newImage.paste(img, (4, wtop)) #paste resized image on white canvas 
    else: 
     #Height is bigger. Heigth becomes 20 pixels. 
     nwidth = int(round((20.0/height*width),0)) #resize width according to ratio height 
     if (nwidth == 0): #rare case but minimum is 1 pixel 
      nwidth = 1 
     # resize and sharpen 
     img = im.resize((nwidth,20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN) 
     wleft = int(round(((28 - nwidth)/2),0)) #caculate vertical pozition 
     newImage.paste(img, (wleft, 4)) #paste resized image on white canvas 

    #newImage.save("sample.png") 

    tv = list(newImage.getdata()) #get pixel values 

    #normalize pixels to 0 and 1. 0 is pure white, 1 is pure black. 
    tva = [ (255-x)*1.0/255.0 for x in tv] 
    return tva 
    #print(tva) 

def main(argv): 
    """ 
    Main function. 
    """ 
    imvalue = imageprepare(argv) 
    predint = predictint(imvalue) 
    print (predint[0]) #first value in list 

    if __name__ == "__main__": 
    main(sys.argv[1]) 
+2

いいえ、_this_コードはインデントエラーを出力します。 Pythonコードを投稿するときは、インデントを正確に再現する必要があります。ひどくインデントされたPythonコードはナンセンスです。 – khelwood

+1

[ask]を読んで[mcve]を提供しようとしています - あなたのコードには字下げの問題があります。 –

+0

そのコードをすべて見る必要があるのはなぜですか?そのほとんどはこのエラーとは無関係です。スクリプトをどのように実行しましたか?コマンドラインに適切な 'imageprepare'引数文字列を指定しましたか? –

答えて

0

あなたは、あなたが常にリストの境界を確認する必要がありますORキャッチするためにインデックスでリスト内の項目にアクセスする前に、

predict_1.py path_to_your_file 
0

まずようにそれを呼び出すすなわち、スクリプトに引数を提供する必要があります例外であり、「範囲外」(ケースではIndexError)のケースを処理します。

第2に、より良いのは​​モジュールの使用を開始することです。また、より簡単なgetoptモジュールがあります。WebやPythonの標準ドキュメントなど、多くの例があります。これらは、UNIXツールのようなより便利なコマンドライン引数をスクリプトに持たせることができます(オプション、等)、等)。

関連する問題