【Jetson Xavier NX レビュー(3)】学習モデル作成編 コードを書かずにマスクの装着を判定するAIを自作してみた

発売以来、話題になっている高性能ミドルレンジのAIコンピュータボード「NVIDIA Jetson Xavier NX」のレビュー 第3回目をお届けします。最終回となる今回は「アプリ開発/学習モデル作成」編ということで、実際に「Jetson Xavier NX 開発者キット」を使って、実践的なAIシステムの開発をしてみたいと思います。

第1回はセットアップとデモセットの実行、第2回はベンチマークを中心に解説してきました。お見逃しの方は下記のリンクから読んでくださいね!

【Jetson Xavier NX レビュー(1)】
高性能なミドルレンジモデルのAIコンピュータボード 開封の儀&デモ詳細 BERTにも挑戦

https://robotstart.info/2020/05/15/jetson-xavier-nx-review-01.html


【Jetson Xavier NX レビュー(2)】
ベンチマーク編 AIエッジコンピュータボード「Jetson」3機種のコストパフォーマンスを比較

https://robotstart.info/2020/05/21/jetson-xavier-nx-review-02.html


カメラ画像でマスクの装着をAI判定

せっかくアプリ開発のレビューをするなら実践的なユースケースを想定したものが良いですよね。と、いうわけで、今回はカメラ画像に写った人物がマスクをしているのかどうか、AIが判定するアプリを開発してみたいと思います。

いままで、Jetsonシリーズを含め、AIエッジデバイスを導入しても、稼働するまでなかなかたどり着けなかったというユーザも多いのではないでしょうか。その一因はおそらく自身で学習モデルを作成できなかったため、自分のビジネス用に合わせたり、AIを学習させるのが難しくてあきらめてしまったケースもあるでしょう。

今回はより実践に即した使い方ということで、コードは書かずにユーザが1から学習モデルを作成するところから行います。学習させたモデルを使って人の検知をWebカメラで行い、マスクしていないかの判定にクラウドなどを使わずにJetson Xavier NX単体で動くものを作成します!
今回プログラミング言語は使いませんが、前提条件としてLinuxのコマンドを使うスキルを有してる人をターゲットに説明を進めていきます。


必要な機材類

・「NVIDIA Jetson Xavier NX 開発者キット」X 1
・「USB接続可能なWebカメラ」 X 1
・「USBキーボード」「マウス」

ラズパイ用などのCSIカメラでもよいですが、今回は手元にあったロジクールのWebカメラを利用しました。

今回使用する機材

「NVIDIA Jetson Xavier NX 開発者キット」(赤枠)にUSBキーボード、マウス、ディスプレイ、カメラ等を接続します。「NVIDIA Jetson Xavier NX 開発者キット」の両側にあるのはJetson NanoとJetson AGX Xavierです(置いてあるだけ)。私の環境では写真内に切り替え器が2基接続されています


事前準備

Jetson Xavier NXは、現状の最新JetPack4.4 Developer Previewをセットアップし、NVIDIAがJetsonユーザ用に用意した「HELLO AI WORLD」のサイトにアクセスして、「Building the Project from Source」を完了させる必要があります。

HELLO AI WORLD NVIDIA JETSON
https://github.com/dusty-nv/jetson-inference



「HELLO AI WORLD」の画面。段階的にJetsonの機械学習のデモを動かしながら学べるサイト

英文サイトですが英語が苦手な方はchromiumブラウザにはgoogle先生の翻訳機能がありますので、そちらを見ると良いでしょう。ただし、コマンド等は誤変換されていたり余計なスペースが入ったりするので原文も見ながら確認してください。
ありがたいことにクイックリファレンスコマンドがあるので、基本的にはctrl + alt + Tキーでターミナルを開いたらこれを順番に入力していけばいいだけです。コンテンツのした部分は各コマンドの解説です。

プロジェクトのビルドはこのコマンドを順番に入れていくだけ

最後の行まで完了すると今回の作成するために必要な準備ができているはずです。
完了していれば~/jetson-inference/build/aarch64に、bin, include, libの3つのフォルダができていると思います。

HELLO AI WORLD の中ではImageNet, DetectNet, SegNetなどの体験ステップがあります。ステップ通り試していただくとより理解が深まると思いますが、過去記事でHELLO AI WORLDを紹介した記事があるのでこちらも参考にしてみてください。

今回は学習モデルの自作ということで、「Transfer Learning with Pytorch」の章の「Collecting your own Datasets」を使ってマスクの着用有無の学習モデルを作ってみようと思います。




AI学習モデルの自作

では学習モデルの準備をするのですが、作業のステップとしては「Collecting your own Datasets」に沿って学習モデルの作成を進めていきます。

大まかな流れとしては、
1. 画像データの収集
2. 画像データをトレーニングして、学習済モデルを作成
3. プログラムでの実行
になります。


画像データの収集

まずは「Jetson Xavier NX」にUSBカメラを接続しておいてください。学習用の画像データセットを置くフォルダ構成ですが、最終的には以下のような感じなります。

今回作成するデータセットの最終的なフォルダ構成

「Collecting your own Datasets」と同じ手順で進めていきます。まずは「labels.txt」を格納するフォルダを作成します。今回は「muskman」というフォルダにしました。
Labels.txtの中身はこんな感じで、「musked」「unmusked」と書いた2行のテキストファイルになります。

labels.txtの中身

次に撮影に入りますが、撮影用のプログラムがすでに用意されています。
ターミナルを起動し、「cd ~/jetson-inference/build/aarch64/bin」で、フォルダを移動したら
「$camera-capture –width=640 –height=480 –camera=/dev/video0」
と入力し、エンターを押すとUSBカメラから入力されたフレームが表示されます。

camera-capture起動時の様子

データサイズが大きくなりすぎないようにVGA(640X480)サイズでカメラ設定しているのと、USBカメラの接続先は1台だけなら/dev/video0が接続先になるので、そこがHELLO AI WORLDのコンテンツとの差異になります。
Data Capture ControlというウインドウにDataset PathとClass Labelsのフィールドにすれぞれ~/datasets/muskmanとlabels.txtを選択すると、Current SetとCurrent Classを切り替えながらスペースキーを押していくとjpeg画像が保存されていきます。

Data Capture Controlウインドウの画面

これを使ってtrainフォルダに各2000枚、valフォルダに各1000枚、testフォルダに各200枚、合計6400枚の自撮りをすることになります。普段自撮りなどしない筆者はここが一番の苦行でした。(笑)

撮影済のトレーニング用ファイル。角度を変えたりしながらとにかく撮り続ける。




撮影データのトレーニング

撮影が終わったら次はトレーニングです。
サイトの「Training Your Model」の手順通り進めていけばよいのですが、注意点が2つ。

1つ目はpythonの「training.py」実行後、および「onnx_export.py」実行後に「segmentation fault」が発生してプログラムが正常終了できなかったように見えますが、出力データは作成されていますので問題ありません。筆者はここで3日つまずきました。

2つ目はトレーニングの「エポック数」です。train.pyのデフォルトだと35epochsですが、それだと精度がかなり甘いので筆者はコマンドオプションに—epochs=50として50epochsで実行しました。
onnxのexportまで完了したらトレーニングデータの作成は完了です。

~classification/以下にmuskmanフォルダが作成されており、checkpoint.pth.tar, model_best.pth.tar, resnet18.onnxの3つのファイルがあると思います。


プログラムの実行

それではお待ちかね、AIを使ったマスクの認識実験をしたいと思います。
「Collecting your own Datasets」の最後にimagenet-camera(C++版), imagenet-camera.py(python版)の実行方法が書いてありますので、それに従い起動します。その際resnet18.onnxのパスとlabels.txtのパスをしていする必要があるので注意してください。
うまく指定できればカメラのキャプチャ画像が表示され、左上にAIが推論した確度のパーセンテージがリアルタイム表示されています。

マスク着用時。左上に92.81%と表示されている。

マスク非着用時。左上に87.70%と表示されている。

これで自作学習モデルの完成です!お疲れ様でした!


まとめ

今回はコードを書かずに自作の学習モデルを使ってマスクの着用・非着用の判定をAIで行ってみましたが、いかがでしたでしょうか?NVIDIAのTensorRTやgstreamerなどのライブラリ群を利用してるのでリアルタイム性はかなり良いと思います。

AI搭載型カメラというと100万円近くするものも少なくないと思いますが、Jetson Xavier NX開発キット+市販のWebカメラで、自分で学習モデルを作成できればこんな感じで活用できます。あとは個別開発で判定時にアラームを鳴らしたり、画像を保存してメール通知したり、応用例は多数あると思います。

自分ではちょっと作成が難しいという場合は、弊社(Forex Robotics株式会社)にお問い合わせいただければ個別開発のご相談には乗れると思います!

Forex Robotics株式会社 お問い合わせ
http://forexrobotics.jp/contact.html

ABOUT THE AUTHOR / 

高橋一行

Forex Robotics株式会社 代表取締役。AI、機械学習、ロボット、IoTなどのシステム開発を行いながら、コミュニティ活動やLTにも精力的に活動。 参加コミュニティ: 「ソフトバンクロボティクス公認コミュニティーリーダー」「 Creator's NIGHT eXtreme」 2020年のロボット業界を考える飲み会 共同主催 他

PR

連載・コラム