2021/08/15

JetsonNanoでmaix-trainしてUnitVで動かすまで

以前UnitV+M5StickCplusでサンプルの顔認識とカメラ映像転送をやってみたが、JetsonNanoでSipeedのmaix-trainが動くか試してみた。

maix-trainは、classifier(mobilenet v1)とdetector(yolo v2)の2つできる。どちらもスクリプトを実行すると、mobilenet_7_5_224_tf_no_top.h5をベースに転移学習たネットワークを作って、h5,tflite,kmodelを一気に作成するスクリプトになっている。
UnitVでclassifierを動かすまでの流れを記載する。

Tensorflow2.xが必要なので前回構築した tensorflow2.5.0+nv21.7 環境で行う
$ . ~/tf2/bin/activate
maix-trainクローン
$ git clone https://github.com/sipeed/maix_train.git
ライブラリの事前インストール
$ cd maix_train
$ pip install -r requirements.txt
$ sudo apt install libgeos-dev
初期化
$ python train.py init
instance/config.pyが作成される。中に色々設定が記述されている。プラットフォームに合わせて編集しろと説明がされているが、そのままトレーニング開始!
classifierの方を実行する。
$ python train.py -t classifier -z datasets/test_classifier_datasets.zip train
約20分で転移学習完了。out/m.tfliteが作成された。ここまでは問題なしだが、肝心のkmodelファイルは作成されません。下がout/train_log.logの最後の部分
2021-08-11 16:16:25,330 - [INFO]:  now generate kmodel
2021-08-11 16:16:25,331 - [INFO]:  save model as .h5 file
2021-08-11 16:16:26,166 - [INFO]:  save model as .tflite file
2021-08-11 16:19:08,334 - [ERROR]:  failed: TrainFailReason.ERROR_INTERNAL, node error:[Errno 2] No such file or directory: '/home/jetson/maix/maix_train/instance/../tools/ncc/ncc_v0.1/ncc': '/home/jetson/maix/maix_train/instance/../tools/ncc/ncc_v0.1/ncc'
最後にnccがないってエラーが出てkmodelはできません。当然ですね。
入れてませんから。。。というかarm64版のnccがないんですよ。

JetsonNanoでnccのビルドに挑戦してみます。。。
下準備(gcc8.xが必要。8が優先されるよう設定)
$ sudo apt install -y gcc-8 g++-8
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 7
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
$ sudo apt install libgtk2.0-dev -y
$ pip install conan
現時点の最新を取得してcmake & make
$ git clone --recursive -b v0.2.0-beta4 https://github.com/kendryte/nncase.git
$ cd nncase
$ mkdir out && cd out
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DNNCASE_TARGET=k210
かなり時間かかる。conan関係のビルドが。。。
そして以下のようなエラーがでる
ERROR: boost/1.71.0@conan/stable: Error in source() method, line 151
        tools.get(url, sha256=sha256)
        AuthenticationException: Forbidden!
bintrayから取得できない(死んでる?)ようなので、URLを変更する。
~/.conan/data/boost/1.71.0/conan/stable/export/conanfile.py 151行目の
url = "https://dl.bintray.com/boostorg/release/%s/source/%s" % (self.version, zip_name)
を以下のように書き換える。
url = "https://boostorg.jfrog.io/artifactory/main/release/%s/source/%s" % (self.version, zip_name)
そして再度
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DNNCASE_TARGET=k210
cmakeは成功したのでビルドしてみる
$ make -j4
だめだー
mutex.cc:(.text+0x12c): undefined reference to `absl::base_internal::SpinLock::SlowUnlock(unsigned int)'
mutex.cc:(.text+0x160): undefined reference to `absl::base_internal::LowLevelAlloc::Alloc(unsigned long)'
mutex.cc:(.text+0x1f4): undefined reference to `absl::base_internal::SpinLock::SlowLock()'
・・・とかどっさりリンクエラー
軽く調べてみると、conanでortools/7.3@sunnycase/testing をrequireしていて、ortoolsがrequireしている abseil/20190619@sunnycase/testing がだめらしい。あちこちでabseilがリンクエラーするという記事が上がっているが、ドンピシャの解決方法が発見できず。conanバージョンを1.21.1にしてみろとか(やってみたがcmakeでエラー)、abseilのリンクライブラリ順番を依存順に変えてみろとか(どこでー?)・・・
これはしばらく様子見です。

仕方ないので、nncaseビルドは諦めて、windows-wsl2環境でkmodel作成
(ここからはwsl2での操作)

V3モデル用 latest
V4モデル用 latest currentry
がありますが、v4モデルはまだ謎が多く。情報が少ない。
自分でも色々やってみたけどまともに動かない。しばらく様子見です。

ということで、V3モデルを作成します。
JetsonNanoで作成した outフォルダごとwsl環境にコピーします。で、
$ ../ncc-0.1.0rc5/ncc -i tflite -o k210model --dataset datasets/ m.tflite m_v3.kmodel
kmodelが約2MBで出来ました。これをflashかsdに書いて、kpu.load()で読んでkpu.forward()する流れです。このとき、立地なファームを使っている場合メモリ不足でロードが失敗したり、ロードは成功するけど、今度はsensorのFB確保時にメモリ不足になったりします。その場合は、 https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master/maixpy_v0.6.2_57_gae955b706 から maixpy_v0.6.2_57_gae955b706_minimum_with_ide_support.bin あたりを使えば大丈夫です。
ただ、このモデルが動いても、0と1しか結果が出ないので面白くはないです・・・

0 件のコメント:

コメントを投稿