この記事では、NXP i.MX8MP 内蔵プラットフォームで MobileNetV3 モデルをポートして実行する方法を説明し、手書きのデジタル認識機能を達成します。データセットのインポート、モデルトレーニングおよび検証から、TensorFlow Lite の量子化およびデプロイに至るまで、eIQ Portal ツールの使用プロセスを完全に示しています。このケースを通じて、読者は、産業クラスの ARM プラットフォーム上で軽量の深層学習モデルのエッジ・インベレンスを実装する方法をすぐに学ぶことができます。 データセットの輸入 モデルをトレーニングする前に、まずデータセットを準備する必要があります。データセットを持っていない場合は、直接「データセットをインポート」をクリックして、ツールで提供されているデータセットを選択できます。 (あなたが独自のデータセットを持っている場合は、直接インポートするために「空白プロジェクトを作成」をクリックすることができます)。 このドキュメントでは、ツールが提供するデータセットを使用します。TensorFlowからデータセットをロードするには、以下の通り、ツールを使用します。 左上隅のドロップダウンメニューから提供されたデータセットを選択できます これらはTensorFlowで一般的に使用されるすべてのデータセットです。 MNIST データセットには、トレーニングセットとして 60,000 個の手書き数字と、検証セットとして 10,000 個の手書き数字が含まれています。 cifar10: It contains color images of 10 classes, with 50,000 images as the training set and 10,000 images as the validation set. horses_or_humans: horses_or_humans: It has 2 classes, humans and horses. There are 1,027 images of humans and 1,027 images of horses respectively. tf_flowers: It has 5 classes, with a total of 3,670 images of all kinds of flowers. また、タスクの種類を表す「問題型」ドロップダウンメニューがあります。下に示すように、このバージョンのツールは、2種類のみを提供します、一つは画像分類、もう一つはオブジェクト検出です。オブジェクト検出タスクには、1つのデータセット、ココ2017のみがあります。このデータセットは、トレーニングセットとして118287の画像、検証セットとして5000の画像、テストセットとして20288の画像を検出することができます。 データセットを選択した後、「IMPORT」ボタンをクリックし、保存ディレクトリを選択し、輸入を待つ。 Save Directory を選択します。 データセットがインポートされるのを待つ。 インポートが完了すると、 mnist データセットを表示できます。左側は各画像の数と画像ラベルを表示します。右側はデータセット内の各画像を表示します。 トレーニングモデル データセットをインポートした後、次のステップはモデルを選択することです. 以下の通り、図の「SELECT MODEL」ボタンをクリックします。 モデルを選択するインターフェイスは以下の通りです このインターフェイスでは、左に3つの異なるオプションが表示され、その機能は次のとおりです。 RESTORE MODEL: 最後に使用したモデルをロードします。 ベースモデル:提供されたベースモデルを選択します。 ユーザーモデル:作成したモデルを選択します。 右側には、分類モデル、画像分割モデル、オブジェクト検出モデルなどの異なる機能を持つモデルが表示されます。 この論文はeIQ Portalが提供するベースモデルを使用していますので、以下の図に示すように「BASE MODEL」を選択します。 下の図は、このツールが提供するいくつかのベースモデルを示しています。この論文は、mobilenet_v3 モデルを使用しています。異なるモデルの構造は、最初のページの「MODEL TOOL」を参照できます。 モデルを選択した後、モデルトレーニング段階に入ります。そのインターフェイスは以下の通りです。左側は、学習率、バッチサイズ、時代等を含むトレーニングプロセス中に調整されるパラメータを表示します。必要に応じて調整することができます。右側は、トレーニングプロセス中の正確性と損失値などの関連情報を表示することができます。 このトレーニングのパラメータは、以下の通りです。選択後、「トレーニング開始」をクリックします。 トレーニングプロセスは以下の通りです。右側のモデルの正確さと損失値は直感的に見ることができます。 モデルトレーニングが完了すると、以下の図に示すように、ステップの情報を表示するために異なる範囲を設定できます。 認証モデル モデルトレーニングが完了すると、モデルを検証する必要があります。「VALIDATE」を選択してモデル検証段階に入ります。 モデル検証インターフェイスでは、Softmax Thresholdといくつかの量子化パラメータを含む検証パラメータも設定する必要があります。 この資料で設定されたパラメータは以下の通りです。設定後、以下の通り「Validate」をクリックします。 検証が完了すると、モデルの混乱マトリックスと正確性が、以下の通りインターフェイスに表示されます。 モデル変換 モデルトレーニングと検証が完了した後、OKMX8MPでモデルを実行するには、モデルを.tflite 形式のファイルに変換する必要があります。したがって、モデルを変換する必要があります。「DEPLOY」をクリックして変換インターフェイスを入力します。 この論文では、輸出形式はTensorFlow Lite形式です。同時に、軽量な目的のために、入力と出力のデータタイプはint8に設定されています。 パラメータを設定した後、「EXPORT MODEL」を選択して.tflite 形式でモデルをエクスポートし、その後、この形式のモデルを i.MX8MP にポートします。 予測モデル モデル予測の前に、次のファイルを準備する必要があります。 Mobilen_v3.tflite ファイル 手書きの数字画像ファイルが予測されます。 The Python script file for loading the model and image pre - processing. モデルと画像のプレプロセッサをロードするためのPythonスクリプトファイル。 データセットからいくつかの手書きデジタル画像ファイルを選択したり、手書きで書き込み、その後28x28黒 - 背景白 - 文字画像に変換することができます。この論文は次の30の画像を予測のために使用し、「group number_label」の形で名前を付けます。 Python スクリプトを書く: import numpy as np from PIL import Image import tflite_runtime.interpreter as tflite ~~~~~~~~~~~~~~ MODEL_PATH = "/home/root/mobilenet_v3.tflite" IMAGE_PATHS = [ "/home/root/1_0.jpg", ''/home/root/1_1.jpg", "/home/root/1_2.jpg", "/home/root/1_3.jpg", ''/home/root/1_4.jpg", "/home/root/1_5.jpg", ''/home/root/1_6.jpg", "/home/root/1_7.jpg", "/home/root/1_8.jpg", "/home/root/1_9.jpg", "/home/root/2_0.jpg", ''/home/root/2_1.jpg", "/home/root/2_2.jpg", "/home/root/2_3.jpg", ''/home/root/2_4.jpg", "/home/root/2_5.jpg", ''/home/root/2_6.jpg", "/home/root/2_7.jpg", "/home/root/2_8.jpg", "/home/root/2_9.jpg", "/home/root/3_0.jpg", ''/home/root/3_1.jpg", "/home/root/3_2.jpg", "/home/root/3_3.jpg", ''/home/root/3_4.jpg", "/home/root/3_5.jpg", ''/home/root/3_6.jpg", "/home/root/3_7.jpg", "/home/root/3_8.jpg", "/home/root/3_9.jpg", ] モデルをダウンロードする -------- タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : タグ : 入力情報モデル input_shape = input_details[0]['shape'] # [1, H, W, C] 高度、幅、チャンネル = input_shape[1], input_shape[2], input_shape[3] input_dtype = input_details[0]['dtype'] # np.float32 あるいは np.int8 量子化パラメータ(If int8) スケール, zero_point = input_details[0]['quantization']` ~~~~~~~~~~~~~~ for img_path in IMAGE_PATHS: # Open the picture and turn to RGB (3 channels) img = Image.open(img_path).convert('RGB') img = img.resize((width, height)) # Convert to numpy array img_array = np.array(img, dtype=np.float32) # If the training data is black on a white background, it can be reversed #img_array = 255 - img_array # Normalized to 0 ~ 1 img_array = img_array / 255.0 # Adjust the shape to [1, H, W, 3] img_array = img_array.reshape(1, height, width, channels) # If the model is a quantized int8, then transform if input_dtype == np.int8: img_array = img_array / scale + zero_point img_array = np.round(img_array).astype(np.int8) # Set the input interpreter.set_tensor(input_details[0]['index'], img_array) # reasoning interpreter.invoke() # Get output output_data = interpreter.get_tensor(output_details[0]['index']) predicted_label = np.argmax(output_data) print(f''picture{img_path} prediction {predicted_label}") 以下の図に示すように、3 つのファイルを i.MX8MP にコピーします。 次のコマンドを入力して予測を行います。 python3 demo.py 出力結果は以下の通りです。 出力結果によると、3_9.jpgの画像ラベルが9で、モデルは7を予測し、他のすべての画像が正常であることが予測される。 予測結果に基づき、今回トレーニングされたモデルは高精度で、i.MX8MPに移植した場合でも順調に動作していることがわかります。