【Jetson Nano】ImageNetを使った画像分類

前回のエントリーでJetson nanoをセットアップしました。

chigrii.hatenablog.com

次は順番通りに、ImageNetを使った画像分類をやってみます。

ImageNetとは

自然画像の教師ラベル付き画像データベースのこと

www.image-net.org

いわゆる、MNIST(手書き数字のデータセット)の自然画像版という理解です。

チュートリアルでできること

https://github.com/dusty-nv/jetson-inference/blob/master/docs/imagenet-console-2.md

  • ImageNetのモデルに基づいた画像の認識
  • TensorRTImageNetクラスを使って推論を実行

お手軽に画像認識を試すことができるみたい

画像認識のお試し

以前Dockerで環境構築したので、コンテナにログインする

$ cd jetson-inference
$ docker/run.sh

チュートリアルにもあるように、オレンジとストロベリーの画像認識を実行

C++とPython2つでスクリプトが用意されています。デフォルトのニューラルネットワークGoogleNetが使われます。

# 以下Dockerでの操作です
$ cd build/aarch64/bin
$ ./imagenet images/orange_0.jpg images/test/output.jpg  # C++
$ ./imagenet.py images/orange_0.jpg images/test/output.jpg  # Python

出力画像はimages/testフォルダを指定していますが、このフォルダはホスト側のjetson-inference/data/images/testにリンクしているので、簡単にホスト側でも出力画像をチェックすることができます。

f:id:chigrii:20201227230818j:plain
オレンジ認識

動画を処理することもできます。こちらはResNet-18を指定して実行しています。ちょっと時間がかかります。

# Download test video (thanks to jell.yfish.us)
$ wget https://nvidia.box.com/shared/static/tlswont1jnyu3ix2tbf7utaekpzcx4rc.mkv -O jellyfish.mkv

# C++
$ ./imagenet --network=resnet-18 jellyfish.mkv images/test/jellyfish_resnet18.mkv

# Python
$ ./imagenet.py --network=resnet-18 jellyfish.mkv images/test/jellyfish_resnet18.mkv

もちろんJetsonにつなげたカメラからのフレームも処理できます。

カメラを使う場合の引数については以下のドキュメントが参考になります。

https://github.com/dusty-nv/jetson-inference/blob/master/docs/aux-streaming.md

USBカメラだけの場合は/dev/video0を指定します(ラズパイ用カメラなど他のデバイスが接続されている場合はvideo1になっていたりします)

$ ./imagenet v4l2:///dev/video0

v4l2://は省略しても大丈夫です。

f:id:chigrii:20201227231024p:plain
Webカメラ認識

着ていたユニクロのフリースをfur coatやcardiganと認識されてました。

最後に

今回はImageNetのモデルを使った画像認識をテストしてみました。

全然理解できてなくてもコマンド一発でやれちゃいますね。

次はコードを書いて少しづつ中身を理解しながら進めていきたいと思います。