JetsonNano評価その1
JetsonNanoのセットアップ手順
https://developer.nvidia.com/embedded/jetpack
フラットケーブルのラズパイカメラが使えると情報はあるものの、
V1(1~2K\)はダメです。V2以降(4K\~)でないと認識しない(USBカメラは使える)
画像処理ソフトウェアの導入とデモ
Jetson Nano2GBの高性能をアピールするデモのようです。
Imagenetのデモプログラム
Detectnetのデモプログラム
動画物体検出
USBカメラ(/dev/video0)を接続して/jetson-inference/build/aarch64/bin/で動画から物体(犬)のリアルタイム検出を行ってみました。(YOLOに類似したソフトウェア)
>xxx/jetson-inference/build/aarch64/bin$ ./detectnet-camera
–-camera=/dev/video0 リターン
3~5分待つとライブ画面が現れます。(12fpsくらいで)画面では、犬と
認識した物体に背景色が付いて表示されます。
開発用ソフトウェアの導入(Python環境)
Jetson Nano2GB ディベロッパーキットの内容は、ラズパイと異なり、
Python環境やNode-REDの環境は設定されていません。
Python環境であるPycharmとNode-REDの導入を行いました。
(Python環境設定)
PyCharm(JetBrain社) Linux/Community版を選びDLする。Desktopに展開。
>sudo apt-get install openjdk-11-jdkリターン
>XXX>Desktop/pycharm-community-2020.3.3/bin$で ./pycharm.shリターン
起動したら、NewProject ウィンドウの上タブのTools→CreateDesktopEntryで
menuのprogramにPycharmが表示されます。
Pycharmの起動画面
その後、pythonコード編集にはテキスト
エディタを直接使用するかThonnyを使用
するほうが私には便利でした。
JetsonNano評価その2
デモプログラムの編集
Jetson-Inferenceに多くのデモファイルがあります。動画処理性能をアピールする目的だと
思われました。地味ですが静止画の処理も同様に可能です。今回、公開されているpython
コードを編集して、静止画対応のプログラムに編集しました。実用上は静止画処理活用が基本になるように思い、パーサー処理などの余分なコードをはぎ取りました。
Detectnet/Imagenetの静止画対応編集例
Jetpackプログラム編集概要
任意の画像データ(1280×720)から
①Imagenetを使って何の画像かを判別します
(1000分類:googlenetを使用)
②Detectnetを使って画像中の物体を検出します
(21分類:ssd-mobilenet-v2を使用、閾値設定必要)
動作確認に使用したテスト画像
Detectnet.pyの編集
Detectnetの最小限のpythonコード(不要コードの剥ぎ取り)
Imagenet.pyの編集
Imagenetもパーサ部分を除くと同じように簡単に静止画像用に編集可能でした。
プログラム試験環境
Jetson-inference(推論環境)をインストール(済)
今回は、Desktop/TESTJPGフオルダー内で試験しました
Detectnetを最小限pythonコードに編集したプログラムの実行例
主にPerson(人)を検出。中央に画像は検出できていませんが
閾値を下げることでリフト後ろ向きの人を検出できました。
(閾値=0.5:閾値が小さいほど検出感度が高くなります)
Imagenetを最小限pythonコードに編集したプログラムの実行例
画面左上に判別結果と信頼度がオーバーレイ表されています(少し見にくいですが)
Imagenetは景色画像よりも単体画像の認識に有効です。
利用した画像が適切でなかったかもしれません。
Imagenet/Detectnet同時処理プログラム
パーサーなどを省いた編集で気が付いたことは、同じ静止画像を使って同じような推論処理をしているだけなので、入力画像について同時処理を行うプログラムに編集しました。
(感想)
ImagenetとDetectnetのどちらが有益かを考えてみました。
Imagenetは「この写真は何の写真」という問い掛けにこたえてくれるので回答を検索して会話する
ボットとの連動が面白いかもしれません。 実用的かというといま一つのように思いました。
Detectnetは「画像中の物体をバウンディングBOXで囲んで、これは何です」と教えてくれるので
応用用途はImagenetに比べ多いように感じました。
同時処理プログラムをターミナルからコマンド入力し動かす(黄色着色部)
banana@banana-desktop:~/Desktop/TESTJPG$ python3 test04.py
filename: TEST5.JPG
threshold(0~1): 0.6 ←ここは0.5に固定しました
jetson.inference — detectNet loading build-in network ‘ssd-mobilenet-v2’
detectNet — loading detection network model from:
— model networks/SSD-Mobilenet-v2/ssd_mobilenet_v2_coco.uff
— input_blob ‘Input’
— output_blob ‘NMS’
— output_count ‘NMS_1’
— class_labels networks/SSD-Mobilenet-v2/ssd_coco_labels.txt
— threshold 0.600000
— batch_size 1
[TRT] TensorRT version 7.1.3
[image] loaded ‘TEST5.JPG’ (1280×720, 3 channels)
class 0460 – 0.232178 (breakwater, groin, groyne, mole, bulwark, seawall, jetty)
class 0649 – 0.088806 (megalith, megalithic structure)
class 0718 – 0.022461 (pier)
class 0913 – 0.021423 (wreck)
class 0975 – 0.354004 (lakeside, lakeshore)
class 0976 – 0.019974 (promontory, headland, head, foreland)
class 0978 – 0.145264 (seashore, coast, seacoast, sea-coast)
[OpenGL] glDisplay — set the window size to 1280×720
[OpenGL] creating 1280×720 texture (GL_RGB8 format, 2764800 bytes)
[cuda] registered openGL texture for interop access (1280×720, GL_RGB8, 2764800 bytes)
[image] saved ‘OUTITEST5.JPG’ (1280×720, 3 channels)
lakeside, lakeshore 975 0.35400390625
同時処理プログラム(test04.py)の処理結果
JetsonNano評価その3
Detectnetの応用プログラム開発
前回のDetectnetを利用して定点物体検出(センサーとしての利用)を検討します。人、車、自転車、バイクを検出すると画像として保存し、検出しない場合でも1分単位でログデータを蓄積するものです。動作確認用の‘singletest.py’と自動検出用の‘camerasensor.py’を添付します。
前回同様にJetsonNanoのDesktopにcamerasensorフォルダーを置いてそのディレクトリから$python3 camerasensor.py⏎とします。
事前に$pip3でnumpy,matplotlib,datetime,scheduleをインストールしてください。
Imagenet/Detectnet同時処理プログラム(JetsonNano応用その2)
Detectnetの応用プログラム開発(本報告内容)
静止画処理に編集したDetectnetプログラムをベースに定期的に検出プログラムを動かし
物体(今回は4種類限定)の出現数をカウントする監視用のプログラムを作ってみました。
物体検出プログラム simpletest.py
(概要)カメラ撮影し人/車/自転車/バイクの何れかを検出すると4カテゴリ
の検出個数をグラフ表示し画像(タイムスタンプ名)で保存する
定点観察物体検出プログラム camerasensor.py
(概要)scheduleライブラリを使用し、一分間隔で定点観察し、人/車/自転車/バイクの
何れかを検出すると画像(タイムスタンプ名)で保存します。
JetsonNano評価その4
WEBストリーミングカメラ
JetsonNanoはOpenCVライブラリを含むpython環境が整備されておりNvidiaのデモプログラム改造だけでなく画像処理応用に適したマイコンだと思いました。一般的な画像応用
プログラムについての情報が、Interface(2021年1月号)「Python画像処理100」に掲載されており静止画処理だけでなく動画処理用のコードも記載されていました。
そのプログラム集の中から動画配信用のプログラムコード「WebStream.py」をベースに
JetsonNanoに移植し、WebStreaming.pyの動作確認をしました。
次のステップとしてJetsonの特異なDetectNetと組み合わせたWebサーバーのプログラムを開発しようと思いました。
WEbStreamプログラム動作確認システム
WebStream.pyの動作環境設定
WebStreamフォルダー内に以下フォルダーを配置
|__ WebStream.py
|__ index.html
|__ bottle.py
実行はWebStreamのディレクトリで $python3 WebStream.py⏎
OpenCVのインストール:苦労します*
(JetsonNanoの場合)
$git clone https://github.com/JetsonHacksNano/buildOpenCV⏎
$cd buildOpenCV⏎
$./buildOpenCV.sh |&tee openCV_build.log⏎
(Raspaiの場合)
$pip3 install opencv-python⏎ でOK
追加でライブラリをインストールする場合は
$pip3 install opencv-contrib-python⏎ 2時間くらい待つ
bottleはpipでインストールしてもだめなので、フォルダー内にbottle.pyを入れておく
必要に応じて$pip3 install datetime⏎等をインストールします。
WebStream.pyの本体コード
WEBサーバー用プログラム「bottle.py」
JetsonNanoでのWEBストリーミング
ラズパイでのWEBストリーミング実験
PythonコードエディタにはThonny(ラズパイ標準)を動作確認しました
(感想)「WebStreaming.py」はpython環境でOpenCVライブラリがインストールされて
いさいすれば、Windows-PC,JetsonNano,,ラズパイ3B+などで動作することがわか
りました。
定点観察するという目的は達成できますが、人の替わりに「何時。何が、幾つ」カメラ
に映ったのかを圧縮した情報(ログとして)記録する仕組みを作りたいと思いました。
次のステップとしてJetsonの特異なDetectNetと組み合わせたWebサーバーのプログラ
ムを開発しようと思いました。
JetsonNanoの得意なAI(Detctnet等)との組み合わせを行うことでラズパイと一線を
隔せるように思いました。
また、WEBカメラサーバー応用では、pythonにbottleやindex.htmlを加えてコードを
書くよりも、すでにWEBサーバーを基本とするNode-REDなどで十分実現できると
思います。
JetsonNano評価その5
test.py=Detectnet.pyとWebStream.pyの合体
前回はOpenCVをインストールしてWEB_Streamingをする報告でした。その後、DetectNetと組み合わせてWEB_Detecterを検討しましたが断念していました。
今回は再チャレンジです。10秒間隔程度とリアルタイム性には若干乏しいのですが、分類グラフもつけて、WEB表示できるようになりました。
また長年の悩みだった画像キャッシュを処理する方法も判りましたので報告します。
DetectnetとWebサーバーの統合プログラム WEB_Detect(test.py)システム概念図
プログラム(test.py)の起動手順
①WEBサーバーを起動する(web.py)
プロンプト画面で、$cd Desktop/TESTで作業領域に移動し
$python3 web.py でWEBサーバーを起動します。
ブラウザーを起動しlocalhost:8000を開きます。
②本体プログラムを起動する(test.py)
別のプロンプト画面を開いて、$cd Desktop/TESTで作業領域に移動し
$python3 test.py でメインプログラムを起動します。
3分ぐらい待って先ほどのlocalhost:8000を確認します。ブラウザは10秒
間隔で更新作業を行います。メインプログラムのサイクルは18秒間隔と
しています。暫くすると安定して動作を繰り返します。
web.pyを本体(test.py)コードに組み込むと当たり前ですが合体したコードではサーバーのループから抜け出せずメインプログラムは起動しません。ということで、別々に起動する必要があります。
本体プログラム(test.py)
JetsonNanoでの動作状況
JetsonNano評価その6
IoTモニターシステム
以前USB認識できず諦めていた内容
JetsonNanoはカメラを応用したアプリケーションデモが豊富な一方で温度センサー等の地味なセンサーとの接続情報が極めて少ないと感じています。IOは40pinで電源ピン等の配置はラズパイに同じですが、他IOピンは異なります。今回USB経由でのIoTを試験しました。USBがArduino を認識しないためArduinoIDEやNode-REDが使えませんでした。手始めにArduino Nanoを認識できるように設定します。
IoT開発用ソフトウェアの導入(Node-RED)
$ ls -Al /dev/ttyUSB0 ⏎
crw-rw—- 1 root dialout 188, 0 7月 3 16:21 /dev/ttyUSB0 と表示されパーミッション情報
が表示される Arduinoを抜き差しして都度
$ lsusb ⏎で変化するデバイスを確認する。
QinHeng HL-340がドライバーだとわかる。1a86:7523 の2つの情報が必要
$ echo ‘SUBSYSTEM==”tty”, ATTRS{idVendor}==“1a86″, ATTRS{idProduct}==“7523″, MODE=”0666″‘ | sudo tee
/etc/udev/rules.d/50-usb-serial.rules ⏎ ルールを変更してArduinoを認識するようにする
Node-REDによるIoTシステム動作確認
ラズパイで開発したIoTモニターシステムを導入しました。
以前はカメラ画像は動作しましたが、センサーデータは
シリアルを認識せず動作しませんでした。
今回の設定で問題なく動作することが判りました。
実験用Jetson Nano
\7000/台でラズパイ4とほぼ同額。圧倒的な画像処理速度を考えるとお買い
得な製品と思われます。(2021年6月時点)
Jetson Nano4GBは、15K\/台と2倍程度の価格(その後購入)
JetsonNano評価その7
Arduinoとのシリアル接続
ArduinoNanoの接続設定ができたことにより1KHz,2chのADCとの
接続試験を行いました。問題なく動作しました。
通信速度は115200bpsとして逐次ファイル書込方式ではなく文字列バファを使用している
JetsonNano側のプログラムコード
JetsonNano評価その8
Jetson Nano2GBでYOLO動作試験
メインメモリが少ないため、SDカードのスワップ領域を使用するためか、途中でエラーが発生しました。3台中1台にやっとインストールできました。 実行中もバウンディングボックス(枠)がなかなか出てきません。
実行中もSDカード領域とスワップするためだと思います。 画面サイズを640×480にしてみましたが劇的に改善されません。動画速度は6~8fps程度です。
(Tiny YOLOv2の設定手順)
>sudo apt update アップデートしておく
>sudo apt install python3-pip
>sudo apt install protobuf-compiler
>sudo apt install libprotoc-dev
>sudo apt install libjpeg-dev
>sudo apt install cmake 既に済もあるが
>git clone https://github.com/tsutof/tiny-yolov2_onnx_cam
clone先は/home/ユーザー名/でデモフォルダー(jetson-inference)
と同じ場所にtiny-yolov2_onnx_camというフォルダーが生成される
>cd tiny_yolov2_onnx_cam
>export PATH=$PATH:/usr/local/cuda/bin cudaが格納されている場所
>python3 -m pip install –r requirements.txt
requirements.txtにはnumpyや pillowのバージョンが指定されている
ここからは時間が掛かります。途中でエラーが出る場合もあり、
そんな場合は、早いSDSカードを使用するなどが対策として考えられます。
ノーエラーで無事終了したら,USBカメラを使って
>python3 tiny_yolov2_onnx_cam.py
–camera=0 –width=640 –height=480
(感想)
Detectnetと同じ機能を持つYOLOの動作確認を行いました。
感覚的にはDetectnetと同程度の表示スピードで高速になったようには感じられませんでした。
JetsonNano評価その9
JetsonNano2GBでMotion Estimation
(VisionWorks-1.6-Samplesを設定) OpticalFlowに同じ
/usr/share/visionworks/sources の直下にinstall-samples.shがあるので
>/usr/share/visionworks/sources/install-samples.sh
すると/home/ユーザー名/VisionWorks-1.6-Samplesフォルダーが生成される
>cd VisionWorks-1.6-Samples
>make –j4 # add dbg=1 to make debug build
すると/home/ユーザー名/VisionWorks-1.6-Samples/直下にbinフォルダーが
生成される、実行形式は/bin/aarch64/linux/release/直下に11個のデモが生成
>cd /bin/aarch64/linux/release
>./nvx_demo_future_tracker とか
>./nvx_demo_object_tracker_nvxcuで動画デモ可能。自分の動画を解析したい
場合は、上層のdataフォルダーのcars.mp4と入れ替えればOK
>./nvx_demo_motion_estimation は動画ファイルを指定できる
コマンドのあとに –source=動画ファイルのフルパス
(Motion Estimationの試験)
IoTシステムで一日のベランダ風景を動画編集したデータを使用
白い矢印が物体の動きを予測した結果らしいです。
(感想)
OpenCVが提供している「OpticalFlow関数」と同じ機能を持っています。
小区画の画素の移動量を計算しベクトル表示するもので、画像中の移動量(変化量)の
多い部分を判別できます。
JetsonNano評価その10
自前の学習モデルで物体認識(detectnet)の検討
“Jetson Nano2GB開発キット”でAI入門!
100円玉自動集計マシーンの追試 トラ技2021 5月号(P176~179)
物体検出コード my-detection.py の動作確認はOK
csiカメラを前提にコード化されているいるようですので、
一部以下のように書き換えを行いました。
camera=jetson.utils.videoSource(“/dev/video0”)
前回デモのtinyYOLOv2(20分類)と比較して、98分類となっています。
またバウンディングボックスが枠線でなく領域表示です。実行するには、
>jetson-inference>build>aarch64>bin$python3 my-detection.py⏎
バナナで試しましたが当たりませんでした。Bookとなっています。
Docker環境?で動作の確認を行いました。
>jetson-inferenceフォルダー内にdockerフォルダーがあり
>jetson-inference$docker/run.shを行いました。
本によると開発環境が自動構築されるとのことで暫くすると
$ではなく#が現れました。
#my-detection.py⏎すると起動しますがエラーが出ます。
カメラモードがcsiのままでした。
(my-detection.pyを書き換えているにも拘らず)
機械学習コード train_ssd.py はエラーで確認できず
>jetson-inference>build>aarch64>bin$python3 train_ssd.py
–dataset-type=voc –data=data/coin –model-dir=models/coin⏎
残念なことにここでエラーが発生しました。
IndexError:
to many indices for array is 1-dimensional,but 2 were indexed
トラ技のとおりにフォルダーを作りコインの画像を集めたので
すがエラーを起こします。5回くらいトライしましたが残念です。
なので以下は未確認
ONNX出力コード onnx_export.py.py
ONNXを使用した100円玉検出・カウントコード
detection.py (記事著者がdetectnet.pyを改造したコード)
その後、detectorとして「yolov5」がリリースされたので、windowsベースで
自前学習を行うことで推論モデルを作ることができ、現在ではdetectnetは使わなくなりました。
JetsonNano応用の最後に、ラズパイ4と同じようにSDカード起動から
SSD(USB)起動ができるようになっています。
速度と容量の制約が改善されますので、以下の情報を参考にしてください。
(追加情報:重要)
USB_SSD起動
JetPack(4.5.1)をEtcherでSSDに書き込んでおいて、一旦SDカードで立ち
上げSSD中の/boot/extlinux/extlinux.confの一部を書き換えるだけです。
書き換えるところは、dev/mmcblk0p1→dev/sda1 これだけ
1. JetPack4.5(4.5.1)を予めSSDにbalenaEtcherで書き込む
(スピードが遅い場合やSATA変換とSSD相性でNGになる場合があり)
2. SDカードで立ち上げてUSB3.0にSSD接続
/boot/extlinux/extlinux.confのディレクトリまで行き
$sudo vi extlinux.conf⏎ (注nanoは使えない)
ファイル中の dev/mmcblk0p1 (SDカード) を
dev/sda1 (USBデバイス)に変更
ESCキーを押し編集モードを出て、:w⏎ (上書) :q⏎ (終了)する。
3. HDMI端子に近いUSB端子にSSDを接続し電源を入れる。
(うまく立ち上がらない場合は他のUSB端子に)