ゼファーネットのロゴ

Tkinter と Pyinstaller を使用した深層学習モデルのデプロイ

日付:

概要

機械学習と深層学習モデルは、多くの場合、次のいずれかで作成および実行されます。 Jupyter Notebook またはIDEで。 展開されるモデルはほとんどなく、通常、これらのモデルの展開は Web サイト ベースになる傾向があります。 方法がわからないために、開発者がそれらをスタンドアロン アプリに変換することはめったにありませんか? これらの Windows 実行可能ファイルは、IDE を持っていない人と DL/ML モデルを共有する場合に非常に便利です。

実際には、機械学習と深層学習モデルを Windows アプリケーションに展開するのは非常に簡単です。 悪名高い Tkinter ライブラリを使用して ML および DL モデルに GUI 機能を追加する方法に関するオンライン投稿があります。 しかし、それらのほとんどは IDE を介してモデルを実行するだけで、これらの GUI アプリを Windows アプリケーション (つまり、実行可能ファイル) にデプロイする方法を示していません。 この記事では、さらに一歩進めます。 Pyinstaller を使用して トキンター ライブラリを使用して作成した GUI でディープ ラーニング モデルを変換します。 トキンター 実行可能ファイルに。

このために、私たちは使用します デンスネットを使用して作成された事前トレーニング済みのモデル 畳み込みニューラルネットワーク 画像を分類します。 この DenseNet モデルでは、Tkinter モジュールを使用して UI を作成します。これにより、ユーザーは Tkinter UI を介して画像をアップロードし、予測されたラベルを取得できます。 最後に、この python ファイル全体を Pyinstaller モジュールに変換します。

学習目標

  1. Tkinter フレームワークを使用して深層学習モデルのユーザー インターフェイスを構築するプロセスを理解する。
  2. Densenet などの事前トレーニング済みのモデルをインポートし、imagenet の重みを使用してロードして、新しい写真でのモデルのパフォーマンスを向上させる方法を学びます。
  3. 画像を処理して関数に分類するなど、さまざまなステップを分割する方法を学びます。
  4. Pyinstaller モジュールを利用して、Tkinter アプリケーションとディープ ラーニング モデルを単一の実行可能ファイルにバンドルして配布する方法を理解する。
  5. 深層学習モデルを Windows 実行可能ファイルとして配布し、ユーザー フレンドリーにする方法を学びます。

この記事は、の一部として公開されました データサイエンスブログソン.

目次

  1. 深層学習モデルの構築
  2. モデルのフロントエンドの作成: ユーザー インターフェイス
  3. すべてのまとめ: メイン関数の作成
  4. アプリケーションのパッケージ化: モデルのまとめ
  5. まとめ

深層学習モデルの構築

このセクションでは、DenseNet121 モデルについて説明し、事前トレーニング済みの重みでそれを分割します。 開始するには、TensorFlow と PIL ライブラリがインストールされていることを確認してください。 これらのライブラリは、DenseNet モデルと PIL をダウンロードして、画像をモデルに送信して分類する前に画像を前処理するために必要です。

pip install tensorflow pip install ピロー
深層学習

ソース: commons.wikimedia

以下は、TensorFlow と pillow およびサポート ライブラリをダウンロードして、このセクションを開始します。

ここでは、事前トレーニング済みのモデルを使用しています。 ゼロから構築する必要はありません。 モデルをインポートするだけです。 モデルを再度トレーニングする必要がないように、モデルの重みが DenseNet に提供されていることを確認する必要があります。 これは、次の方法で実現できます。

tensorflow.keras.applications.densenet から DenseNet121 をインポート tensorflow.keras.preprocessing から画像をインポート tensorflow.keras.applications.densenet から画像をインポート preprocess_input、decode_predictions をインポート numpy モデル = DenseNet121(weights='imagenet')

Densenet モデルを使用するには、最初に tensorflow.keras.applications モジュールからモデルをインポートし、次に「imagenet」で変数の重みを割り当てることによってモデルの事前トレーニング済みの重みを読み込みます。

数百万の写真と数千のエンティティ タイプを含む大規模な画像データセットである ImageNet データセットは、ディープ ラーニング モデルの開発とテストによく使用されます。 DenseNet モデルは、ImageNet でトレーニングおよびテストされました。

画像モジュールは TensorFlow からインポートされ、特定のファイル パスから画像を読み込んでピクセルの配列に変換するのに役立ちます。 の 前処理_入力() 分類するためにモデルに送信する前に、densenet のメソッドを使用して画像配列を前処理します。 同時に、 デコード予測() メソッドは、モデルの出力を人間が読めるクラスにデコードするために使用されます。 DenseNet は、1000 クラスを予測するようにトレーニングされています。 したがって、これ デコード予測() メソッドは、出力をこれらのクラスの 121 つにマップします。 DenseNet1,224,224,3 モデルの入力形状は (XNUMX) です。

これらのモジュールの使用方法をよりよく理解するために、犬の画像をモデルに渡して予測できるようにしましょう。

img_path = 'dog.jpg' img = image.load_img(img_path, target_size=(224, 224)) img_array = image.img_to_array(img)
img_expanded = np.expand_dims(img_array, axis=0)
img_processed = preprocess_input(img_expanded) preds = model.predict(img_processed) 結果 = decode_predictions(preds, top=1)[0]

load_img() メソッドを使用して、指定したパスから画像を Python にロードする方法を確認できます。 次のステップでは、画像をピクセルの配列に変換します。 これで画像のサイズは (224, 224, 3) になりました。 ディープ ラーニング モデルは、画像のバッチで入力を受け取ります。 したがって、この画像配列を単一の画像配列のバッチに変換する必要があります。 これは、画像配列のサイズを (224,224,3) から (1,224,224,3) に変換する NumPy ライブラリの expand_dims() メソッドを使用して行われます。

最後に、入力画像配列を前処理し、予測のためにモデルに渡します。 モデルから返される出力は、確率であるスコアです。 (確率) 1000 クラスの。 確率が最も高いラベルのみが必要なためです。 スコア、使用します デコード予測() これを行う方法。

ここでは事前トレーニング済みのモデルを使用しているため、これらの方法を使用しています。 モデルを最初から作成する場合は、上で説明した手順の代わりに、使用した適切な前処理手順を使用できます。

ここで、モデルの UI を作成します。 このセクションでは、シンプルな UI を作成して、ユーザーがそれを操作し、予測用の画像パスを提供できるようにします。 このためには、まず、ダウンロードする必要があります トキンター ライブラリにあり、pip コマンドを使用してこれを行うことができます。

ピップインストールtk

これにより、Tkinter ライブラリがインストールされ、UI の作成を開始できるようになりました。 次のコードを見て、単純な UI を作成しましょう。

tkinterをインポートする

app = tkinter.Tk() app.geometry("250x325") app.title("画像分類子") アップロード = tkinter.Button(text="アップロード") upload.place(relx=0.5, rely=0.5, anchor= 'センター') app.mainloop()

これにより、アップロードという名前のボタンを含む最小限の UI が作成され、ウィンドウの中央に保持されます。 アプリのタイトルは「画像分類子」、UIサイズは250×325となります。 コードの出力は、次のように推測できます。

深い学習

アプリケーションの基本 UI

[アップロード] ボタンをクリックしても何も起こりません。 ここでは、ユーザーがアップロード ボタンを操作するときに、ユーザーが画像パスを選択できるようにする機能を追加する必要があります。

このために、Tkinter ライブラリの filedialog モジュールを使用します。 このモジュールを使用すると、ユーザーはアップロード ボタンを操作するたびにファイル パスを開くことができます。 これは、次のようにコードに実装できます。

def getImage(): パス = filedialog.askopenfilename() リターン パス upload_button = tkinter.Button(text="アップロード",command=getImage)

ここでは、Tkinter から fieldsdialog をインポートし、そのメソッドの XNUMX つを使用しました。 askopenfilename()。 この askopenfilename() メソッドを使用すると、Tkinter アプリケーションでファイル エクスプローラーを開くことができ、ユーザーはそこから画像を選択できるようになります。 ユーザーが画像を選択すると、画像のパスがパス変数に保存されます。

これをすべて機能させるには、 getImage() ユーザーが [アップロード] ボタンをクリックするとウィンドウが開くように、関数をコマンドのようにアップロードに渡す必要があります。 ユーザーは画像に移動できるようになり、それぞれの画像パスがパス変数に渡されます。

次のステップでは、画像パスを受け取り、前処理画像配列を出力に返す関数を作成します。 関数は次のようになります。

def preprocess(path): img = image.load_img(path, target_size=(224, 224)) img_array = image.img_to_array(img) img_expanded = numpy.expand_dims(img_array, axis=0) img_processed = preprocess_input(img_expanded) return img_processed

関数 前処理() ファイル パスを取得し、 ロード_img() メソッドを実行し、同時に (224, 224, 3) の形状にサイズ変更します。ここで、3 は、R、G、B にそれぞれ 3 つずつ、XNUMX つの次元 (次元) を示します。次に、配列に変換されます。ピクセルの。

今、 Expand_dims() 画像配列によって、より高いdim(次元)に拡張されます。 画像配列の形状は (224, 224, 3) から (1, 224, 224, 3) になります。これは、すべての深層学習モデルが画像のバッチで入力を受け取ることがわかっているためです。 ここでは基本的にバッチを作成していますが、画像は XNUMX つだけです。

最後に、 前処理_入力() 処理された画像配列を返します。

これに続いて、別の関数を作成します。この関数は、この処理された画像配列を受け取り、それを予測のためにモデルに渡し、出力を返します。

def classify(processed_img): preds = model.predict(processed_img) results = decode_predictions(preds, top=1)[0] 結果を返す

次の関数、 分類する() 処理された画像配列を受け取り、予測関数に渡します。 結果である確率の配列は、変数 preds に格納されます。 次に、確率が最も高いクラス。 (確率) スコアが取得され、 デコード予測() この関数は、それぞれのラベルと確率を含む配列を出力します。 最高確率のスコア。 クラス。

すべてのまとめ - メイン関数の作成

この記事では、ファイル パスの生成から結果の取得、UI への表示まで、これら XNUMX つの関数を XNUMX つずつ呼び出す main 関数を定義する必要があります。

def image_prediction(): path = getImage() input_img = preprocess(path) 結果 = classify(input_img) result_label.config(text="") result_label.config(text=results[0][1] + ": " + str (結果[0][2]) )
upload_button = tkinter.Button(text="アップロード", command=image_prediction) upload_button.place(relx=0.5, rely=0.5, anchor='center') result_label = tkinter.Label(text="")

主な機能 画像予測() [アップロード] ボタンへのコマンドです。 ユーザーがアップロード ボタンをクリックすると、 画像予測() 関数が呼び出されます。 この関数が呼び出されると、 getImage() 関数が呼び出され、この関数は [アップロード] ボタンが押されたときにウィンドウを開き、ユーザーが画像を選択できるようにします。

次に、ユーザーが画像を選択すると、パスが画像パスと共に保存されます。 次に、このイメージ パスは、 前処理() 画像を前処理し、最後に後処理する関数 分類する() 関数、出力ラベルを取得します。

ここでは、という変数を作成しました。 結果ラベル. この関数を使用して、出力ラベルを表示します。 これを行うには、 config() 関数を呼び出して、表示したいテキストを送信します。 ラベルを表示する前に、これより前に出力が表示されないようにしたいので、空の文字列を config() 方法。 最後に、予測スコアが最も高いラベルを渡します。

この記事のコード全体は、次の場所にあります。

numpy をインポートする tkinter から tkinter をインポートする tensorflow.keras.applications.densenet から filedialog をインポートする tensorflow.keras.preprocessing から DenseNet121 をインポートする tensorflow.keras.applications.densenet から画像をインポートする インポート preprocess_input,decode_predictions モデル = DenseNet121(weights='imagenet') app = tkinter.Tk() app.geometry("250x325") app.title("画像分類子") def getImage(): path = filedialog.askopenfilename() return path def preprocess(path): img = image.load_img(path, target_size=(224, 224)) img_array = image.img_to_array(img) img_expanded = numpy.expand_dims(img_array, axis=0) img_processed = preprocess_input(img_expanded) return img_processed def classify(processed_img): preds = model.predict(processed_img) results = decode_predictions(preds, top=5)[0] 結果を返す def image_prediction(): path = getImage() input_img = preprocess(path) results = classify(input_img) result_label.config(text="") result_label.config( text=results[0][1] + ": " + str(results[0][2])) upload_butt on = tkinter.Button(text="アップロード", command=image_prediction) upload_button.place(relx=0.5, rely=0.5, anchor='center') result_label = tkinter.Label(text="") result_label.place(relx =0.5, rely=0.6, anchor='center') app.mainloop()

アプリケーションのパッケージ化: モデルのまとめ

最後に、画像を送信してその画像の予測を取得できるモデルと UI の作成が完了しました。 このセクションでは、このスクリプト全体をパッケージ化してアプリケーションにする方法について説明します。 このセクションの終わりまでに、Python スクリプトを実行可能ファイルに変換する方法を学習できるようになります。

最初に行う必要があるのは、pyinstaller モジュールがインストールされていることを確認することです。 まだ行っていない場合は、pip コマンドを使用して実行できます。

pip インストール pyinstaller

これにより、PyInstaller ライブラリがインストールされます。 Python コード ファイルを実行可能ファイルに変換するには、CMD を開き、このファイルを書き込んだフォルダーに移動する必要があります。 次に、次のコマンドを入力する必要があります。

pyinstaller --onefile classifier.py

私のpythonコードはclassifier.pyという名前のファイルの下に書かれているので、上記のコマンドでそれを使用しました。 –onefile コマンドを使用せずに pyinstaller を実行することもできます。 しかし、–onefile コマンドが行うことは、スクリプトを単一の実行可能ファイルに作成することです。 同時に、-onefile を指定せずに pyinstaller を呼び出すと、実行可能ファイルが他のファイルと共に作成されます。

コマンド実行後にパーツを終了

上記では、最後に、exe が正常に完了したことを示していることがわかります。 dist と build の XNUMX つのフォルダーが作成され、.spec ファイルが作成されます。 モデルの実行可能ファイルは、dist フォルダーにあります。

アプリケーションを実行してテストしましょう。

深い学習

最終的なアプリケーションのテスト

上の画像は、アプリケーションの実行を示しています。 ゴールデンレトリバーの画像が分類子に渡され、アプリケーションが正しく分類して、予測スコアとともにラベルを返します。

まとめ

要約すると、ディープ ラーニング プロジェクトを Windows アプリに変換するのは多忙なプロセスですが、適切なアプローチとツールを使用すれば達成可能です。 この投稿では、PyInstaller および Tkinter パッケージを使用して、ディープ ラーニング モデルをスタンドアロンの実行可能ファイルに構築する方法について説明しました。 Tkinter を使用してアプリケーションを開発し、事前トレーニング済みの Densenet モデルをアプリケーションに追加し、PyInstaller を使用してコードをパッケージ化する方法について説明しました。

以下は、記事からの重要なポイントです。

  1. Tkinter を使用して、ユーザーが写真をアップロードして画像予測を受け取ることができるアプリケーションの UI を開発できます。
  2. Pyinstaller は、Tkinter アプリケーションとディープ ラーニング モデルを一緒にパッケージ化できるようにするライブラリです。
  3. これらの実行可能ファイルは、他のユーザーと簡単に共有できます。

全体として、この投稿では、深層学習プロジェクトを実行可能ファイルに展開するための実用的なアプローチを紹介しました。これにより、開発者はモデルをより多くの聴衆と簡単に共有し、ユーザーはモデルの機能を利用できるようになります。

 この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。

スポット画像

最新のインテリジェンス

スポット画像