みなさんこんにちわ、こんばんわ。

SAIです。

 

お仕事やら夏バテやらで飛び飛びです。

 

今日は、JupiterNoteBookで画像認識をしてみましょう。

 

今日のソースも、Nvidiaの「Getting Started with AI on Jetson Nano」です。

 

 

 

またまたCSIカメラを使いますので接続しておきましょう。

 

 

CSIカメラを繋いだ状態で、JupiterNoteBookを起動し、

classification を動かしてみましょう!

 

1.classificationを開く

 

JupiterNotebookを起動したら以下のようなフォルダ構成が見えると思います。

classificationというフォルダがありますね。

これを開きます。

 

↓こんな画面が見れると思います。

 

 

今回は、コードの説明はとりあえず省略します。

画像認識の学習がメインです。

 

が、CSIカメラを使う場合はちょっとやることがあります。

 

2.SCIカメラ用にコードを改変する

 

JupiterNotebookを初めて実行するときは、

とりあえず実行ボタンをポチポチしてみるのがいいと思います。

 

が、ClassificationではUSBカメラがデフォルトになっているようです。

 

コードを実行する前に、CSIカメラが使えるようにコードを改変しちゃいましょう。

for USB の部分のコードが有効化されていて、

for CSI の部分のコードが[#]で無効化されています。

 

USBカメラをコメントアウトして、CSIカメラの部分を有効にしましょう!

 ↓

 

オブジェクトは 同じ camera に格納されるので、修正はここだけでOKです。

 

ちなみにJupiterNotebookは、左上に保存ボタンがありますね。

しかし、、

JupiterNotebookを動かす環境はDockerContainerで実行しています。

 

ということは・・・

保存したところで次回DockerContainerを起動したら消されちゃいます。

 

毎回、コードを修正しなければならない点に注意しましょう。

 

 

3.カメラオブジェクトが生成できるか実行してみよう

 

実行は、↓この赤枠の▶をポチポチするか、

キーボードショートカット: [SHIFT][ENTER] で実行できます。

 

今回も、Notebookの先頭からポチポチしてみよう。

 

 

無事、カメラが生成できました!

 

4.画像認識するモデル名と認識名を作る

 

次のコードは、画像認識に使うtask (認識モデル名?)と categories(認識候補)

そして  データセットを定義しています。

 

例題は、

Thumbs は、親指の上下を認識させるモデル名ですね。(赤線)

候補は、thumbs_up と thambs_down 

つまり、グッと ブー ですね。

 

 

今回はそのまま実行します。

 

他に、

・emotions で 平然、嬉しい、悲しい、怒り を認識

・fingers(指)で、1本、2本、3本、4本、5本

というのがありますね。

 

グッと ブー がうまくいったら「#」を切り替えて試してみると良いと思います。

 

 

4.画像認識をさせる画面について

 

JupiterNotebookをポチポチ進めていくと、以下の画面まで進みます。

 

ここで写真を撮影して、学習をしますよ!

 

 

赤い線の場所が、学習をするための教師画像(学習に使う画像)を撮影する場所です。

青い線の場所が、学習を実行するためのパラメータと進捗です。

緑は・・・うまく使えないんですが、学習モデルのロードとセーブの様です。

 

学習がうまくできた後は、カメラで撮影した画像の状態によって、

右上の認識率が変わりますよ!

 

それでは、実際に教師画像を撮影しよう!

 

 

ちなみに、JupiterNotebookにも説明がありますが、、英語ですね。

こっちのほうが正しいと思いますので、一応読んでみてね。

 

 

 

5.教師画像の撮影

 

今回はグッと ブー を覚えさせますよ!

 

まずは、グッ を覚えますね。

 

自分の指を グッ にして、少し角度を変えたり、遠くしたり近くしたり。

20枚程度撮影しましょう。

多ければ多いほうがいいですが、

多ければ学習に時間がかかっちゃうよ。

 

 

categoryを [thumbs_up] にして、add で写真を撮りましょう。

1枚とると、 count が1づつ上がります。

20枚程度撮ったら、
categoryを [thumbs_down] にして、また20枚程度の写真を撮りましょう。

 

 

6.モデルの学習(教師あり学習)

 

写真が撮影出来たら、AIによる学習をする番です。

 

学習は↓ここで実行します。

 

 

学習する前に epochs の数値を10とか20に変更しましょう。

 

epochsは、畳み込み学習の階層です。

epochs が多ければ沢山学習するので認識率が上がります。

 

が、あまり多すぎると過学習になるようですので、

最初は10とか20がいいと思います。

 

そして、train をポチっと押しましょう!

 

学習が開始されます!

 

学習がススムとprogressバーが伸びます。

 

epochsは、学習すると残りのepoch数に減算で進んでいくようですよ。

そして、学習率がloss とaccuracy が進んでいきます。

 

Jetson  Nanoだと、学習完了まで10分以上かかりますね。

テレビでも見ながらしばらく待ちましょう。

 

そういえば、JetsonNanoだと、熱がひどいです。

 

学習する際は必ずファンを付けて冷却しましょうね!

 

 

7.画像認識で、認識率をチェック

 

学習が終わったら、カメラの撮影している画像に従って、

右の[thumbs_up] と [thumbs_down] のバーが上下します。

 

 

学習がうまくいったら、指の認識が何%になっているかが見れますよ!

 

 

色々試してみてくださいね。

 

JupiterNotebookは、結構わかりやすいので自信がつきます。

今後、コマンドラインからの学習しますが、、、、

SAIは失敗が続いたりすると、自信を取り戻すためにこのJupiterNotebookを動かしたりしてます。

 

 

ちなみに、

1万枚位画像があると、Jetson Nanoだと半日以上かかるので・・・・

本気の学習をJetsonNanoで実施するのは無理がありそうです。

 

JetsonNanoは、機械学習の実行用という位置づけが良さそう。

 

7.番外.トラブルシューティング(写真を撮りミス!)

 

間違った写真を撮っちゃった!

 

そんな場合の対処方法

 

JupiterNotebookで撮影した画像は、data フォルダ内に保存されています。

 

/data/classification/thambs_A/~のフォルダに保存されています。

 

 

写真をみて間違ったものを削除しましょう。

 

もし、学習がうまくいかないときは、間違った画像があるのかもしれません。

上手くいかないときは、チェックしてみてはどうかな?

 

 

 

 

それでは今日はこの辺で。

 

◆目次へ戻る◆

 

 

 

 

 

 

みなさんこんにちわ、こんばんわ。

SAIです。

 

今日はJupiterNoteBookでカメラを動かしてみます。

シングルボードコンピュータでデバイスを使うのは難しそうですが、

JupiterNoteBookを使うと、各コードの意味を理解しながら動かすことができますよ!

 

それでは、

今日のソースも、Nvidiaの「Getting Started with AI on Jetson Nano」です。

 

 

 

今日はCSIカメラを使います。

(ちなみにUSBカメラでもOKですが、コマンドが違います)

 

 

 

CSIカメラを繋いだ状態で、JupiterNoteBookを起動し、

Hello_Cameraを動かしてみましょう!

 

1.Hello_cameraを開く

 

JupiterNotebookを起動したら以下のようなフォルダ構成が見えると思います。

Hello_cameraというフォルダがありますね。

 

 

これを開きます。

 

↓こんな画面が見れると思います。

 

 

右半分がノートブックですね!

 

JupiterNotebookでは、ノートに記載しているコマンドをステップ実行できるようです。

 

 

2.Hello_cameraを実行する

 

初めて実行するときは、とりあえず実行ボタンをポチポチしてみるのがいいと思います。

そのうえで、改めてコマンドの意味を考えてみましょう。

 

実行は、↓この赤枠の▶をポチポチするか、

 

キーボードショートカット: [SHIFT][ENTER] で実行できます。

 

実行すると、結果が下に表示されます

 

 この↓の絵の、 res のところが結果ですね。

 

こんな感じでポチポチしていくと、[6]のところでカメラで撮影した画像が実行できますよ!

 

 

 

3.JupiterNotebookの小技

 

ここでJupiterNotebookの小技です。

実行結果がノートの途中に表示されます。

 

しかし、続けて実行していくと表示結果が上の方に行って見えなくなりますよね。

 

そんなときの小技

右クリックで「Create New Ciew Output」でサブウィンドウ化!

 

 

クリックすると、

 

 

下、もしくは横に別画面が表示されます。

 

こうすれば、Notebookが進んでも画面の表示が見続けられます!

 

さて、カメラ画像が表示できたでしょうか?

 

4.JupiterNotebookのカメラ起動の詳細

 

 

コマンドを見てみましょう。

(JupiterNotebookの説明をするだけですが。)

 

各コマンドはPythonで書かれているようです。

 

◆まずは1コマンド目

 

!ls -ltrh /dev/video*

 

Jetson Nano 上のすべてのビデオ デバイスを一覧表示します。 

SAIのJetsonはこんな応答になりました。

 

 crw-rw---- 1 root video 81, 0 Aug 14 12:25 /dev/video0

 

video0 が割り当てられていますね。

 

◆次は2コマンド目

 

from jetcam.csi_camera import CSICamera
camera = CSICamera(width=224, height=224, capture_device=0) 

# confirm the capture_device number
 

1行目で CSICamera クラスをインポートし、

2行目でカメラ オブジェクトを作成しています。

 

CSICamera()の引数を見ると、

高さ224、横幅224でカメラオブジェクトを生成していますね。

CSICamera インスタンスは 1 つだけ作成できています。

 

◆次は3コマンド目

 

image = camera.read()
print(image.shape)

 

2コマンド目で作ったcamera インスタンスから、Read()により画面をキャプチャしてます。

Shapeをプリントしています。

結果は以下の通り、イメージサイズが表示されていますね。

 

 

◆次は4コマンド目

print(camera.value.shape)

 

これも似たような出力ですね。

カメラの値を直接見ても、Shapeは同じですね。

 

◆次は5コマンド目

 

import ipywidgets
from IPython.display import display
from jetcam.utils import bgr8_to_jpeg

image_widget = ipywidgets.Image(format='jpeg')
image_widget.value = bgr8_to_jpeg(image)
display(image_widget)

 

1行目でウィジェット関連をインポート

2行目でDisplayをインポート

3行目はrgbからJpegに変換する処理のインポート

4行目は、Jpegイメージを生成

5行目は、3コマンド目で作ったimageからJpegへ変換する処理ですね。

6行目で、Wiget画像を画面に表示します。

 

はい、うちの猫が映りました。

 

不貞寝していますね。

 

このようにして画像を撮影する形になるようですよ!

 

この段階では、写真は1枚取れただけですね。

 

次は、カメラで撮影した画像を連続的に表示するパターンです。

 

◆次は6コマンド目

camera.running = True

def update_image(change):
    image = change['new']
    image_widget.value = bgr8_to_jpeg(image)

camera.observe(update_image, names='value')

 

連続的に表示する処理だというのは判るのですが、

実はこのコードにはSAIは自信が無いです。

 

1行目は・・・すみません詳しくは判りません。

   カメラを常時動作にする設定だと思います。

   おそらく、camera.observerを連続して更新できるようにする処理かな?

 

2行目から4行目は、update_image()という関数を作っています。

中では、新しいimageを取得してimage_Widgetのデータを更新しています。

 

5行目では、camera.observerでupdate_imageを呼び出して更新し続ける形になってるようです。

 

というわけで、このコマンドを呼ぶと連続的にWidgetイメージが更新され続けます。

カメラを動かすと、先程表示していたwidget画像が追従しますね。

 

 

◆次は7コマンド目

camera.unobserve(update_image, names='value')

 

連続実行の処理を停止する処理です。

 

observerをリリースしているイメージですね。

 

 

◆8コマンド目は、別の画像表示する方法とのことです。

traitlets メソッドを使用すると、カメラをwidgetに接続する方法だそうです。

 

import traitlets

camera_link = traitlets.dlink((camera, 'value'), (image_widget, 'value'), transform=bgr8_to_jpeg)


1行目は traitlets をインポート

2行目は、traitlets を使ってリンクしている処理だそうです。

 

解除するには

camera_link.unlink()

もう一回接続するには

camera_link.link()

とのことです。

 

今後自分の好きな処理を作るときには、

上記のようなコードを書けばいいのですね!

 

◆さいごに

処理が終わった後は、リソースの解放を忘れてはいけませんね。

最後に必ず以下の処理を行いましょう。

次、新しい処理をしたくても、リソース接続中としてリークが発生しちゃいますよ!

 

camera.running = False
camera.cap.release()


 

というわけで、今回はHello_Cameraの解説でした。

 

ちなみに、USBカメラもソースはほぼ同じですね。

 

cameraの作り方が、CSIカメラだったのがUSBカメラになる感じですね。

 

 

それでは今日はこの辺で。

 

◆目次へ戻る◆

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

みなさんこんにちわ、こんばんわ。

SAIです。

 

これから、JupiterNoteBookを動かしてみたいと思います。

 

JupiterNoteBookは、SSHを使います。

 

SSHのやり方は、↓この通り

 

 

JupiterNotebookは、Nvidiaの以下URLよりコース登録ができます。

のはずなんですが、コーススタートのボタンが見えないんですよね。

 

ここでまた大混乱しますよね。

英語版で覚えるしかなさそうです。

英語版はこちらで、ここならボタンがありますよ

 

 

 

JupiterNotebookは、JetsonNanoの中で 「JupyterLab Server」を立ち上げ、

WindowsPCからHTTP接続するイメージになります。

 

1.SSH接続する

 

USB接続だとSSH接続はこんな感じですね。

ssh <username>@192.168.55.1

 

 

2.コースのデータ ディレクトリを追加

 

しばらくは初回のみのコマンドです。

まずはJupiterNotebook動作用のディレクトリを作成します。

(Windowsでいうところのフォルダ作成)

mkdir -p ~/nvdli-data

 

3.再生可能スクリプトの生成

 

詳細は聞かないでください。

おまじないとして以下コマンドを打ち込みます。

# create a reusable script
echo "sudo docker run --runtime nvidia -it --rm --network host \
    --volume ~/nvdli-data:/nvdli-nano/data \
    --device /dev/video0 \
    nvcr.io/nvidia/dli/dli-nano-ai:v2.0.2-r32.7.1" > docker_dli_run.sh

 

他にオプションがあって、CSIカメラを使うときは、

--volume /tmp/argus_socket:/tmp/argus_socket

 

オプションで、2GB版Jetsonを使うときは、メモリ増加コマンドを追加するそうです。

--memory=500M --memory-swap=4G 

 

↓こんな感じで追加するそうです。

 

 

というわけで、SAIもコマンドを打ち込んでみます。

 

4.スクリプトのアクセス権の変更

 

Dockerコンテナを起動可能にするために、アクセス権を変更します。

これをしないと多分うまくいかないかも。。

chmod +x docker_dli_run.sh

 

 

5.スクリプトの実行

最後に、スクリプトを実行します。

./docker_dli_run.sh

 

初回の起動では、いろいろなものがDLされるため、非常に時間がかかります。

夜に実行して、朝まで待つ感じですね。

1回DLしてしまえば、次からは速攻起動できるようになります。

 

 

 

ひたすら待つと、DockerContainerが起動します。

 

2回目以降は、このように一瞬で起動しますよ!

 

6.JupiterNotebookへアクセス

JupiterNotebookへアクセスしますよ!

アクセスは簡単で、ここを Ctrl+クリック です!

 

 

7.JupiterNotebookへログイン

JupiterNotebookへアクセスするとパスワードが求められます。

パスワードは、URLの横に表示されている文字列です。

dlinano

ですね。

 

 

 

アクセスは簡単で、ここをクリックです!

 

無事アクセス成功すると、

↓こんな画面が表示されますよ!

 


 

 

番外.トラブルシューティング

(JupiterServerが立ち上がらない)

 

SAIが初めてJetsonを使用した際には、実はJupiterNotebookへアクセス失敗しました。

 

理由はどうも、当時のJetsonの標準インストーラではだめだったみたい?

JetsonのSDイメージインストール段階で、

アクセス可能なJetPackからインストールしないとダメだった模様。。

 

当時は、悪あがきをして起動させました。

以下サイトを参考に対処です。

Jetson NanoでJupyter labを外部からアクセスできるようにインストールする - Qiita

 

まずは、中身をアップデート

 

sudo apt-get update 
sudo apt-get upgrade

 

JetsonNanoのSDKをインストールしたら、ターミナルを立ち上げ

JupiterLabをアップデートしました。

 

sudo apt install nodejs npm 
sudo apt install python3-pip 
sudo pip3 install jupyter jupyterlab

 

jupyter labのインストールでエラーが出た場合は、次を実行

 

sudo apt-get install build-essential libssl-dev libffi-dev python-dev

 

JupyterNotebookの設定ファイルを生成する

jupyter notebook --generate-config

 

設定ファイルの編集をする

sudo vi /home/sai/.jupyter/jupyter_notebook_config.py
Writing default config to: /home/sai/.jupyter/jupyter_notebook_config.py

 

 

エディタ上で、/を押して「/c.NotebookApp.allow_origin」を検索します。

 

そして、自己サーバーにアクセス許可設定するため、以下コメントを外します。

 

######c.NotebookApp.allow_origin = '*'

c.NotebookApp.allow_origin = '*'

 

同様に、「c.NotebookApp.ip」を検索します。

 

#####c.NotebookApp.ip = 'localhost'

c.NotebookApp.ip = '0.0.0.0'
に変更します。

 

同様にローカルでブラウザを立ち上げないようにします。TrueからFalseに変更。

c.NotebookApp.open_browser = False

 

:xを実行しviを終了します。

 

jupyterのパスワードを設定します。設定ファイルにハッシュが入ります。

jupyter notebook password 
[NotebookPasswordApp] Wrote hashed password to /home/takeo/.jupyter/jupyter_notebook_config.json
 

jupyterを起動します。

 

jupyter lab

 

これで、再度Dockerを実行すると、JupiterServerが起動しました!

 

番外.トラブルシューティング

iPythonがインストールされていない

 

これは ipythonをインストールすれば解決ですね。

 

sudo pip3 install ipython==7.9.0

※インストールするときは権限に注意しよう。

chromium-browser --no-sandbox
 

 

 

それでは今日はこの辺で。

 

◆目次へ戻る◆