K210で利用できるkmodelを作成する【2020/09版】

 2020/01に書いた記事M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。ではYolo-digit-detectorというものを利用してモデルデータを作成していました。しかし、2020/09現在ではaXeleRateというプロジェクトに変わっているようです。本記事ではaXeleRateを利用してK210で利用できるYolov2のkmodelを作成する手順を紹介します。

 ※ Windowsで説明しているのですが、Linuxで実行した方がトラブルが少なくいいかもしれません。

記事で利用した環境

 以前の記事M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。ではVMWare上で動く仮想環境のUbuntuを利用していましたが、今回はTensorflow-GPUを使うためにWindows10で行っています。ファイルパスの記述が異なりますが基本は変わりません。

 ただし、aXeleRateはWindows10に完全に対応しているわけではないようで、tfliteファイルからkmodelへの変換時に失敗します。その点は注意してください。

Windows10(ホスト環境)

  • CPU:Core i7-4770
  • GPU: NVIDIA Geforce 1650GTX
  • OS: Windows10 Pro(64bit)

aXeleRateを利用できるようにする

①anacondaのインストール

 https://www.anaconda.com/products/individualを開きDownloadボタンを押してAnacondaのインストーラーをダウンロードし実行します。

②anaconda上で仮想環境を作成しactivateする。

 「Anaconda Prompt(anaconda3)」を起動し、下記のようにコマンドを実行します。

conda create -n yolo python=3.7
conda activate yolo

 下記のようにプロンプトに(yolo)と表示されれば環境が切り替わっています。

③aXeleRateのインストール

 作業はAnacondaのyolo環境で行います。

pip install axelerate

④TensorFlow-gpuのインストール(GPUを使わないのであれば不要)

 tensorflow-gpuを利用するためにNVIDIAのCUDAとcuDNNをインストールします。aXeleRate(0.6.0)で使用しているTensorFlowのバージョンは1.15.3なので対応するCUDAは10.0、cuDNNは7.6.0です。新しいバージョンでは動かないので注意してください。

 ※CUDA SDKとcuDNNのダウンロードにはNVIDIA Developerのサイトにユーザー登録が必要です。https://developer.nvidia.com/

(1)CUDA Toolkit 10.0のインストール

  https://developer.nvidia.com/cuda-downloadsを開き下記の画像のリンクから10.0のインストーラーをダウンロードし、インストールします。

(2)cuDNN 7.6.0のダウンロード(cudnn-10.0-windows10-x64-v7.6.0.64.zip)

cuDNNのダウンロード時にNVIDIA Developerへのログインが必要です。

https://developer.nvidia.com/cudnnを開いて下記の手順でCUDA 10.0用のcuDNN 7.6.0をダウンロードします。

(3)cuDNN 7.6.0ファイルの上書き

 cuDNNはZipファイルですので解凍後そのまま「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0」に上書きコピーします。

(4)tensorflow-gpuのインストール

 pipコマンドでtensorflow-gpu(1.15.3)をインストールします。

pip install tensorflow-gpu==1.15.3

⑤aXeleRateをGitHubからcloneする。

 作業フォルダは「D:\Yolo_work」として作業します。(フォルダ名は任意です。)

d:
cd \Yolo_work
git clone https://github.com/AIWintermuteAI/aXeleRate

データの準備

 ディープラーニングの知識が不足しているため、パラメータやサンプル数などは適当に決めています。勉強しますのであくまでも参考値という点はご了承ください。

①画像データ

 画像データはaXeleRateの場合は任意のサイズの画像データが利用できます。スマホで撮影したものでも良いでしょう。ただし、画像サイズが大きいと学習の時間が長くなると思われるので適当なサイズに縮小した方が良いと思います。私は80枚ほど用意してvalidationフォルダは作成しませんでした。

②アノテーション

 学習のための画像データを用意してアノテーション(ラベルを付ける)を行います。

 LabelImgというソフトを利用して行いますが、詳細はこちらの記事複数のオブジェクトを認識できるkmodelファイルを作成するの「データの準備」を参照してください。

③configsのjsonファイルを作成

 D:\Yolo_work\aXeleRate\configsにあるjsonファイルを参考にして自分の設定に変更します。対象の物が1つの場合はperson_detector.json、複数の場合はpascal_20_detector.jsonを書き換えると良いと思います。

 私の場合はperson_detector.jsonを元にして下記のように書き換えました。元のサンプルはLinux用なのでフォルダの指定方法が異なる点に注意してください。

{
        "model":{
            "type":                 "Detector",
            "architecture":         "MobileNet7_5",
            "input_size":           320,
            "anchors":              [0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828],
            "labels":               ["person"],
            "coord_scale" : 		1.0,
            "class_scale" : 		1.0,
            "object_scale" : 		5.0,
            "no_object_scale" : 	1.0
        },
    "weights" : {
        "full":   				"",
        "backend":              "imagenet"
    },
        "train" : {
            "actual_epoch":         70,
            "train_image_folder":   "D:\\Yolo_work\\aXeleRate\\datasets\\iphone_photo\\images",
            "train_annot_folder":   "D:\\Yolo_work\\aXeleRate\\datasets\\iphone_photo\\annotations",
            "train_times":          2,
            "valid_image_folder":   "",
            "valid_annot_folder":   "",
            "valid_times":          4,
            "valid_metric":         "mAP",
            "batch_size":           16,
            "learning_rate":        1e-3,
            "saved_folder":   		"iphone_photo",
            "first_trainable_layer": "",
            "augumentation":				true,
            "is_only_detect" : 		false
        },
        "converter" : {
            "type":   				["k210"]
        }
}

aXeleRateのtrain.pyの実行

 用意したconfigsのjsonファイルを指定して実行します。

d:
cd \Yolo_work\aXeleRate
python axelerate\train.py --config "configs\\person_detector.json"

 ここから学習が始まり時間がかかります。Windowsの場合は最後の段階でエラーが出ます。(nccというtfliteファイルをkmodelに変換するコマンドが無いため)

 下記のフォルダにYOLO_best_mAP.tfliteというファイルが作成されていれば成功しています。(出来ていない場合はエラーメッセージをよく見て対処しましょう。)

 D:\Yolo_work\aXeleRate\projects\<jsonで指定したsaved_folder>\<実行した日付と時間>

tfliteファイルをkmodelに変換

 Windows10だとncc.exeのため、今の段階ではaXeleRateから実行できないようです。https://github.com/kendryte/nncase/releasesからncc_win_x86_64.zipをダウンロードしてD:\Yolo_work\aXeleRateに置いた後下記のようにコマンドを実行します。

※ tfliteとdatasetのフォルダ名は自分自身の環境に合わせて変更してください。

ncc compile "projects\\iphone_photo\\2020-09-12_17-35-58\\YOLO_best_mAP.tflite" test.kmodel -i tflite -o kmodel --dataset "datasets\\iphone_photo\\images"

 これでカレントディレクトリにtest.kmodelが出来上がっていると思います。

【追記】kmodelファイルのバージョンに注意

 その後使っていたところおかしい動きをするので、色々調べました。どうやらkmodelにはv3とv4があり、最新のnncase(ncc.exe)を使うとkmodel v4になります。しかし、MaixPyをYolov2で動かしたときにはkmodel v3でないとダメというエラーが出ることがありました。

 kmodel v3へ変換するためにはnncase 0.1.0 RC5をダウンロードする必要があります。動かない場合はチェックしてみてください。

※ Linuxでは、自動でnccがインストールされkmodel v4に変換されるようです。自分でnncase 0.1.0 RC5をダウンロードしてtfliteからkmodel v3へ変換する必要があります。

 nncase 0.1.0 RC5はオプションの書き方が違うので注意してください。

●Windows用のncc.exe実行コマンド例

ncc.exe -i tflite -o k210model --dataset "datasets\\iphone_photo\\images" "projects\\iphone_photo\\2020-09-12_17-35-58\\YOLO_best_mAP.tflite" test.kmodel

●Linux用のncc実行コマンド例

./ncc -i tflite -o k210model --dataset datasets/iphone_photo/images projects/iphone_photo/2020-09-12_17-35-58/YOLO_best_mAP.tflite test.kmodel

モデルの利用

 出来上がったモデルはkpu.run_yolo2で利用できます。M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。の「M5StickVで動作確認」を参照してboot.pyから呼び出せます。

おわりに

 ネットで調べながら実行していたため間違っている点もあるかと思いますが、もし間違っている点や手順でわからないことがありましたらコメントやTwitterで聞いてください。

 自分でモデルを作成して好きな物を認識できるようにしてみましょう。

更新履歴

  • 2020/9/21 「kmodelファイルのバージョンに注意」を追加
  • 2020/9/12 新規作成

K210で利用できるkmodelを作成する【2020/09版】” に対して5件のコメントがあります。

  1. 匿名 より:

    貴重な記事、ありがとうございます。

    tensorflow-gpu 15.3に対応するcuDNNは7.6ではなく、7.4が正しいかもしれません。
    (間違ってたらすみません)

    https://www.tensorflow.org/install/source_windows#gpu

    1. もんごんた より:

      コメントありがとうございます。

      そこはハマった点でした。。。
      動かないのでエラーを追っていったら実は7.6だったという、、、(;^ω^)

      もしかしたら自分の環境だけかもしれないので、宜しければ環境の詳細を教えてください。

      1. watako より:

        いつもお世話になっております、watakoと申します。
        (昼間はすみません、電車からの投稿で匿名になってしまいました…。)

        そしてごめんなさい、私が間違っているかもしれません。

        先程提示させて頂いた先、およびtensorflow-gpu 1.15.3 + cuDNN7.4の組み合わせにて、mnistがgpuで動いていたので、てっきり行けるもんだと…。

        そしたら、aXeleRateでは以下のエラーがでました…。

        —-
        tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
        (0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
        [[{{node conv1/convolution}}]]
        [[Mean/_1413]]
        (1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
        [[{{node conv1/convolution}}]]
        —-

        cuDNN関連のエラーっぽいので、私もcuDNNを7.6に上げてから、再度試してみようと思います。うまくいきましたら、再度ご報告させて頂きます。

        ちなみに、私は以下の環境で試しております。
        —-
        OS: Ubuntu 18.04.3 LTS
        CPU: Intel Core i5-9400 2.9GHzx6
        GPU: GeForce RTX2070 SUPER
        —-

        どうぞ、よろしくお願い致します。

        1. watako より:

          ご報告です。

          cuDNNを7.6に更新した所、gpu演算にて無事tfliteまで生成されるようになりました。(まだnccでコケますが、こちらは全く別の原因のようなので、別途探ってみます)

          お騒がせ&コメント欄を汚してしまい、申し訳ございません。

          有益な情報をありがとうございました。

          1. もんごんた より:

            いいえ、この分野は日進月歩なのでaXeleRateのバージョンアップによって動かない可能性もあるので助かります。

            これからもよろしくお願いいたします。(‘ω’)

コメントを残す

メールアドレスが公開されることはありません。